示例#1
0
        static void GetMessageOpcodes(Mem32 m)
        {
            _gameMessageLookUp = new Dictionary <int, GameMessageInfo>();

            var func        = m[OpcodeSwitch_Address];
            int maxOpcode   = func[0x1B].Int32 + 1;
            int jaOffset    = func[0x21].Int32;
            int defaultCase = func.Offset + 0x25 + jaOffset;
            var switchTable = func[0x28].Ptr;

            for (int i = 0; i < maxOpcode; i++)
            {
                int caseOffset = switchTable[i * 4].Int32;
                if (caseOffset == defaultCase)
                {
                    continue;
                }

                int offTypeDescriptor = m[caseOffset + 2].Ptr.Int32;
                int size   = m[caseOffset + 13].Int32;
                int opcode = i + 1;

                GameMessageInfo gmi;
                if (_gameMessageLookUp.TryGetValue(offTypeDescriptor, out gmi))
                {
                    if (gmi.Size != size)
                    {
                        throw new Exception("Size mismatch.");
                    }
                }
                else
                {
                    gmi        = new GameMessageInfo();
                    gmi.Offset = offTypeDescriptor;
                    gmi.Size   = size;
                    _gameMessageLookUp.Add(offTypeDescriptor, gmi);
                }
                gmi.Opcodes.Add(opcode);
            }
        }
示例#2
0
        static void GetMessageOpcodes(Mem32 m)
        {
            _gameMessageLookUp = new Dictionary<int, GameMessageInfo>();

            var func = m[OpcodeSwitch_Address];
            int maxOpcode = func[0x1B].Int32 + 1;
            int jaOffset = func[0x21].Int32;
            int defaultCase = func.Offset + 0x25 + jaOffset;
            var switchTable = func[0x28].Ptr;
            for (int i = 0; i < maxOpcode; i++)
            {
                int caseOffset = switchTable[i * 4].Int32;
                if (caseOffset == defaultCase)
                    continue;

                int offTypeDescriptor = m[caseOffset + 2].Ptr.Int32;
                int size = m[caseOffset + 13].Int32;
                int opcode = i + 1;

                GameMessageInfo gmi;
                if (_gameMessageLookUp.TryGetValue(offTypeDescriptor, out gmi))
                {
                    if (gmi.Size != size)
                        throw new Exception("Size mismatch.");
                }
                else
                {
                    gmi = new GameMessageInfo();
                    gmi.Offset = offTypeDescriptor;
                    gmi.Size = size;
                    _gameMessageLookUp.Add(offTypeDescriptor, gmi);
                }
                gmi.Opcodes.Add(opcode);
            }

        }