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); } }
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); } }