From 909c44b6796284b2e86608fa82b99751b18a9285 Mon Sep 17 00:00:00 2001 From: MS Date: Thu, 18 Jan 2024 08:34:14 -0500 Subject: [PATCH] reccmp: vtable comparison (#452) * Add vtable comparison to reccmp * Add missing scalar deleting destructors * Fix some vtables --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/act1state.h | 3 + LEGO1/lego/legoomni/include/act2brick.h | 3 + .../lego/legoomni/include/act2policestation.h | 3 + LEGO1/lego/legoomni/include/act3.h | 3 + LEGO1/lego/legoomni/include/act3shark.h | 3 + LEGO1/lego/legoomni/include/act3state.h | 3 + LEGO1/lego/legoomni/include/ambulance.h | 3 + .../legoomni/include/ambulancemissionstate.h | 3 + LEGO1/lego/legoomni/include/animstate.h | 3 + .../lego/legoomni/include/beachhouseentity.h | 3 + LEGO1/lego/legoomni/include/bike.h | 3 + LEGO1/lego/legoomni/include/buildingentity.h | 3 + LEGO1/lego/legoomni/include/bumpbouy.h | 3 + LEGO1/lego/legoomni/include/carrace.h | 3 + LEGO1/lego/legoomni/include/carracestate.h | 3 + LEGO1/lego/legoomni/include/doors.h | 3 + LEGO1/lego/legoomni/include/dunebuggy.h | 3 + LEGO1/lego/legoomni/include/elevatorbottom.h | 3 + LEGO1/lego/legoomni/include/gasstation.h | 3 + .../lego/legoomni/include/gasstationentity.h | 3 + LEGO1/lego/legoomni/include/gasstationstate.h | 3 + LEGO1/lego/legoomni/include/gifmanager.h | 14 +- LEGO1/lego/legoomni/include/helicopterstate.h | 3 + LEGO1/lego/legoomni/include/historybook.h | 3 + LEGO1/lego/legoomni/include/hospital.h | 3 + LEGO1/lego/legoomni/include/hospitalentity.h | 3 + LEGO1/lego/legoomni/include/hospitalstate.h | 3 + LEGO1/lego/legoomni/include/infocenter.h | 3 + LEGO1/lego/legoomni/include/infocenterdoor.h | 3 + .../lego/legoomni/include/infocenterentity.h | 3 + LEGO1/lego/legoomni/include/infocenterstate.h | 3 + LEGO1/lego/legoomni/include/isle.h | 3 + LEGO1/lego/legoomni/include/jetski.h | 3 + LEGO1/lego/legoomni/include/jetskiracestate.h | 3 + LEGO1/lego/legoomni/include/jukebox.h | 3 + LEGO1/lego/legoomni/include/jukeboxentity.h | 3 + LEGO1/lego/legoomni/include/jukeboxstate.h | 3 + .../legoomni/include/lego3dwavepresenter.h | 3 + LEGO1/lego/legoomni/include/legoact2.h | 5 +- LEGO1/lego/legoomni/include/legoact2state.h | 3 + .../legoomni/include/legoanimationmanager.h | 3 + .../legoomni/include/legoanimmmpresenter.h | 3 + .../legoomni/include/legobuildingmanager.h | 3 + LEGO1/lego/legoomni/include/legocachesound.h | 3 + LEGO1/lego/legoomni/include/legocarbuild.h | 3 + .../include/legocarbuildanimpresenter.h | 3 + .../lego/legoomni/include/legocarraceactor.h | 3 + .../legoomni/include/legocontrolmanager.h | 3 + .../legoomni/include/legoentitypresenter.h | 3 + .../include/legoflctexturepresenter.h | 3 + .../lego/legoomni/include/legoinputmanager.h | 3 + LEGO1/lego/legoomni/include/legojetski.h | 3 + .../legoomni/include/legojetskiraceactor.h | 3 + .../include/legolocomotionanimpresenter.h | 3 + .../legoomni/include/legomodelpresenter.h | 3 + .../lego/legoomni/include/legonavcontroller.h | 3 + .../lego/legoomni/include/legoobjectfactory.h | 3 + LEGO1/lego/legoomni/include/legoomni.h | 3 + .../legoomni/include/legopalettepresenter.h | 3 + .../lego/legoomni/include/legopartpresenter.h | 3 + LEGO1/lego/legoomni/include/legopathactor.h | 3 + .../legoomni/include/legopathcontroller.h | 8 +- .../legoomni/include/legopathcontrollerlist.h | 3 + .../lego/legoomni/include/legopathpresenter.h | 3 + .../legoomni/include/legophonemepresenter.h | 3 + .../lego/legoomni/include/legoplantmanager.h | 3 + LEGO1/lego/legoomni/include/legorace.h | 3 + LEGO1/lego/legoomni/include/legoraceactor.h | 3 + LEGO1/lego/legoomni/include/legoracecar.h | 3 + .../lego/legoomni/include/legosoundmanager.h | 3 + LEGO1/lego/legoomni/include/legostate.h | 3 + .../legoomni/include/legotexturepresenter.h | 3 + .../legoomni/include/legovehiclebuildstate.h | 3 + LEGO1/lego/legoomni/include/legoworld.h | 3 + LEGO1/lego/legoomni/include/legoworldlist.h | 9 ++ .../legoomni/include/legoworldpresenter.h | 3 + LEGO1/lego/legoomni/include/motocycle.h | 3 + .../include/mxbackgroundaudiomanager.h | 3 + .../legoomni/include/mxtransitionmanager.h | 3 + LEGO1/lego/legoomni/include/pizza.h | 3 + .../lego/legoomni/include/pizzamissionstate.h | 3 + LEGO1/lego/legoomni/include/pizzeria.h | 3 + LEGO1/lego/legoomni/include/pizzeriastate.h | 3 + LEGO1/lego/legoomni/include/police.h | 3 + LEGO1/lego/legoomni/include/policeentity.h | 3 + LEGO1/lego/legoomni/include/policestate.h | 3 + LEGO1/lego/legoomni/include/racecar.h | 3 + .../lego/legoomni/include/racestandsentity.h | 5 +- LEGO1/lego/legoomni/include/racestate.h | 3 + LEGO1/lego/legoomni/include/radio.h | 3 + LEGO1/lego/legoomni/include/radiostate.h | 3 + .../lego/legoomni/include/registrationbook.h | 3 + LEGO1/lego/legoomni/include/scorestate.h | 3 + LEGO1/lego/legoomni/include/skateboard.h | 3 + LEGO1/lego/legoomni/include/towtrack.h | 3 + .../legoomni/include/towtrackmissionstate.h | 3 + LEGO1/lego/legoomni/src/common/gifmanager.cpp | 6 + .../legoomni/src/paths/legopathcontroller.cpp | 10 +- LEGO1/lego/sources/3dmanager/lego3dmanager.h | 3 + LEGO1/lego/sources/roi/legoroi.h | 3 + LEGO1/library_msvc.h | 3 + LEGO1/mxdirectx/mxdirect3d.h | 3 + LEGO1/mxdirectx/mxdirectdraw.h | 3 + LEGO1/omni/include/mxaudiomanager.h | 3 + LEGO1/omni/include/mxbitmap.h | 3 + LEGO1/omni/include/mxcore.h | 3 + LEGO1/omni/include/mxdsaction.h | 3 + LEGO1/omni/include/mxdsactionlist.h | 3 + LEGO1/omni/include/mxdsanim.h | 3 + LEGO1/omni/include/mxdsbuffer.h | 3 + LEGO1/omni/include/mxdschunk.h | 3 + LEGO1/omni/include/mxdsevent.h | 3 + LEGO1/omni/include/mxdsfile.h | 3 + LEGO1/omni/include/mxdsmultiaction.h | 3 + LEGO1/omni/include/mxdsobject.h | 3 + LEGO1/omni/include/mxdsobjectaction.h | 3 + LEGO1/omni/include/mxdsselectaction.h | 3 + LEGO1/omni/include/mxdsserialaction.h | 3 + LEGO1/omni/include/mxdssound.h | 3 + LEGO1/omni/include/mxdsstill.h | 3 + LEGO1/omni/include/mxdsstreamingaction.h | 3 + LEGO1/omni/include/mxentity.h | 3 + LEGO1/omni/include/mxeventmanager.h | 3 + LEGO1/omni/include/mxeventpresenter.h | 3 + LEGO1/omni/include/mxflcpresenter.h | 3 + LEGO1/omni/include/mxloopingflcpresenter.h | 3 + LEGO1/omni/include/mxmediamanager.h | 3 + LEGO1/omni/include/mxmediapresenter.h | 3 + LEGO1/omni/include/mxmidipresenter.h | 3 + LEGO1/omni/include/mxmusicmanager.h | 3 + LEGO1/omni/include/mxmusicpresenter.h | 3 + LEGO1/omni/include/mxnextactiondatastart.h | 3 + LEGO1/omni/include/mxnotificationmanager.h | 3 + LEGO1/omni/include/mxobjectfactory.h | 3 + LEGO1/omni/include/mxomni.h | 3 + LEGO1/omni/include/mxomnicreateparam.h | 3 + LEGO1/omni/include/mxpalette.h | 3 + LEGO1/omni/include/mxpresenter.h | 3 + LEGO1/omni/include/mxpresenterlist.h | 3 + LEGO1/omni/include/mxregion.h | 3 + LEGO1/omni/include/mxregionlist.h | 6 + LEGO1/omni/include/mxsmkpresenter.h | 3 + LEGO1/omni/include/mxsoundpresenter.h | 3 + LEGO1/omni/include/mxstreamchunklist.h | 3 + LEGO1/omni/include/mxstring.h | 3 + LEGO1/omni/include/mxstringlist.h | 3 + LEGO1/omni/include/mxthread.h | 6 + LEGO1/omni/include/mxticklemanager.h | 3 + LEGO1/omni/include/mxtimer.h | 3 + LEGO1/omni/include/mxvariabletable.h | 6 + LEGO1/omni/include/mxvideomanager.h | 3 + LEGO1/omni/include/mxvideopresenter.h | 6 + LEGO1/omni/include/mxwavepresenter.h | 3 + LEGO1/realtime/matrix.h | 2 +- LEGO1/realtime/roi.h | 3 + LEGO1/tgl/tgl.h | 30 ++++ LEGO1/viewmanager/viewlodlist.h | 3 + LEGO1/viewmanager/viewmanager.h | 3 + tools/isledecomp/isledecomp/compare/core.py | 129 ++++++++++++++++-- tools/isledecomp/isledecomp/compare/db.py | 22 ++- tools/reccmp/reccmp.py | 14 +- 161 files changed, 679 insertions(+), 34 deletions(-) diff --git a/LEGO1/lego/legoomni/include/act1state.h b/LEGO1/lego/legoomni/include/act1state.h index 84537e88..82e95f63 100644 --- a/LEGO1/lego/legoomni/include/act1state.h +++ b/LEGO1/lego/legoomni/include/act1state.h @@ -29,6 +29,9 @@ class Act1State : public LegoState { void FUN_10034d00(); + // SYNTHETIC: LEGO1 0x10033960 + // Act1State::`scalar deleting destructor' + protected: undefined m_unk0x8[0x10]; // 0x8 MxU32 m_unk0x18; // 0x18 diff --git a/LEGO1/lego/legoomni/include/act2brick.h b/LEGO1/lego/legoomni/include/act2brick.h index 10665c40..5eb697ed 100644 --- a/LEGO1/lego/legoomni/include/act2brick.h +++ b/LEGO1/lego/legoomni/include/act2brick.h @@ -25,6 +25,9 @@ class Act2Brick : public LegoPathActor { { return !strcmp(p_name, Act2Brick::ClassName()) || LegoEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1007a450 + // Act2Brick::`scalar deleting destructor' }; #endif // ACT2BRICK_H diff --git a/LEGO1/lego/legoomni/include/act2policestation.h b/LEGO1/lego/legoomni/include/act2policestation.h index 887ab542..4746236f 100644 --- a/LEGO1/lego/legoomni/include/act2policestation.h +++ b/LEGO1/lego/legoomni/include/act2policestation.h @@ -21,6 +21,9 @@ class Act2PoliceStation : public LegoEntity { { return !strcmp(p_name, Act2PoliceStation::ClassName()) || LegoEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f610 + // Act2PoliceStation::`scalar deleting destructor' }; #endif // ACT2POLICESTATION_H diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index 76c9722b..053bde82 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -27,6 +27,9 @@ class Act3 : public LegoWorld { inline void SetUnkown420c(MxEntity* p_entity) { m_unk0x420c = p_entity; } inline void SetUnkown4270(MxU32 p_unk0x4270) { m_unk0x4270 = p_unk0x4270; } + // SYNTHETIC: LEGO1 0x10072630 + // Act3::`scalar deleting destructor' + protected: undefined m_unk0xf8[0x4114]; // 0xf8 MxEntity* m_unk0x420c; // 0x420c diff --git a/LEGO1/lego/legoomni/include/act3shark.h b/LEGO1/lego/legoomni/include/act3shark.h index 611cbc38..e6910cdb 100644 --- a/LEGO1/lego/legoomni/include/act3shark.h +++ b/LEGO1/lego/legoomni/include/act3shark.h @@ -12,6 +12,9 @@ class Act3Shark : public LegoAnimActor { // STRING: LEGO1 0x100f03a0 return "Act3Shark"; } + + // SYNTHETIC: LEGO1 0x10043020 + // Act3Shark::`scalar deleting destructor' }; #endif // ACT3SHARK_H diff --git a/LEGO1/lego/legoomni/include/act3state.h b/LEGO1/lego/legoomni/include/act3state.h index dca6c3ea..c88c4620 100644 --- a/LEGO1/lego/legoomni/include/act3state.h +++ b/LEGO1/lego/legoomni/include/act3state.h @@ -24,6 +24,9 @@ class Act3State : public LegoState { virtual MxBool VTable0x14() override; + // SYNTHETIC: LEGO1 0x1000e3c0 + // Act3State::`scalar deleting destructor' + private: // FIXME: May be part of LegoState? Uncertain... MxU32 m_unk0x08; diff --git a/LEGO1/lego/legoomni/include/ambulance.h b/LEGO1/lego/legoomni/include/ambulance.h index 3bc80212..7c54561a 100644 --- a/LEGO1/lego/legoomni/include/ambulance.h +++ b/LEGO1/lego/legoomni/include/ambulance.h @@ -22,6 +22,9 @@ class Ambulance : public IslePathActor { return !strcmp(p_name, Ambulance::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10036130 + // Ambulance::`scalar deleting destructor' + private: // TODO: Ambulance fields undefined m_unk0x160[4]; diff --git a/LEGO1/lego/legoomni/include/ambulancemissionstate.h b/LEGO1/lego/legoomni/include/ambulancemissionstate.h index a09bf117..cdfa608b 100644 --- a/LEGO1/lego/legoomni/include/ambulancemissionstate.h +++ b/LEGO1/lego/legoomni/include/ambulancemissionstate.h @@ -40,6 +40,9 @@ class AmbulanceMissionState : public LegoState { } } + // SYNTHETIC: LEGO1 0x100376c0 + // AmbulanceMissionState::`scalar deleting destructor' + protected: undefined4 m_unk0x8; // 0x08 undefined4 m_unk0xc; // 0x0c diff --git a/LEGO1/lego/legoomni/include/animstate.h b/LEGO1/lego/legoomni/include/animstate.h index c1098b6a..fe39ccc7 100644 --- a/LEGO1/lego/legoomni/include/animstate.h +++ b/LEGO1/lego/legoomni/include/animstate.h @@ -26,6 +26,9 @@ class AnimState : public LegoState { virtual MxBool SetFlag() override; // vtable+0x18 virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1C + // SYNTHETIC: LEGO1 0x10065130 + // AnimState::`scalar deleting destructor' + private: undefined4 m_unk0x8; undefined4 m_unk0xc; diff --git a/LEGO1/lego/legoomni/include/beachhouseentity.h b/LEGO1/lego/legoomni/include/beachhouseentity.h index 58aa3c68..df8cf288 100644 --- a/LEGO1/lego/legoomni/include/beachhouseentity.h +++ b/LEGO1/lego/legoomni/include/beachhouseentity.h @@ -21,6 +21,9 @@ class BeachHouseEntity : public BuildingEntity { { return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f970 + // BeachHouseEntity::`scalar deleting destructor' }; #endif // BEACHHOUSEENTITY_H diff --git a/LEGO1/lego/legoomni/include/bike.h b/LEGO1/lego/legoomni/include/bike.h index 899cfd21..29aa6063 100644 --- a/LEGO1/lego/legoomni/include/bike.h +++ b/LEGO1/lego/legoomni/include/bike.h @@ -23,6 +23,9 @@ class Bike : public IslePathActor { return !strcmp(p_name, Bike::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10076880 + // Bike::`scalar deleting destructor' + private: // TODO: Bike fields undefined m_unk0x160[4]; diff --git a/LEGO1/lego/legoomni/include/buildingentity.h b/LEGO1/lego/legoomni/include/buildingentity.h index 7f2abe07..bd136438 100644 --- a/LEGO1/lego/legoomni/include/buildingentity.h +++ b/LEGO1/lego/legoomni/include/buildingentity.h @@ -22,6 +22,9 @@ class BuildingEntity : public LegoEntity { { return !strcmp(p_name, BuildingEntity::ClassName()) || LegoEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10015010 + // BuildingEntity::`scalar deleting destructor' }; #endif // BUILDINGENTITY_H diff --git a/LEGO1/lego/legoomni/include/bumpbouy.h b/LEGO1/lego/legoomni/include/bumpbouy.h index a56526e4..a423ca3e 100644 --- a/LEGO1/lego/legoomni/include/bumpbouy.h +++ b/LEGO1/lego/legoomni/include/bumpbouy.h @@ -19,6 +19,9 @@ class BumpBouy : public LegoAnimActor { { return !strcmp(p_name, BumpBouy::ClassName()) || LegoAnimActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10027490 + // BumpBouy::`scalar deleting destructor' }; #endif // BUMPBOUY_H diff --git a/LEGO1/lego/legoomni/include/carrace.h b/LEGO1/lego/legoomni/include/carrace.h index 767fa567..3a3b238a 100644 --- a/LEGO1/lego/legoomni/include/carrace.h +++ b/LEGO1/lego/legoomni/include/carrace.h @@ -23,6 +23,9 @@ class CarRace : public LegoRace { return !strcmp(p_name, CarRace::ClassName()) || LegoRace::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10016c70 + // CarRace::`scalar deleting destructor' + private: undefined m_unk0x144[12]; // 0x144 undefined4 m_unk0x150; // 0x150 diff --git a/LEGO1/lego/legoomni/include/carracestate.h b/LEGO1/lego/legoomni/include/carracestate.h index 561f277b..490900dd 100644 --- a/LEGO1/lego/legoomni/include/carracestate.h +++ b/LEGO1/lego/legoomni/include/carracestate.h @@ -19,6 +19,9 @@ class CarRaceState : public RaceState { { return !strcmp(p_name, CarRaceState::ClassName()) || RaceState::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f740 + // CarRaceState::`scalar deleting destructor' }; #endif // CARRACESTATE_H diff --git a/LEGO1/lego/legoomni/include/doors.h b/LEGO1/lego/legoomni/include/doors.h index feea0460..321fdf61 100644 --- a/LEGO1/lego/legoomni/include/doors.h +++ b/LEGO1/lego/legoomni/include/doors.h @@ -19,6 +19,9 @@ class Doors : public LegoPathActor { { return !strcmp(p_name, Doors::ClassName()) || LegoPathActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000e580 + // Doors::`scalar deleting destructor' }; #endif // DOORS_H diff --git a/LEGO1/lego/legoomni/include/dunebuggy.h b/LEGO1/lego/legoomni/include/dunebuggy.h index e45fe8fe..918a8b1a 100644 --- a/LEGO1/lego/legoomni/include/dunebuggy.h +++ b/LEGO1/lego/legoomni/include/dunebuggy.h @@ -23,6 +23,9 @@ class DuneBuggy : public IslePathActor { return !strcmp(p_name, DuneBuggy::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10067dc0 + // DuneBuggy::`scalar deleting destructor' + private: // TODO: Double check DuneBuggy field types undefined4 m_unk0x160; diff --git a/LEGO1/lego/legoomni/include/elevatorbottom.h b/LEGO1/lego/legoomni/include/elevatorbottom.h index e10b7727..9c5b18e3 100644 --- a/LEGO1/lego/legoomni/include/elevatorbottom.h +++ b/LEGO1/lego/legoomni/include/elevatorbottom.h @@ -26,6 +26,9 @@ class ElevatorBottom : public LegoWorld { return !strcmp(p_name, ElevatorBottom::ClassName()) || LegoWorld::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10018040 + // ElevatorBottom::`scalar deleting destructor' + private: undefined4 m_unk0xf8; // 0xf8 }; diff --git a/LEGO1/lego/legoomni/include/gasstation.h b/LEGO1/lego/legoomni/include/gasstation.h index 11ff175a..2c979d72 100644 --- a/LEGO1/lego/legoomni/include/gasstation.h +++ b/LEGO1/lego/legoomni/include/gasstation.h @@ -29,6 +29,9 @@ class GasStation : public LegoWorld { return !strcmp(p_name, GasStation::ClassName()) || LegoWorld::IsA(p_name); } + // SYNTHETIC: LEGO1 0x100048a0 + // GasStation::`scalar deleting destructor' + private: undefined2 m_unk0xf8; // 0xf8 undefined2 m_unk0xfa; // 0xfa diff --git a/LEGO1/lego/legoomni/include/gasstationentity.h b/LEGO1/lego/legoomni/include/gasstationentity.h index b4a27942..7ab807cd 100644 --- a/LEGO1/lego/legoomni/include/gasstationentity.h +++ b/LEGO1/lego/legoomni/include/gasstationentity.h @@ -19,6 +19,9 @@ class GasStationEntity : public BuildingEntity { { return !strcmp(p_name, GasStationEntity::ClassName()) || BuildingEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f890 + // GasStationEntity::`scalar deleting destructor' }; #endif // GASSTATIONENTITY_H diff --git a/LEGO1/lego/legoomni/include/gasstationstate.h b/LEGO1/lego/legoomni/include/gasstationstate.h index e2768a98..0cdf7bf1 100644 --- a/LEGO1/lego/legoomni/include/gasstationstate.h +++ b/LEGO1/lego/legoomni/include/gasstationstate.h @@ -22,6 +22,9 @@ class GasStationState : public LegoState { return !strcmp(p_name, GasStationState::ClassName()) || LegoState::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10006290 + // GasStationState::`scalar deleting destructor' + private: undefined4 m_unk0x08[3]; undefined4 m_unk0x14; diff --git a/LEGO1/lego/legoomni/include/gifmanager.h b/LEGO1/lego/legoomni/include/gifmanager.h index 3226b4b0..aa6d2d80 100644 --- a/LEGO1/lego/legoomni/include/gifmanager.h +++ b/LEGO1/lego/legoomni/include/gifmanager.h @@ -1,6 +1,7 @@ #ifndef GIFMANAGER_H #define GIFMANAGER_H +#include "compat.h" #include "decomp.h" #include "mxtypes.h" @@ -45,8 +46,11 @@ class GifMap { // VTABLE: LEGO1 0x100d86d4 class GifManagerBase { public: - // STUB: LEGO1 0x1005a310 - virtual ~GifManagerBase() {} // vtable+00 + // STUB: LEGO1 0x1005b660 + virtual ~GifManagerBase() {} + + // SYNTHETIC: LEGO1 0x1005a310 + // GifManagerBase::`scalar deleting destructor' inline GifData* Get(const char* p_name) { return m_unk0x8.Get(p_name); } @@ -59,8 +63,10 @@ class GifManagerBase { // VTABLE: LEGO1 0x100d86fc class GifManager : public GifManagerBase { public: - // STUB: LEGO1 0x1005a580 - virtual ~GifManager() {} // vtable+00 + virtual ~GifManager() override; + + // SYNTHETIC: LEGO1 0x1005a580 + // GifManager::`scalar deleting destructor' protected: undefined m_unk0x14[0x1c]; diff --git a/LEGO1/lego/legoomni/include/helicopterstate.h b/LEGO1/lego/legoomni/include/helicopterstate.h index 2cb3b747..41dcf84b 100644 --- a/LEGO1/lego/legoomni/include/helicopterstate.h +++ b/LEGO1/lego/legoomni/include/helicopterstate.h @@ -24,6 +24,9 @@ class HelicopterState : public LegoState { inline void SetUnknown8(MxU32 p_unk0x8) { m_unk0x8 = p_unk0x8; } inline MxU32 GetUnkown8() { return m_unk0x8; } + // SYNTHETIC: LEGO1 0x1000e190 + // HelicopterState::`scalar deleting destructor' + protected: MxU32 m_unk0x8; // 0x8 }; diff --git a/LEGO1/lego/legoomni/include/historybook.h b/LEGO1/lego/legoomni/include/historybook.h index 80cc78b5..101e45a6 100644 --- a/LEGO1/lego/legoomni/include/historybook.h +++ b/LEGO1/lego/legoomni/include/historybook.h @@ -24,6 +24,9 @@ class HistoryBook : public LegoWorld { { return !strcmp(p_name, HistoryBook::ClassName()) || LegoWorld::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x100824b0 + // HistoryBook::`scalar deleting destructor' }; #endif // HISTORYBOOK_H diff --git a/LEGO1/lego/legoomni/include/hospital.h b/LEGO1/lego/legoomni/include/hospital.h index 29ff1177..bbaa3e74 100644 --- a/LEGO1/lego/legoomni/include/hospital.h +++ b/LEGO1/lego/legoomni/include/hospital.h @@ -26,6 +26,9 @@ class Hospital : public LegoWorld { return !strcmp(p_name, Hospital::ClassName()) || LegoWorld::IsA(p_name); } + // SYNTHETIC: LEGO1 0x100747d0 + // Hospital::`scalar deleting destructor' + private: undefined2 m_unk0xf8; // 0xf8 undefined4 m_unk0xfc; // 0xfc diff --git a/LEGO1/lego/legoomni/include/hospitalentity.h b/LEGO1/lego/legoomni/include/hospitalentity.h index f4f14b70..fea461d8 100644 --- a/LEGO1/lego/legoomni/include/hospitalentity.h +++ b/LEGO1/lego/legoomni/include/hospitalentity.h @@ -19,6 +19,9 @@ class HospitalEntity : public BuildingEntity { { return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f820 + // HospitalEntity::`scalar deleting destructor' }; #endif // HOSPITALENTITY_H diff --git a/LEGO1/lego/legoomni/include/hospitalstate.h b/LEGO1/lego/legoomni/include/hospitalstate.h index 25c23d96..7fabe10a 100644 --- a/LEGO1/lego/legoomni/include/hospitalstate.h +++ b/LEGO1/lego/legoomni/include/hospitalstate.h @@ -23,6 +23,9 @@ class HospitalState : public LegoState { return !strcmp(p_name, HospitalState::ClassName()) || LegoState::IsA(p_name); } + // SYNTHETIC: LEGO1 0x100764c0 + // HospitalState::`scalar deleting destructor' + private: undefined m_unk0x8[4]; // 0x8 undefined2 m_unk0xc; // 0xc diff --git a/LEGO1/lego/legoomni/include/infocenter.h b/LEGO1/lego/legoomni/include/infocenter.h index da17941b..c0ef31b0 100644 --- a/LEGO1/lego/legoomni/include/infocenter.h +++ b/LEGO1/lego/legoomni/include/infocenter.h @@ -132,6 +132,9 @@ class Infocenter : public LegoWorld { virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + // SYNTHETIC: LEGO1 0x1006ec60 + // Infocenter::`scalar deleting destructor' + private: void InitializeBitmaps(); diff --git a/LEGO1/lego/legoomni/include/infocenterdoor.h b/LEGO1/lego/legoomni/include/infocenterdoor.h index 5bc5e407..4bdf2884 100644 --- a/LEGO1/lego/legoomni/include/infocenterdoor.h +++ b/LEGO1/lego/legoomni/include/infocenterdoor.h @@ -24,6 +24,9 @@ class InfocenterDoor : public LegoWorld { { return !strcmp(p_name, InfocenterDoor::ClassName()) || LegoWorld::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x100378d0 + // InfocenterDoor::`scalar deleting destructor' }; #endif // INFOCENTERDOOR_H diff --git a/LEGO1/lego/legoomni/include/infocenterentity.h b/LEGO1/lego/legoomni/include/infocenterentity.h index e011aeb8..91fe03ff 100644 --- a/LEGO1/lego/legoomni/include/infocenterentity.h +++ b/LEGO1/lego/legoomni/include/infocenterentity.h @@ -19,6 +19,9 @@ class InfoCenterEntity : public BuildingEntity { { return !strcmp(p_name, InfoCenterEntity::ClassName()) || BuildingEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f7b0 + // InfoCenterEntity::`scalar deleting destructor' }; #endif // INFOCENTERENTITY_H diff --git a/LEGO1/lego/legoomni/include/infocenterstate.h b/LEGO1/lego/legoomni/include/infocenterstate.h index 51dbac72..c926b97c 100644 --- a/LEGO1/lego/legoomni/include/infocenterstate.h +++ b/LEGO1/lego/legoomni/include/infocenterstate.h @@ -29,6 +29,9 @@ class InfocenterState : public LegoState { inline void SetUnknown0x74(MxU32 p_unk0x74) { m_unk0x74 = p_unk0x74; } + // SYNTHETIC: LEGO1 0x10071900 + // InfocenterState::`scalar deleting destructor' + private: // Members should be renamed with their offsets before use /* diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 5ebc5fab..681e0337 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -59,6 +59,9 @@ class Isle : public LegoWorld { MxLong HandleTransitionEnd(); void FUN_10032620(); + // SYNTHETIC: LEGO1 0x10030a30 + // Isle::`scalar deleting destructor' + protected: Act1State* m_act1state; // 0xf8 Pizza* m_pizza; // 0xfc diff --git a/LEGO1/lego/legoomni/include/jetski.h b/LEGO1/lego/legoomni/include/jetski.h index 1a64a4b6..c0129dbd 100644 --- a/LEGO1/lego/legoomni/include/jetski.h +++ b/LEGO1/lego/legoomni/include/jetski.h @@ -23,6 +23,9 @@ class Jetski : public IslePathActor { return !strcmp(p_name, Jetski::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x1007e5c0 + // Jetski::`scalar deleting destructor' + private: // TODO: Jetski fields undefined m_unk0x160[4]; diff --git a/LEGO1/lego/legoomni/include/jetskiracestate.h b/LEGO1/lego/legoomni/include/jetskiracestate.h index 5610ac32..ccb60112 100644 --- a/LEGO1/lego/legoomni/include/jetskiracestate.h +++ b/LEGO1/lego/legoomni/include/jetskiracestate.h @@ -19,6 +19,9 @@ class JetskiRaceState : public RaceState { { return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f680 + // JetskiRaceState::`scalar deleting destructor' }; #endif // JETSKIRACESTATE_H diff --git a/LEGO1/lego/legoomni/include/jukebox.h b/LEGO1/lego/legoomni/include/jukebox.h index 59aee194..de351ad9 100644 --- a/LEGO1/lego/legoomni/include/jukebox.h +++ b/LEGO1/lego/legoomni/include/jukebox.h @@ -23,6 +23,9 @@ class JukeBox : public LegoWorld { return !strcmp(p_name, JukeBox::ClassName()) || LegoWorld::IsA(p_name); } + // SYNTHETIC: LEGO1 0x1005d810 + // JukeBox::`scalar deleting destructor' + private: undefined m_unk0xf8[4]; // 0xf8 undefined4 m_unk0xfc; // 0xfc diff --git a/LEGO1/lego/legoomni/include/jukeboxentity.h b/LEGO1/lego/legoomni/include/jukeboxentity.h index c451787d..81a47ef9 100644 --- a/LEGO1/lego/legoomni/include/jukeboxentity.h +++ b/LEGO1/lego/legoomni/include/jukeboxentity.h @@ -22,6 +22,9 @@ class JukeBoxEntity : public LegoEntity { { return !strcmp(p_name, JukeBoxEntity::ClassName()) || LegoEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10085db0 + // JukeBoxEntity::`scalar deleting destructor' }; #endif // JUKEBOXENTITY_H diff --git a/LEGO1/lego/legoomni/include/jukeboxstate.h b/LEGO1/lego/legoomni/include/jukeboxstate.h index 7a517bb0..8263e97c 100644 --- a/LEGO1/lego/legoomni/include/jukeboxstate.h +++ b/LEGO1/lego/legoomni/include/jukeboxstate.h @@ -21,6 +21,9 @@ class JukeBoxState : public LegoState { } virtual MxBool VTable0x14() override; // vtable+0x14 + + // SYNTHETIC: LEGO1 0x1000f3d0 + // JukeBoxState::`scalar deleting destructor' }; #endif // JUKEBOXSTATE_H diff --git a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h index ed1942da..c08e777f 100644 --- a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h +++ b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h @@ -19,6 +19,9 @@ class Lego3DWavePresenter : public MxWavePresenter { { return !strcmp(p_name, Lego3DWavePresenter::ClassName()) || MxWavePresenter::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f4b0 + // Lego3DWavePresenter::`scalar deleting destructor' }; #endif // LEGO3DWAVEPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legoact2.h b/LEGO1/lego/legoomni/include/legoact2.h index 79983416..1f0138ce 100644 --- a/LEGO1/lego/legoomni/include/legoact2.h +++ b/LEGO1/lego/legoomni/include/legoact2.h @@ -6,6 +6,9 @@ // VTABLE: LEGO1 0x100d82e0 // SIZE 0x1154 -class LegoAct2 : public LegoWorld {}; +class LegoAct2 : public LegoWorld { + // SYNTHETIC: LEGO1 0x1004fe20 + // LegoAct2::`scalar deleting destructor' +}; #endif // LEGOACT2_H diff --git a/LEGO1/lego/legoomni/include/legoact2state.h b/LEGO1/lego/legoomni/include/legoact2state.h index 38584769..2f8a2e79 100644 --- a/LEGO1/lego/legoomni/include/legoact2state.h +++ b/LEGO1/lego/legoomni/include/legoact2state.h @@ -19,6 +19,9 @@ class LegoAct2State : public LegoState { { return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000e040 + // LegoAct2State::`scalar deleting destructor' }; #endif // LEGOACT2STATE_H diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index a781128e..b81f2c72 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -34,6 +34,9 @@ class LegoAnimationManager : public MxCore { __declspec(dllexport) static void configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig); + // SYNTHETIC: LEGO1 0x1005ed10 + // LegoAnimationManager::`scalar deleting destructor' + private: void Init(); }; diff --git a/LEGO1/lego/legoomni/include/legoanimmmpresenter.h b/LEGO1/lego/legoomni/include/legoanimmmpresenter.h index 2e1ab918..520f3c09 100644 --- a/LEGO1/lego/legoomni/include/legoanimmmpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimmmpresenter.h @@ -21,6 +21,9 @@ class LegoAnimMMPresenter : public MxCompositePresenter { { return !strcmp(p_name, LegoAnimMMPresenter::ClassName()) || MxCompositePresenter::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1004aa40 + // LegoAnimMMPresenter::`scalar deleting destructor' }; #endif // LEGOANIMMMPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legobuildingmanager.h b/LEGO1/lego/legoomni/include/legobuildingmanager.h index 03fb2eeb..5c0061d3 100644 --- a/LEGO1/lego/legoomni/include/legobuildingmanager.h +++ b/LEGO1/lego/legoomni/include/legobuildingmanager.h @@ -21,6 +21,9 @@ class LegoBuildingManager : public MxCore { void FUN_1002fa00(); + // SYNTHETIC: LEGO1 0x1002f940 + // LegoBuildingManager::`scalar deleting destructor' + private: void Init(); }; diff --git a/LEGO1/lego/legoomni/include/legocachesound.h b/LEGO1/lego/legoomni/include/legocachesound.h index 6398c04e..5d587835 100644 --- a/LEGO1/lego/legoomni/include/legocachesound.h +++ b/LEGO1/lego/legoomni/include/legocachesound.h @@ -23,6 +23,9 @@ class LegoCacheSound : public MxCore { return !strcmp(p_name, LegoCacheSound::ClassName()) || MxCore::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10006610 + // LegoCacheSound::`scalar deleting destructor' + private: void Init(); }; diff --git a/LEGO1/lego/legoomni/include/legocarbuild.h b/LEGO1/lego/legoomni/include/legocarbuild.h index 74d850d4..c3b1b1f6 100644 --- a/LEGO1/lego/legoomni/include/legocarbuild.h +++ b/LEGO1/lego/legoomni/include/legocarbuild.h @@ -25,6 +25,9 @@ class LegoCarBuild : public LegoWorld { { return !strcmp(p_name, LegoCarBuild::ClassName()) || LegoWorld::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10022a60 + // LegoCarBuild::`scalar deleting destructor' }; #endif // LEGOCARBUILD_H diff --git a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h b/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h index 0440a0f3..8bd5ba75 100644 --- a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h @@ -22,6 +22,9 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter { { return !strcmp(p_name, LegoCarBuildAnimPresenter::ClassName()) || LegoAnimPresenter::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10078660 + // LegoCarBuildAnimPresenter::`scalar deleting destructor' }; #endif // LEGOCARBUILDANIMPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legocarraceactor.h b/LEGO1/lego/legoomni/include/legocarraceactor.h index f00d900e..d88da3f7 100644 --- a/LEGO1/lego/legoomni/include/legocarraceactor.h +++ b/LEGO1/lego/legoomni/include/legocarraceactor.h @@ -18,6 +18,9 @@ class LegoCarRaceActor : public LegoRaceActor { { return !strcmp(p_name, LegoCarRaceActor::ClassName()) || LegoRaceActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10081610 + // LegoCarRaceActor::`scalar deleting destructor' }; #endif // LEGOCARRACEACTOR_H diff --git a/LEGO1/lego/legoomni/include/legocontrolmanager.h b/LEGO1/lego/legoomni/include/legocontrolmanager.h index f81ab6d2..df003f06 100644 --- a/LEGO1/lego/legoomni/include/legocontrolmanager.h +++ b/LEGO1/lego/legoomni/include/legocontrolmanager.h @@ -29,6 +29,9 @@ class LegoControlManager : public MxCore { void Register(MxCore* p_listener); void Unregister(MxCore* p_listener); void FUN_100293c0(undefined4, const MxAtomId&, undefined2); + + // SYNTHETIC: LEGO1 0x10028d40 + // LegoControlManager::`scalar deleting destructor' }; #endif // LEGOCONTROLMANAGER_H diff --git a/LEGO1/lego/legoomni/include/legoentitypresenter.h b/LEGO1/lego/legoomni/include/legoentitypresenter.h index e3055991..249e8b5c 100644 --- a/LEGO1/lego/legoomni/include/legoentitypresenter.h +++ b/LEGO1/lego/legoomni/include/legoentitypresenter.h @@ -35,6 +35,9 @@ class LegoEntityPresenter : public MxCompositePresenter { void SetEntityLocation(Mx3DPointFloat& p_location, Mx3DPointFloat& p_direction, Mx3DPointFloat& p_up); + // SYNTHETIC: LEGO1 0x100535a0 + // LegoEntityPresenter::`scalar deleting destructor' + private: void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legoflctexturepresenter.h b/LEGO1/lego/legoomni/include/legoflctexturepresenter.h index 36d1fefc..f5ea7420 100644 --- a/LEGO1/lego/legoomni/include/legoflctexturepresenter.h +++ b/LEGO1/lego/legoomni/include/legoflctexturepresenter.h @@ -17,6 +17,9 @@ class LegoFlcTexturePresenter : public MxFlcPresenter { return "LegoFlcTexturePresenter"; } + // SYNTHETIC: LEGO1 0x1005df00 + // LegoFlcTexturePresenter::`scalar deleting destructor' + private: void Init(); diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 251c52b5..0f068a90 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -71,6 +71,9 @@ class LegoInputManager : public MxPresenter { void ProcessEvents(); MxBool ProcessOneEvent(LegoEventNotificationParam& p_param); + // SYNTHETIC: LEGO1 0x1005b8d0 + // LegoInputManager::`scalar deleting destructor' + private: MxCriticalSection m_criticalSection; MxList* m_unk0x5c; // list or hash table diff --git a/LEGO1/lego/legoomni/include/legojetski.h b/LEGO1/lego/legoomni/include/legojetski.h index 09a9f8d1..e4f876a3 100644 --- a/LEGO1/lego/legoomni/include/legojetski.h +++ b/LEGO1/lego/legoomni/include/legojetski.h @@ -18,6 +18,9 @@ class LegoJetski : public LegoJetskiRaceActor { { return !strcmp(p_name, LegoJetski::ClassName()) || LegoJetskiRaceActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10013e20 + // LegoJetski::`scalar deleting destructor' }; #endif // LEGOJETSKI_H diff --git a/LEGO1/lego/legoomni/include/legojetskiraceactor.h b/LEGO1/lego/legoomni/include/legojetskiraceactor.h index 28d151e8..cd497525 100644 --- a/LEGO1/lego/legoomni/include/legojetskiraceactor.h +++ b/LEGO1/lego/legoomni/include/legojetskiraceactor.h @@ -18,6 +18,9 @@ class LegoJetskiRaceActor : public LegoCarRaceActor { { return !strcmp(p_name, LegoJetskiRaceActor::ClassName()) || LegoCarRaceActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10081d40 + // LegoJetskiRaceActor::`scalar deleting destructor' }; #endif // LEGOJETSKIRACEACTOR_H diff --git a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h index 36facd1d..09370d0f 100644 --- a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h @@ -21,6 +21,9 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { return !strcmp(p_name, ClassName()) || LegoLoopingAnimPresenter::IsA(p_name); } + // SYNTHETIC: LEGO1 0x1006cfe0 + // LegoLocomotionAnimPresenter::`scalar deleting destructor' + private: void Init(); }; diff --git a/LEGO1/lego/legoomni/include/legomodelpresenter.h b/LEGO1/lego/legoomni/include/legomodelpresenter.h index fe2216d5..7803187a 100644 --- a/LEGO1/lego/legoomni/include/legomodelpresenter.h +++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h @@ -26,6 +26,9 @@ class LegoModelPresenter : public MxVideoPresenter { virtual void ParseExtra() override; // vtable+0x30 virtual void Destroy() override; // vtable+0x38 + // SYNTHETIC: LEGO1 0x1000cdd0 + // LegoModelPresenter::`scalar deleting destructor' + protected: void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legonavcontroller.h b/LEGO1/lego/legoomni/include/legonavcontroller.h index 97882566..2ae35245 100644 --- a/LEGO1/lego/legoomni/include/legonavcontroller.h +++ b/LEGO1/lego/legoomni/include/legonavcontroller.h @@ -61,6 +61,9 @@ class LegoNavController : public MxCore { inline void SetTrackDefaultParams(MxBool p_trackDefault) { m_trackDefault = p_trackDefault; } + // SYNTHETIC: LEGO1 0x10054c10 + // LegoNavController::`scalar deleting destructor' + private: int m_hMax; int m_vMax; diff --git a/LEGO1/lego/legoomni/include/legoobjectfactory.h b/LEGO1/lego/legoomni/include/legoobjectfactory.h index 552b3cf8..9357ce34 100644 --- a/LEGO1/lego/legoomni/include/legoobjectfactory.h +++ b/LEGO1/lego/legoomni/include/legoobjectfactory.h @@ -108,6 +108,9 @@ class LegoObjectFactory : public MxObjectFactory { virtual MxCore* Create(const char* p_name) override; // vtable 0x14 virtual void Destroy(MxCore* p_object) override; // vtable 0x18 + // SYNTHETIC: LEGO1 0x10009000 + // LegoObjectFactory::`scalar deleting destructor' + private: #define X(V) MxAtomId m_id##V; FOR_LEGOOBJECTFACTORY_OBJECTS(X) diff --git a/LEGO1/lego/legoomni/include/legoomni.h b/LEGO1/lego/legoomni/include/legoomni.h index 55166b37..d7d9a2d4 100644 --- a/LEGO1/lego/legoomni/include/legoomni.h +++ b/LEGO1/lego/legoomni/include/legoomni.h @@ -129,6 +129,9 @@ class LegoOmni : public MxOmni { inline void CloseMainWindow() { PostMessageA(m_windowHandle, WM_CLOSE, 0, 0); } + // SYNTHETIC: LEGO1 0x10058b30 + // LegoOmni::`scalar deleting destructor' + private: undefined4* m_unk0x68; // 0x68 ViewLODListManager* m_viewLODListManager; // 0x6c diff --git a/LEGO1/lego/legoomni/include/legopalettepresenter.h b/LEGO1/lego/legoomni/include/legopalettepresenter.h index 858e1097..242c7bc0 100644 --- a/LEGO1/lego/legoomni/include/legopalettepresenter.h +++ b/LEGO1/lego/legoomni/include/legopalettepresenter.h @@ -30,6 +30,9 @@ class LegoPalettePresenter : public MxVideoPresenter { MxResult ParsePalette(MxStreamChunk* p_chunk); + // SYNTHETIC: LEGO1 0x1007a050 + // LegoPalettePresenter::`scalar deleting destructor' + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legopartpresenter.h b/LEGO1/lego/legoomni/include/legopartpresenter.h index 6695a70b..e847d39b 100644 --- a/LEGO1/lego/legoomni/include/legopartpresenter.h +++ b/LEGO1/lego/legoomni/include/legopartpresenter.h @@ -21,6 +21,9 @@ class LegoPartPresenter : public MxMediaPresenter { } __declspec(dllexport) static void configureLegoPartPresenter(MxS32, MxS32); + + // SYNTHETIC: LEGO1 0x1000d060 + // LegoPartPresenter::`scalar deleting destructor' }; #endif // LEGOPARTPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 5f67af4f..be2c87e3 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -66,6 +66,9 @@ class LegoPathActor : public LegoActor { inline void SetUnknownDC(MxU32 p_unk0xdc) { m_unk0xdc = p_unk0xdc; } + // SYNTHETIC: LEGO1 0x1002d800 + // LegoPathActor::`scalar deleting destructor' + protected: undefined m_unk0x78[0x64]; // 0x78 MxU32 m_unk0xdc; // 0xdc diff --git a/LEGO1/lego/legoomni/include/legopathcontroller.h b/LEGO1/lego/legoomni/include/legopathcontroller.h index f7278ca8..ada96e7e 100644 --- a/LEGO1/lego/legoomni/include/legopathcontroller.h +++ b/LEGO1/lego/legoomni/include/legopathcontroller.h @@ -8,7 +8,7 @@ class LegoPathController : public MxCore { public: LegoPathController(); - virtual ~LegoPathController() override; + virtual ~LegoPathController() override { Destroy(); }; virtual MxResult Tickle() override; // vtable+08 @@ -24,6 +24,12 @@ class LegoPathController : public MxCore { { return !strcmp(p_name, LegoPathController::ClassName()) || MxCore::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10045740 + // LegoPathController::`scalar deleting destructor' + + virtual void VTable0x14(); // vtable+0x14 + virtual void Destroy(); // vtable+0x18 }; #endif // LEGOPATHCONTROLLER_H diff --git a/LEGO1/lego/legoomni/include/legopathcontrollerlist.h b/LEGO1/lego/legoomni/include/legopathcontrollerlist.h index db31c2c4..ead40f48 100644 --- a/LEGO1/lego/legoomni/include/legopathcontrollerlist.h +++ b/LEGO1/lego/legoomni/include/legopathcontrollerlist.h @@ -19,6 +19,9 @@ class LegoPathControllerList : public MxPtrList { { return p_a == p_b ? 0 : p_a < p_b ? -1 : 1; } // vtable+0x14 + + // SYNTHETIC: LEGO1 0x1001d3d0 + // LegoPathControllerList::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100d6380 diff --git a/LEGO1/lego/legoomni/include/legopathpresenter.h b/LEGO1/lego/legoomni/include/legopathpresenter.h index bc1bdcb5..792b99eb 100644 --- a/LEGO1/lego/legoomni/include/legopathpresenter.h +++ b/LEGO1/lego/legoomni/include/legopathpresenter.h @@ -30,6 +30,9 @@ class LegoPathPresenter : public MxMediaPresenter { virtual MxResult AddToManager() override; // vtable+0x34 virtual void Destroy() override; // vtable+0x38 + // SYNTHETIC: LEGO1 0x10044a90 + // LegoPathPresenter::`scalar deleting destructor' + private: void Init(); diff --git a/LEGO1/lego/legoomni/include/legophonemepresenter.h b/LEGO1/lego/legoomni/include/legophonemepresenter.h index 330b1c7a..c643f261 100644 --- a/LEGO1/lego/legoomni/include/legophonemepresenter.h +++ b/LEGO1/lego/legoomni/include/legophonemepresenter.h @@ -20,6 +20,9 @@ class LegoPhonemePresenter : public MxFlcPresenter { return "LegoPhonemePresenter"; } + // SYNTHETIC: LEGO1 0x1004e320 + // LegoPhonemePresenter::`scalar deleting destructor' + private: void Init(); int m_unk0x68; diff --git a/LEGO1/lego/legoomni/include/legoplantmanager.h b/LEGO1/lego/legoomni/include/legoplantmanager.h index e509e17e..e199f11b 100644 --- a/LEGO1/lego/legoomni/include/legoplantmanager.h +++ b/LEGO1/lego/legoomni/include/legoplantmanager.h @@ -22,6 +22,9 @@ class LegoPlantManager : public MxCore { void FUN_10026360(undefined4 p_world); + // SYNTHETIC: LEGO1 0x100262a0 + // LegoPlantManager::`scalar deleting destructor' + private: void Init(); }; diff --git a/LEGO1/lego/legoomni/include/legorace.h b/LEGO1/lego/legoomni/include/legorace.h index 504b4cbb..e3f9df88 100644 --- a/LEGO1/lego/legoomni/include/legorace.h +++ b/LEGO1/lego/legoomni/include/legorace.h @@ -38,6 +38,9 @@ class LegoRace : public LegoWorld { virtual undefined4 VTable0x78(undefined4); // vtable+0x78 virtual void VTable0x7c(undefined4, undefined4); // vtable+0x7c + // SYNTHETIC: LEGO1 0x10015cc0 + // LegoRace::`scalar deleting destructor' + private: undefined4 m_unk0xf8; // 0xf8 undefined4 m_unk0xfc; // 0xfc diff --git a/LEGO1/lego/legoomni/include/legoraceactor.h b/LEGO1/lego/legoomni/include/legoraceactor.h index eb459e81..6df40e43 100644 --- a/LEGO1/lego/legoomni/include/legoraceactor.h +++ b/LEGO1/lego/legoomni/include/legoraceactor.h @@ -18,6 +18,9 @@ class LegoRaceActor : public LegoAnimActor { { return !strcmp(p_name, LegoRaceActor::ClassName()) || LegoAnimActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10014ab0 + // LegoRaceActor::`scalar deleting destructor' }; #endif // LEGORACEACTOR_H diff --git a/LEGO1/lego/legoomni/include/legoracecar.h b/LEGO1/lego/legoomni/include/legoracecar.h index a2a54afb..7e200ff6 100644 --- a/LEGO1/lego/legoomni/include/legoracecar.h +++ b/LEGO1/lego/legoomni/include/legoracecar.h @@ -20,6 +20,9 @@ class LegoRaceCar : public LegoCarRaceActor { { return !strcmp(p_name, LegoCarRaceActor::ClassName()) || LegoCarRaceActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10014230 + // LegoRaceCar::`scalar deleting destructor' }; #endif // LEGOCARRACE_H diff --git a/LEGO1/lego/legoomni/include/legosoundmanager.h b/LEGO1/lego/legoomni/include/legosoundmanager.h index 2caef869..0e4bbbbd 100644 --- a/LEGO1/lego/legoomni/include/legosoundmanager.h +++ b/LEGO1/lego/legoomni/include/legosoundmanager.h @@ -14,6 +14,9 @@ class LegoSoundManager : public MxSoundManager { virtual void Destroy() override; // vtable+18 virtual MxResult Create(MxU32 p_frequencyMS, MxBool p_createThread) override; // vtable+0x30 + // SYNTHETIC: LEGO1 0x10029920 + // LegoSoundManager::`scalar deleting destructor' + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legostate.h b/LEGO1/lego/legoomni/include/legostate.h index ba4403de..215d64d4 100644 --- a/LEGO1/lego/legoomni/include/legostate.h +++ b/LEGO1/lego/legoomni/include/legostate.h @@ -27,6 +27,9 @@ class LegoState : public MxCore { virtual MxBool VTable0x14(); // vtable+0x14 virtual MxBool SetFlag(); // vtable+0x18 virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream); // vtable+0x1C + + // SYNTHETIC: LEGO1 0x10006160 + // LegoState::`scalar deleting destructor' }; #endif // LEGOSTATE_H diff --git a/LEGO1/lego/legoomni/include/legotexturepresenter.h b/LEGO1/lego/legoomni/include/legotexturepresenter.h index 0ac13926..ca6541df 100644 --- a/LEGO1/lego/legoomni/include/legotexturepresenter.h +++ b/LEGO1/lego/legoomni/include/legotexturepresenter.h @@ -25,6 +25,9 @@ class LegoTexturePresenter : public MxMediaPresenter { virtual void DoneTickle() override; // vtable+0x2c virtual MxResult AddToManager() override; // vtable+0x34 virtual MxResult PutData() override; // vtable+0x4c + + // SYNTHETIC: LEGO1 0x1000cf40 + // LegoTexturePresenter::`scalar deleting destructor' }; #endif // LEGOTEXTUREPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h b/LEGO1/lego/legoomni/include/legovehiclebuildstate.h index a39740bb..f441dfad 100644 --- a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h +++ b/LEGO1/lego/legoomni/include/legovehiclebuildstate.h @@ -23,6 +23,9 @@ class LegoVehicleBuildState : public LegoState { return !strcmp(p_name, this->m_className.GetData()) || LegoState::IsA(p_name); } + // SYNTHETIC: LEGO1 0x100260a0 + // LegoVehicleBuildState::`scalar deleting destructor' + public: struct UnkStruct { undefined4 m_unk0x00; diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index a423ec09..dfc51e70 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -60,6 +60,9 @@ class LegoWorld : public LegoEntity { MxS32 GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value); MxPresenter* FindPresenter(const char* p_presenter, const char* p_name); + // SYNTHETIC: LEGO1 0x1001dee0 + // LegoWorld::`scalar deleting destructor' + protected: LegoPathControllerList m_list0x68; // 0x68 MxPresenterList m_list0x80; // 0x80 diff --git a/LEGO1/lego/legoomni/include/legoworldlist.h b/LEGO1/lego/legoomni/include/legoworldlist.h index 2e52de47..339f5393 100644 --- a/LEGO1/lego/legoomni/include/legoworldlist.h +++ b/LEGO1/lego/legoomni/include/legoworldlist.h @@ -26,6 +26,9 @@ class LegoWorldList : public MxPtrList { { return p_a == p_b ? 0 : p_a < p_b ? -1 : 1; }; // vtable+0x14 + + // SYNTHETIC: LEGO1 0x10059a00 + // LegoWorldList::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100d75b8 @@ -47,6 +50,12 @@ class LegoWorldListCursor : public MxPtrListCursor { // FUNCTION: LEGO1 0x1003e8e0 // MxPtrListCursor::~MxPtrListCursor +// SYNTHETIC: LEGO1 0x1003e930 +// MxListCursor::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1003e9a0 +// MxPtrListCursor::`scalar deleting destructor' + // FUNCTION: LEGO1 0x1003ea10 // MxListCursor::~MxListCursor diff --git a/LEGO1/lego/legoomni/include/legoworldpresenter.h b/LEGO1/lego/legoomni/include/legoworldpresenter.h index be18baca..f3dbba30 100644 --- a/LEGO1/lego/legoomni/include/legoworldpresenter.h +++ b/LEGO1/lego/legoomni/include/legoworldpresenter.h @@ -31,6 +31,9 @@ class LegoWorldPresenter : public LegoEntityPresenter { virtual MxResult StartAction(MxStreamController* p_controller, MxDSAction* p_action) override; // vtable+0x3c virtual void VTable0x60(MxPresenter* p_presenter) override; // vtable+0x60 + // SYNTHETIC: LEGO1 0x10066750 + // LegoWorldPresenter::`scalar deleting destructor' + private: undefined4 m_unk0x50; }; diff --git a/LEGO1/lego/legoomni/include/motocycle.h b/LEGO1/lego/legoomni/include/motocycle.h index 0c784027..b4ccafd3 100644 --- a/LEGO1/lego/legoomni/include/motocycle.h +++ b/LEGO1/lego/legoomni/include/motocycle.h @@ -23,6 +23,9 @@ class Motocycle : public IslePathActor { return !strcmp(p_name, Motocycle::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x100359d0 + // Motocycle::`scalar deleting destructor' + private: undefined m_unk0x160[4]; MxFloat m_unk0x164; diff --git a/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h b/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h index 9d47947f..e0e64ae9 100644 --- a/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h +++ b/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h @@ -46,6 +46,9 @@ class MxBackgroundAudioManager : public MxCore { void LowerVolume(); void RaiseVolume(); + // SYNTHETIC: LEGO1 0x1007ec00 + // MxBackgroundAudioManager::`scalar deleting destructor' + private: void Init(); MxResult OpenMusic(MxAtomId& p_script); diff --git a/LEGO1/lego/legoomni/include/mxtransitionmanager.h b/LEGO1/lego/legoomni/include/mxtransitionmanager.h index b169f3bf..fdfbf674 100644 --- a/LEGO1/lego/legoomni/include/mxtransitionmanager.h +++ b/LEGO1/lego/legoomni/include/mxtransitionmanager.h @@ -45,6 +45,9 @@ class MxTransitionManager : public MxCore { inline TransitionType GetTransitionType() { return m_transitionType; } + // SYNTHETIC: LEGO1 0x1004b9e0 + // MxTransitionManager::`scalar deleting destructor' + private: void EndTransition(MxBool p_notifyWorld); void TransitionNone(); diff --git a/LEGO1/lego/legoomni/include/pizza.h b/LEGO1/lego/legoomni/include/pizza.h index 11bf6814..835a5b2e 100644 --- a/LEGO1/lego/legoomni/include/pizza.h +++ b/LEGO1/lego/legoomni/include/pizza.h @@ -30,6 +30,9 @@ class Pizza : public IsleActor { return !strcmp(p_name, Pizza::ClassName()) || IsleActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x100380e0 + // Pizza::`scalar deleting destructor' + private: undefined4 m_unk0x78; undefined4 m_unk0x7c; diff --git a/LEGO1/lego/legoomni/include/pizzamissionstate.h b/LEGO1/lego/legoomni/include/pizzamissionstate.h index 85b8e4bb..76690a99 100644 --- a/LEGO1/lego/legoomni/include/pizzamissionstate.h +++ b/LEGO1/lego/legoomni/include/pizzamissionstate.h @@ -30,6 +30,9 @@ class PizzaMissionState : public LegoState { inline MxU16 GetColor(MxU8 p_id) { return GetState(p_id)->m_color; } + // SYNTHETIC: LEGO1 0x10039350 + // PizzaMissionState::`scalar deleting destructor' + private: PizzaMissionStateEntry* GetState(MxU8 p_id); diff --git a/LEGO1/lego/legoomni/include/pizzeria.h b/LEGO1/lego/legoomni/include/pizzeria.h index 0196d616..1c73ca58 100644 --- a/LEGO1/lego/legoomni/include/pizzeria.h +++ b/LEGO1/lego/legoomni/include/pizzeria.h @@ -19,6 +19,9 @@ class Pizzeria : public IsleActor { { return !strcmp(p_name, Pizzeria::ClassName()) || IsleActor::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000e8d0 + // Pizzeria::`scalar deleting destructor' }; #endif // PIZZERIA_H diff --git a/LEGO1/lego/legoomni/include/pizzeriastate.h b/LEGO1/lego/legoomni/include/pizzeriastate.h index c27fcef0..188ee624 100644 --- a/LEGO1/lego/legoomni/include/pizzeriastate.h +++ b/LEGO1/lego/legoomni/include/pizzeriastate.h @@ -21,6 +21,9 @@ class PizzeriaState : public LegoState { { return !strcmp(p_name, PizzeriaState::ClassName()) || LegoState::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10017ce0 + // PizzeriaState::`scalar deleting destructor' }; #endif // PIZZERIASTATE_H diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h index 829c7e66..9d6bc1c7 100644 --- a/LEGO1/lego/legoomni/include/police.h +++ b/LEGO1/lego/legoomni/include/police.h @@ -25,6 +25,9 @@ class Police : public LegoWorld { { return !strcmp(p_name, Police::ClassName()) || LegoWorld::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1005e300 + // Police::`scalar deleting destructor' }; #endif // POLICE_H diff --git a/LEGO1/lego/legoomni/include/policeentity.h b/LEGO1/lego/legoomni/include/policeentity.h index 735cf0bc..cdb89af6 100644 --- a/LEGO1/lego/legoomni/include/policeentity.h +++ b/LEGO1/lego/legoomni/include/policeentity.h @@ -19,6 +19,9 @@ class PoliceEntity : public BuildingEntity { { return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1000f900 + // PoliceEntity::`scalar deleting destructor' }; #endif // POLICEENTITY_H diff --git a/LEGO1/lego/legoomni/include/policestate.h b/LEGO1/lego/legoomni/include/policestate.h index 2638a393..611ced07 100644 --- a/LEGO1/lego/legoomni/include/policestate.h +++ b/LEGO1/lego/legoomni/include/policestate.h @@ -21,6 +21,9 @@ class PoliceState : public LegoState { { return !strcmp(p_name, PoliceState::ClassName()) || LegoState::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1005e920 + // PoliceState::`scalar deleting destructor' }; #endif // POLICESTATE_H diff --git a/LEGO1/lego/legoomni/include/racecar.h b/LEGO1/lego/legoomni/include/racecar.h index b4a210e6..39005831 100644 --- a/LEGO1/lego/legoomni/include/racecar.h +++ b/LEGO1/lego/legoomni/include/racecar.h @@ -24,6 +24,9 @@ class RaceCar : public IslePathActor { return !strcmp(p_name, RaceCar::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x10028400 + // RaceCar::`scalar deleting destructor' + private: // TODO: RaceCar fields undefined m_unk0x160[4]; diff --git a/LEGO1/lego/legoomni/include/racestandsentity.h b/LEGO1/lego/legoomni/include/racestandsentity.h index a7359df8..20b1b4a6 100644 --- a/LEGO1/lego/legoomni/include/racestandsentity.h +++ b/LEGO1/lego/legoomni/include/racestandsentity.h @@ -5,6 +5,9 @@ // VTABLE: LEGO1 0x100d48a8 // SIZE 0x68 -class RaceStandsEntity : public BuildingEntity {}; +class RaceStandsEntity : public BuildingEntity { + // SYNTHETIC: LEGO1 0x1000f9e0 + // RaceStandsEntity::`scalar deleting destructor' +}; #endif // RACESTANDSENTITY_H diff --git a/LEGO1/lego/legoomni/include/racestate.h b/LEGO1/lego/legoomni/include/racestate.h index ef3cfa63..05760e32 100644 --- a/LEGO1/lego/legoomni/include/racestate.h +++ b/LEGO1/lego/legoomni/include/racestate.h @@ -32,6 +32,9 @@ class RaceState : public LegoState { inline MxU16 GetColor(MxU8 p_id) { return GetState(p_id)->m_color; } + // SYNTHETIC: LEGO1 0x100160d0 + // RaceState::`scalar deleting destructor' + private: RaceStateEntry* GetState(MxU8 p_id); diff --git a/LEGO1/lego/legoomni/include/radio.h b/LEGO1/lego/legoomni/include/radio.h index 54aef25b..3d8da44b 100644 --- a/LEGO1/lego/legoomni/include/radio.h +++ b/LEGO1/lego/legoomni/include/radio.h @@ -23,6 +23,9 @@ class Radio : public MxCore { return !strcmp(p_name, Radio::ClassName()) || MxCore::IsA(p_name); } + // SYNTHETIC: LEGO1 0x1002c970 + // Radio::`scalar deleting destructor' + private: RadioState* m_state; // 0x08 MxBool m_unk0xc; // 0x0c diff --git a/LEGO1/lego/legoomni/include/radiostate.h b/LEGO1/lego/legoomni/include/radiostate.h index a5ea6035..1035a659 100644 --- a/LEGO1/lego/legoomni/include/radiostate.h +++ b/LEGO1/lego/legoomni/include/radiostate.h @@ -21,6 +21,9 @@ class RadioState : public LegoState { { return !strcmp(p_name, RadioState::ClassName()) || LegoState::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x1002d020 + // RadioState::`scalar deleting destructor' }; #endif // RADIOSTATE_H diff --git a/LEGO1/lego/legoomni/include/registrationbook.h b/LEGO1/lego/legoomni/include/registrationbook.h index 3ae904c9..7c605865 100644 --- a/LEGO1/lego/legoomni/include/registrationbook.h +++ b/LEGO1/lego/legoomni/include/registrationbook.h @@ -24,6 +24,9 @@ class RegistrationBook : public LegoWorld { { return !strcmp(p_name, RegistrationBook::ClassName()) || LegoWorld::IsA(p_name); } + + // SYNTHETIC: LEGO1 0x10076f30 + // RegistrationBook::`scalar deleting destructor' }; #endif // REGISTRATIONBOOK_H diff --git a/LEGO1/lego/legoomni/include/scorestate.h b/LEGO1/lego/legoomni/include/scorestate.h index 21be3493..fde33e1a 100644 --- a/LEGO1/lego/legoomni/include/scorestate.h +++ b/LEGO1/lego/legoomni/include/scorestate.h @@ -26,6 +26,9 @@ class ScoreState : public LegoState { inline MxBool GetTutorialFlag() { return m_playCubeTutorial; } inline void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; } + // SYNTHETIC: LEGO1 0x1000df00 + // ScoreState::`scalar deleting destructor' + private: MxBool m_playCubeTutorial; }; diff --git a/LEGO1/lego/legoomni/include/skateboard.h b/LEGO1/lego/legoomni/include/skateboard.h index 171705c4..06adc8cb 100644 --- a/LEGO1/lego/legoomni/include/skateboard.h +++ b/LEGO1/lego/legoomni/include/skateboard.h @@ -23,6 +23,9 @@ class SkateBoard : public IslePathActor { return !strcmp(p_name, SkateBoard::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x1000ff60 + // SkateBoard::`scalar deleting destructor' + private: // TODO: SkateBoard types undefined m_unk0x160; diff --git a/LEGO1/lego/legoomni/include/towtrack.h b/LEGO1/lego/legoomni/include/towtrack.h index 1cc7e6af..39c4f630 100644 --- a/LEGO1/lego/legoomni/include/towtrack.h +++ b/LEGO1/lego/legoomni/include/towtrack.h @@ -23,6 +23,9 @@ class TowTrack : public IslePathActor { return !strcmp(p_name, TowTrack::ClassName()) || IslePathActor::IsA(p_name); } + // SYNTHETIC: LEGO1 0x1004c950 + // TowTrack::`scalar deleting destructor' + private: // TODO: TowTrack field types undefined m_unk0x154[4]; diff --git a/LEGO1/lego/legoomni/include/towtrackmissionstate.h b/LEGO1/lego/legoomni/include/towtrackmissionstate.h index c0ad3145..be2e2689 100644 --- a/LEGO1/lego/legoomni/include/towtrackmissionstate.h +++ b/LEGO1/lego/legoomni/include/towtrackmissionstate.h @@ -41,6 +41,9 @@ class TowTrackMissionState : public LegoState { } } + // SYNTHETIC: LEGO1 0x1004e060 + // TowTrackMissionState::`scalar deleting destructor' + protected: undefined4 m_unk0x08; // 0x08 undefined4 m_unk0x0c; // 0x0c diff --git a/LEGO1/lego/legoomni/src/common/gifmanager.cpp b/LEGO1/lego/legoomni/src/common/gifmanager.cpp index e9b10d49..c83714d4 100644 --- a/LEGO1/lego/legoomni/src/common/gifmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/gifmanager.cpp @@ -24,3 +24,9 @@ GifMapEntry* GifMap::FindNode(const char*& p_string) } return ret; } + +// STUB: LEGO1 0x10099870 +GifManager::~GifManager() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp index a636253a..c187344c 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp @@ -6,8 +6,14 @@ LegoPathController::LegoPathController() // TODO } -// STUB: LEGO1 0x10045740 -LegoPathController::~LegoPathController() +// STUB: LEGO1 0x10045880 +void LegoPathController::VTable0x14() +{ + // TODO +} + +// STUB: LEGO1 0x10045b20 +void LegoPathController::Destroy() { // TODO } diff --git a/LEGO1/lego/sources/3dmanager/lego3dmanager.h b/LEGO1/lego/sources/3dmanager/lego3dmanager.h index ab2bdefc..9d993f26 100644 --- a/LEGO1/lego/sources/3dmanager/lego3dmanager.h +++ b/LEGO1/lego/sources/3dmanager/lego3dmanager.h @@ -57,6 +57,9 @@ class Lego3DManager { // ??? for now ViewLODListManager* GetViewLODListManager(); + // SYNTHETIC: LEGO1 0x100ab340 + // Lego3DManager::`scalar deleting destructor' + private: Tgl::Renderer* m_pRenderer; // 0x04 diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h index d257398e..302a0bd8 100644 --- a/LEGO1/lego/sources/roi/legoroi.h +++ b/LEGO1/lego/sources/roi/legoroi.h @@ -40,6 +40,9 @@ class LegoROI : public ViewROI { inline LegoEntity* GetUnknown0x104() { return m_unk0x104; } inline void SetUnknown0x104(LegoEntity* p_unk0x104) { m_unk0x104 = p_unk0x104; } + // SYNTHETIC: LEGO1 0x100a9ad0 + // LegoROI::`scalar deleting destructor' + private: undefined m_pad[0x24]; // 0xe0 LegoEntity* m_unk0x104; // 0x104 diff --git a/LEGO1/library_msvc.h b/LEGO1/library_msvc.h index 30cb9dcd..259ed919 100644 --- a/LEGO1/library_msvc.h +++ b/LEGO1/library_msvc.h @@ -45,6 +45,9 @@ // LIBRARY: LEGO1 0x1008b730 // _fprintf +// LIBRARY: LEGO1 0x1008b670 +// __purecall + // LIBRARY: LEGO1 0x1008b780 // _fwrite diff --git a/LEGO1/mxdirectx/mxdirect3d.h b/LEGO1/mxdirectx/mxdirect3d.h index 09047f0a..2d89ad39 100644 --- a/LEGO1/mxdirectx/mxdirect3d.h +++ b/LEGO1/mxdirectx/mxdirect3d.h @@ -66,6 +66,9 @@ class MxDirect3D : public MxDirectDraw { inline IDirect3D2* GetDirect3D() { return this->m_pDirect3d; } inline IDirect3DDevice2* GetDirect3DDevice() { return this->m_pDirect3dDevice; } + // SYNTHETIC: LEGO1 0x1009b120 + // MxDirect3D::`scalar deleting destructor' + private: MxAssignedDevice* m_assignedDevice; // 0x880 IDirect3D2* m_pDirect3d; // 0x884 diff --git a/LEGO1/mxdirectx/mxdirectdraw.h b/LEGO1/mxdirectx/mxdirectdraw.h index 490233b5..b8f5f551 100644 --- a/LEGO1/mxdirectx/mxdirectdraw.h +++ b/LEGO1/mxdirectx/mxdirectdraw.h @@ -83,6 +83,9 @@ class MxDirectDraw { inline IDirectDrawSurface* GetBackBuffer() { return m_pBackBuffer; } inline IDirectDrawClipper* GetClipper() { return m_pClipper; } + // SYNTHETIC: LEGO1 0x1009d510 + // MxDirectDraw::`scalar deleting destructor' + protected: BOOL m_bOnlySoftRender; // 0x04 BOOL m_bFlipSurfaces; // 0x08 diff --git a/LEGO1/omni/include/mxaudiomanager.h b/LEGO1/omni/include/mxaudiomanager.h index a7b58fd0..94b5c4c9 100644 --- a/LEGO1/omni/include/mxaudiomanager.h +++ b/LEGO1/omni/include/mxaudiomanager.h @@ -19,6 +19,9 @@ class MxAudioManager : public MxMediaManager { virtual void SetVolume(MxS32 p_volume); // vtable+2c + // SYNTHETIC: LEGO1 0x100b8d70 + // MxAudioManager::`scalar deleting destructor' + private: void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/omni/include/mxbitmap.h b/LEGO1/omni/include/mxbitmap.h index d756b865..b88a1976 100644 --- a/LEGO1/omni/include/mxbitmap.h +++ b/LEGO1/omni/include/mxbitmap.h @@ -92,6 +92,9 @@ class MxBitmap : public MxCore { return -GetBmiStride(); } + // SYNTHETIC: LEGO1 0x100bc9f0 + // MxBitmap::`scalar deleting destructor' + private: MxResult ImportColorsToPalette(RGBQUAD*, MxPalette*); diff --git a/LEGO1/omni/include/mxcore.h b/LEGO1/omni/include/mxcore.h index 22c06d32..cae7020e 100644 --- a/LEGO1/omni/include/mxcore.h +++ b/LEGO1/omni/include/mxcore.h @@ -34,6 +34,9 @@ class MxCore { inline MxU32 GetId() { return m_id; } + // SYNTHETIC: LEGO1 0x100ae1c0 + // MxCore::`scalar deleting destructor' + private: MxU32 m_id; // 0x04 }; diff --git a/LEGO1/omni/include/mxdsaction.h b/LEGO1/omni/include/mxdsaction.h index 35abcb81..67449868 100644 --- a/LEGO1/omni/include/mxdsaction.h +++ b/LEGO1/omni/include/mxdsaction.h @@ -83,6 +83,9 @@ class MxDSAction : public MxDSObject { SetFlags(GetFlags() | MxDSAction::c_bit3); } + // SYNTHETIC: LEGO1 0x100ada60 + // MxDSAction::`scalar deleting destructor' + protected: MxU32 m_sizeOnDisk; // 0x2c MxU32 m_flags; // 0x30 diff --git a/LEGO1/omni/include/mxdsactionlist.h b/LEGO1/omni/include/mxdsactionlist.h index 7ae9ab56..75d96842 100644 --- a/LEGO1/omni/include/mxdsactionlist.h +++ b/LEGO1/omni/include/mxdsactionlist.h @@ -27,6 +27,9 @@ class MxDSActionList : public MxList { // FUNCTION: LEGO1 0x100c9cb0 static void Destroy(MxDSAction* p_action) { delete p_action; } + // SYNTHETIC: LEGO1 0x100c9dc0 + // MxDSActionList::`scalar deleting destructor' + private: undefined m_unk0x18; }; diff --git a/LEGO1/omni/include/mxdsanim.h b/LEGO1/omni/include/mxdsanim.h index 213fcf87..0e5b9a0c 100644 --- a/LEGO1/omni/include/mxdsanim.h +++ b/LEGO1/omni/include/mxdsanim.h @@ -27,6 +27,9 @@ class MxDSAnim : public MxDSMediaAction { } virtual MxDSAction* Clone() override; // vtable+2c; + + // SYNTHETIC: LEGO1 0x100c9180 + // MxDSAnim::`scalar deleting destructor' }; #endif // MXDSANIM_H diff --git a/LEGO1/omni/include/mxdsbuffer.h b/LEGO1/omni/include/mxdsbuffer.h index 27770f5f..01696471 100644 --- a/LEGO1/omni/include/mxdsbuffer.h +++ b/LEGO1/omni/include/mxdsbuffer.h @@ -75,6 +75,9 @@ class MxDSBuffer : public MxCore { inline void SetMode(Type p_mode) { m_mode = p_mode; } inline void SetUnk30(MxDSStreamingAction* p_unk0x30) { m_unk0x30 = p_unk0x30; } + // SYNTHETIC: LEGO1 0x100c6510 + // MxDSBuffer::`scalar deleting destructor' + private: MxU8* m_pBuffer; // 0x08 MxU8* m_pIntoBuffer; // 0x0c diff --git a/LEGO1/omni/include/mxdschunk.h b/LEGO1/omni/include/mxdschunk.h index cd0816a0..52806580 100644 --- a/LEGO1/omni/include/mxdschunk.h +++ b/LEGO1/omni/include/mxdschunk.h @@ -57,6 +57,9 @@ class MxDSChunk : public MxCore { delete[] m_data; } + // SYNTHETIC: LEGO1 0x100be150 + // MxDSChunk::`scalar deleting destructor' + protected: MxU16 m_flags; // 0x8 MxU32 m_objectId; // 0xc diff --git a/LEGO1/omni/include/mxdsevent.h b/LEGO1/omni/include/mxdsevent.h index 5d002a88..1a197496 100644 --- a/LEGO1/omni/include/mxdsevent.h +++ b/LEGO1/omni/include/mxdsevent.h @@ -26,6 +26,9 @@ class MxDSEvent : public MxDSMediaAction { } virtual MxDSAction* Clone() override; // vtable+2c; + + // SYNTHETIC: LEGO1 0x100c9780 + // MxDSEvent::`scalar deleting destructor' }; #endif // MXDSEVENT_H diff --git a/LEGO1/omni/include/mxdsfile.h b/LEGO1/omni/include/mxdsfile.h index 34afeccb..473b9741 100644 --- a/LEGO1/omni/include/mxdsfile.h +++ b/LEGO1/omni/include/mxdsfile.h @@ -38,6 +38,9 @@ class MxDSFile : public MxDSSource { inline MxS32 CalcFileSize() { return GetFileSize(m_io.m_info.hmmio, NULL); } + // SYNTHETIC: LEGO1 0x100c01e0 + // MxDSFile::`scalar deleting destructor' + private: MxLong ReadChunks(); struct ChunkHeader { diff --git a/LEGO1/omni/include/mxdsmultiaction.h b/LEGO1/omni/include/mxdsmultiaction.h index a600b787..efc1a11d 100644 --- a/LEGO1/omni/include/mxdsmultiaction.h +++ b/LEGO1/omni/include/mxdsmultiaction.h @@ -38,6 +38,9 @@ class MxDSMultiAction : public MxDSAction { inline MxDSActionList* GetActionList() const { return m_actions; }; + // SYNTHETIC: LEGO1 0x100ca040 + // MxDSMultiAction::`scalar deleting destructor' + protected: MxU32 m_sizeOnDisk; // 0x94 MxDSActionList* m_actions; // 0x98 diff --git a/LEGO1/omni/include/mxdsobject.h b/LEGO1/omni/include/mxdsobject.h index b5bfd470..ad1cae40 100644 --- a/LEGO1/omni/include/mxdsobject.h +++ b/LEGO1/omni/include/mxdsobject.h @@ -63,6 +63,9 @@ class MxDSObject : public MxCore { inline void ClearAtom() { m_atomId.Clear(); } + // SYNTHETIC: LEGO1 0x100bf7c0 + // MxDSObject::`scalar deleting destructor' + private: MxU32 m_sizeOnDisk; // 0x8 MxU16 m_type; // 0xc diff --git a/LEGO1/omni/include/mxdsobjectaction.h b/LEGO1/omni/include/mxdsobjectaction.h index a31f6d6b..77480452 100644 --- a/LEGO1/omni/include/mxdsobjectaction.h +++ b/LEGO1/omni/include/mxdsobjectaction.h @@ -27,6 +27,9 @@ class MxDSObjectAction : public MxDSMediaAction { virtual MxDSAction* Clone() override; // vtable+2c; virtual void CopyFrom(MxDSObjectAction& p_dsObjectAction); // vtable+44; + + // SYNTHETIC: LEGO1 0x100c8a00 + // MxDSObjectAction::`scalar deleting destructor' }; #endif // MXDSOBJECTACTION_H diff --git a/LEGO1/omni/include/mxdsselectaction.h b/LEGO1/omni/include/mxdsselectaction.h index 6b68bfc9..f7c6a148 100644 --- a/LEGO1/omni/include/mxdsselectaction.h +++ b/LEGO1/omni/include/mxdsselectaction.h @@ -32,6 +32,9 @@ class MxDSSelectAction : public MxDSParallelAction { virtual void Deserialize(MxU8** p_source, MxS16 p_unk0x24) override; // vtable+1c; virtual MxDSAction* Clone() override; // vtable+2c; + // SYNTHETIC: LEGO1 0x100cb840 + // MxDSSelectAction::`scalar deleting destructor' + private: MxString m_unk0x9c; MxStringList* m_unk0xac; diff --git a/LEGO1/omni/include/mxdsserialaction.h b/LEGO1/omni/include/mxdsserialaction.h index c4fa18b3..694c9afa 100644 --- a/LEGO1/omni/include/mxdsserialaction.h +++ b/LEGO1/omni/include/mxdsserialaction.h @@ -31,6 +31,9 @@ class MxDSSerialAction : public MxDSMultiAction { virtual void SetDuration(MxLong p_duration) override; // vtable+28; virtual MxDSAction* Clone() override; // vtable+2c; + // SYNTHETIC: LEGO1 0x100cabf0 + // MxDSSerialAction::`scalar deleting destructor' + private: MxDSActionListCursor* m_cursor; undefined4 m_unk0xa0; diff --git a/LEGO1/omni/include/mxdssound.h b/LEGO1/omni/include/mxdssound.h index 5dc6bbd7..3d1fa31d 100644 --- a/LEGO1/omni/include/mxdssound.h +++ b/LEGO1/omni/include/mxdssound.h @@ -32,6 +32,9 @@ class MxDSSound : public MxDSMediaAction { inline MxS32 GetVolume() const { return m_volume; } + // SYNTHETIC: LEGO1 0x100c9450 + // MxDSSound::`scalar deleting destructor' + private: MxU32 m_sizeOnDisk; MxS32 m_volume; // 0xbc diff --git a/LEGO1/omni/include/mxdsstill.h b/LEGO1/omni/include/mxdsstill.h index 268fe79f..4de69475 100644 --- a/LEGO1/omni/include/mxdsstill.h +++ b/LEGO1/omni/include/mxdsstill.h @@ -27,6 +27,9 @@ class MxDSStill : public MxDSMediaAction { } virtual MxDSAction* Clone() override; // vtable+2c; + + // SYNTHETIC: LEGO1 0x100c9a50 + // MxDSStill::`scalar deleting destructor' }; #endif // MXDSSTILL_H diff --git a/LEGO1/omni/include/mxdsstreamingaction.h b/LEGO1/omni/include/mxdsstreamingaction.h index ab21bac2..074bd5ed 100644 --- a/LEGO1/omni/include/mxdsstreamingaction.h +++ b/LEGO1/omni/include/mxdsstreamingaction.h @@ -44,6 +44,9 @@ class MxDSStreamingAction : public MxDSAction { inline void SetUnknowna4(MxDSBuffer* p_unk0xa4) { m_unk0xa4 = p_unk0xa4; } inline void SetBufferOffset(MxU32 p_bufferOffset) { m_bufferOffset = p_bufferOffset; } + // SYNTHETIC: LEGO1 0x100cd0b0 + // MxDSStreamingAction::`scalar deleting destructor' + private: MxU32 m_unk0x94; // 0x94 MxU32 m_bufferOffset; // 0x98 diff --git a/LEGO1/omni/include/mxentity.h b/LEGO1/omni/include/mxentity.h index cc77cea2..e78d3b2b 100644 --- a/LEGO1/omni/include/mxentity.h +++ b/LEGO1/omni/include/mxentity.h @@ -48,6 +48,9 @@ class MxEntity : public MxCore { inline MxS32 GetEntityId() { return m_mxEntityId; } inline MxAtomId& GetAtom() { return m_atom; } + // SYNTHETIC: LEGO1 0x1000c210 + // MxEntity::`scalar deleting destructor' + protected: MxS32 m_mxEntityId; // 0x8 MxAtomId m_atom; // 0xc diff --git a/LEGO1/omni/include/mxeventmanager.h b/LEGO1/omni/include/mxeventmanager.h index e7f41a6d..c21e92bc 100644 --- a/LEGO1/omni/include/mxeventmanager.h +++ b/LEGO1/omni/include/mxeventmanager.h @@ -14,6 +14,9 @@ class MxEventManager : public MxMediaManager { virtual void Destroy() override; // vtable+18 virtual MxResult Create(MxU32 p_frequencyMS, MxBool p_createThread); // vtable+28 + // SYNTHETIC: LEGO1 0x100c03d0 + // MxEventManager::`scalar deleting destructor' + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/omni/include/mxeventpresenter.h b/LEGO1/omni/include/mxeventpresenter.h index 201b15e5..52d503df 100644 --- a/LEGO1/omni/include/mxeventpresenter.h +++ b/LEGO1/omni/include/mxeventpresenter.h @@ -31,6 +31,9 @@ class MxEventPresenter : public MxMediaPresenter { virtual MxResult PutData() override; // vtable+0x4c virtual void CopyData(MxStreamChunk* p_chunk); // vtable+0x5c + // SYNTHETIC: LEGO1 0x100c2d20 + // MxEventPresenter::`scalar deleting destructor' + private: void Init(); diff --git a/LEGO1/omni/include/mxflcpresenter.h b/LEGO1/omni/include/mxflcpresenter.h index 0ad44de3..d883d106 100644 --- a/LEGO1/omni/include/mxflcpresenter.h +++ b/LEGO1/omni/include/mxflcpresenter.h @@ -30,6 +30,9 @@ class MxFlcPresenter : public MxVideoPresenter { virtual void CreateBitmap() override; // vtable+0x60 virtual void RealizePalette() override; // vtable+0x70 + // SYNTHETIC: LEGO1 0x100b3400 + // MxFlcPresenter::`scalar deleting destructor' + protected: FLIC_HEADER* m_flicHeader; }; diff --git a/LEGO1/omni/include/mxloopingflcpresenter.h b/LEGO1/omni/include/mxloopingflcpresenter.h index c05c3657..9e035afc 100644 --- a/LEGO1/omni/include/mxloopingflcpresenter.h +++ b/LEGO1/omni/include/mxloopingflcpresenter.h @@ -20,6 +20,9 @@ class MxLoopingFlcPresenter : public MxFlcPresenter { virtual void NextFrame() override; // vtable+0x64 + // SYNTHETIC: LEGO1 0x100b4390 + // MxLoopingFlcPresenter::`scalar deleting destructor' + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/omni/include/mxmediamanager.h b/LEGO1/omni/include/mxmediamanager.h index aefbd9f6..25853adf 100644 --- a/LEGO1/omni/include/mxmediamanager.h +++ b/LEGO1/omni/include/mxmediamanager.h @@ -23,6 +23,9 @@ class MxMediaManager : public MxCore { MxResult Init(); + // SYNTHETIC: LEGO1 0x100b8540 + // MxMediaManager::`scalar deleting destructor' + protected: MxPresenterList* m_presenters; // 0x8 MxThread* m_thread; // 0xc diff --git a/LEGO1/omni/include/mxmediapresenter.h b/LEGO1/omni/include/mxmediapresenter.h index 360e978e..954a2dcc 100644 --- a/LEGO1/omni/include/mxmediapresenter.h +++ b/LEGO1/omni/include/mxmediapresenter.h @@ -42,6 +42,9 @@ class MxMediaPresenter : public MxPresenter { virtual void Enable(MxBool p_enable) override; // vtable+0x54 virtual void LoopChunk(MxStreamChunk* p_chunk); // vtable+0x58 + // SYNTHETIC: LEGO1 0x1000c680 + // MxMediaPresenter::`scalar deleting destructor' + protected: MxDSSubscriber* m_subscriber; // 0x40 MxStreamChunkList* m_loopingChunks; // 0x44 diff --git a/LEGO1/omni/include/mxmidipresenter.h b/LEGO1/omni/include/mxmidipresenter.h index 2ec11b0b..0bde447c 100644 --- a/LEGO1/omni/include/mxmidipresenter.h +++ b/LEGO1/omni/include/mxmidipresenter.h @@ -33,6 +33,9 @@ class MxMIDIPresenter : public MxMusicPresenter { virtual MxResult PutData() override; // vtable+0x4c virtual void SetVolume(MxS32 p_volume) override; // vtable+0x60 + // SYNTHETIC: LEGO1 0x100c27a0 + // MxMIDIPresenter::`scalar deleting destructor' + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/omni/include/mxmusicmanager.h b/LEGO1/omni/include/mxmusicmanager.h index d9f6d46d..f2afe437 100644 --- a/LEGO1/omni/include/mxmusicmanager.h +++ b/LEGO1/omni/include/mxmusicmanager.h @@ -38,6 +38,9 @@ class MxMusicManager : public MxAudioManager { MxS32 m_multiplier; // 0x50 DWORD m_midiVolume; // 0x54 + // SYNTHETIC: LEGO1 0x100c0610 + // MxMusicManager::`scalar deleting destructor' + protected: void Init(); void InitData(); diff --git a/LEGO1/omni/include/mxmusicpresenter.h b/LEGO1/omni/include/mxmusicpresenter.h index bba2afb0..88be5c7f 100644 --- a/LEGO1/omni/include/mxmusicpresenter.h +++ b/LEGO1/omni/include/mxmusicpresenter.h @@ -26,6 +26,9 @@ class MxMusicPresenter : public MxAudioPresenter { virtual MxResult AddToManager() override; // vtable+0x34 virtual void Destroy() override; // vtable+0x38 + // SYNTHETIC: LEGO1 0x100c24c0 + // MxMusicPresenter::`scalar deleting destructor' + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/omni/include/mxnextactiondatastart.h b/LEGO1/omni/include/mxnextactiondatastart.h index 15e35b00..3b58a338 100644 --- a/LEGO1/omni/include/mxnextactiondatastart.h +++ b/LEGO1/omni/include/mxnextactiondatastart.h @@ -33,6 +33,9 @@ class MxNextActionDataStart : public MxCore { inline MxU32 GetData() const { return m_data; } inline void SetData(MxU32 p_data) { m_data = p_data; } + // SYNTHETIC: LEGO1 0x100c1990 + // MxNextActionDataStart::`scalar deleting destructor' + private: MxU32 m_objectId; // 0x08 MxS16 m_unk0x24; // 0x0c diff --git a/LEGO1/omni/include/mxnotificationmanager.h b/LEGO1/omni/include/mxnotificationmanager.h index b93cc7c8..4ed58f62 100644 --- a/LEGO1/omni/include/mxnotificationmanager.h +++ b/LEGO1/omni/include/mxnotificationmanager.h @@ -48,6 +48,9 @@ class MxNotificationManager : public MxCore { inline MxNotificationPtrList* GetQueue() { return m_queue; } inline void SetActive(MxBool p_active) { m_active = p_active; } + // SYNTHETIC: LEGO1 0x100ac390 + // MxNotificationManager::`scalar deleting destructor' + private: void FlushPending(MxCore* p_listener); }; diff --git a/LEGO1/omni/include/mxobjectfactory.h b/LEGO1/omni/include/mxobjectfactory.h index 3741bfa3..4ae3e348 100644 --- a/LEGO1/omni/include/mxobjectfactory.h +++ b/LEGO1/omni/include/mxobjectfactory.h @@ -39,6 +39,9 @@ class MxObjectFactory : public MxCore { virtual MxCore* Create(const char* p_name); // vtable 0x14 virtual void Destroy(MxCore* p_object); // vtable 0x18 + // SYNTHETIC: LEGO1 0x100b1160 + // MxObjectFactory::`scalar deleting destructor' + private: #define X(V) MxAtomId m_id##V; FOR_MXOBJECTFACTORY_OBJECTS(X) diff --git a/LEGO1/omni/include/mxomni.h b/LEGO1/omni/include/mxomni.h index 9f448c26..52faf709 100644 --- a/LEGO1/omni/include/mxomni.h +++ b/LEGO1/omni/include/mxomni.h @@ -73,6 +73,9 @@ class MxOmni : public MxCore { MxAtomIdCounterSet* GetAtomIdCounterSet() const { return this->m_atomIdCounterSet; } MxLong HandleActionEnd(MxParam& p_param); + // SYNTHETIC: LEGO1 0x100aefd0 + // MxOmni::`scalar deleting destructor' + protected: static MxOmni* g_instance; diff --git a/LEGO1/omni/include/mxomnicreateparam.h b/LEGO1/omni/include/mxomnicreateparam.h index 5404f39a..53539bc6 100644 --- a/LEGO1/omni/include/mxomnicreateparam.h +++ b/LEGO1/omni/include/mxomnicreateparam.h @@ -24,6 +24,9 @@ class MxOmniCreateParam : public MxParam { MxVideoParam& GetVideoParam() { return m_videoParam; } const MxVideoParam& GetVideoParam() const { return m_videoParam; } + // SYNTHETIC: LEGO1 0x100b0a70 + // MxOmniCreateParam::`scalar deleting destructor' + private: MxString m_mediaPath; HWND m_windowHandle; diff --git a/LEGO1/omni/include/mxpalette.h b/LEGO1/omni/include/mxpalette.h index 90ffa605..5ed5e80f 100644 --- a/LEGO1/omni/include/mxpalette.h +++ b/LEGO1/omni/include/mxpalette.h @@ -28,6 +28,9 @@ class MxPalette : public MxCore { inline void SetOverrideSkyColor(MxBool p_value) { this->m_overrideSkyColor = p_value; } + // SYNTHETIC: LEGO1 0x100beeb0 + // MxPalette::`scalar deleting destructor' + private: LPDIRECTDRAWPALETTE m_palette; PALETTEENTRY m_entries[256]; // 0xc diff --git a/LEGO1/omni/include/mxpresenter.h b/LEGO1/omni/include/mxpresenter.h index d50e9818..a6b3eca8 100644 --- a/LEGO1/omni/include/mxpresenter.h +++ b/LEGO1/omni/include/mxpresenter.h @@ -129,6 +129,9 @@ class MxPresenter : public MxCore { m_compositePresenter = p_compositePresenter; } + // SYNTHETIC: LEGO1 0x1000c070 + // MxPresenter::`scalar deleting destructor' + protected: __declspec(dllexport) void Init(); diff --git a/LEGO1/omni/include/mxpresenterlist.h b/LEGO1/omni/include/mxpresenterlist.h index f346e645..257d0996 100644 --- a/LEGO1/omni/include/mxpresenterlist.h +++ b/LEGO1/omni/include/mxpresenterlist.h @@ -18,6 +18,9 @@ class MxPresenterList : public MxPtrList { { return p_a == p_b ? 0 : p_a < p_b ? -1 : 1; }; // vtable+0x14 + + // SYNTHETIC: LEGO1 0x1001ceb0 + // MxPresenterList::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100d6488 diff --git a/LEGO1/omni/include/mxregion.h b/LEGO1/omni/include/mxregion.h index 646866a6..5659ba81 100644 --- a/LEGO1/omni/include/mxregion.h +++ b/LEGO1/omni/include/mxregion.h @@ -23,6 +23,9 @@ class MxRegion : public MxCore { friend class MxRegionCursor; + // SYNTHETIC: LEGO1 0x100c3670 + // MxRegion::`scalar deleting destructor' + private: MxRegionTopBottomList* m_list; // 0x08 MxRect32 m_rect; // 0x0c diff --git a/LEGO1/omni/include/mxregionlist.h b/LEGO1/omni/include/mxregionlist.h index 679ccebc..9dfd78bd 100644 --- a/LEGO1/omni/include/mxregionlist.h +++ b/LEGO1/omni/include/mxregionlist.h @@ -40,6 +40,9 @@ struct MxRegionLeftRight { class MxRegionLeftRightList : public MxPtrList { public: MxRegionLeftRightList() : MxPtrList(TRUE) {} + + // SYNTHETIC: LEGO1 0x100c4e90 + // MxRegionLeftRightList::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dcbf8 @@ -95,6 +98,9 @@ struct MxRegionTopBottom { class MxRegionTopBottomList : public MxPtrList { public: MxRegionTopBottomList() : MxPtrList(TRUE) {} + + // SYNTHETIC: LEGO1 0x100c3410 + // MxRegionTopBottomList::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dcb70 diff --git a/LEGO1/omni/include/mxsmkpresenter.h b/LEGO1/omni/include/mxsmkpresenter.h index 4c3913cc..eeb12945 100644 --- a/LEGO1/omni/include/mxsmkpresenter.h +++ b/LEGO1/omni/include/mxsmkpresenter.h @@ -33,6 +33,9 @@ class MxSmkPresenter : public MxVideoPresenter { virtual void RealizePalette() override; // vtable+0x70 virtual void VTable0x88(); // vtable+0x88 + // SYNTHETIC: LEGO1 0x100b3850 + // MxSmkPresenter::`scalar deleting destructor' + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/omni/include/mxsoundpresenter.h b/LEGO1/omni/include/mxsoundpresenter.h index 1d49204a..1949617f 100644 --- a/LEGO1/omni/include/mxsoundpresenter.h +++ b/LEGO1/omni/include/mxsoundpresenter.h @@ -29,6 +29,9 @@ class MxSoundPresenter : public MxAudioPresenter { // FUNCTION: LEGO1 0x1000d490 virtual void Destroy() override { Destroy(FALSE); }; // vtable+0x38 + // SYNTHETIC: LEGO1 0x1000d5c0 + // MxSoundPresenter::`scalar deleting destructor' + protected: void Destroy(MxBool p_fromDestructor); }; diff --git a/LEGO1/omni/include/mxstreamchunklist.h b/LEGO1/omni/include/mxstreamchunklist.h index 2d1ce119..9d8aec0e 100644 --- a/LEGO1/omni/include/mxstreamchunklist.h +++ b/LEGO1/omni/include/mxstreamchunklist.h @@ -26,6 +26,9 @@ class MxStreamChunkList : public MxList { // FUNCTION: LEGO1 0x100b5920 static void Destroy(MxStreamChunk* p_chunk) { delete p_chunk; } + + // SYNTHETIC: LEGO1 0x100b5a30 + // MxStreamChunkList::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dc510 diff --git a/LEGO1/omni/include/mxstring.h b/LEGO1/omni/include/mxstring.h index 6d8a9936..65c15d3e 100644 --- a/LEGO1/omni/include/mxstring.h +++ b/LEGO1/omni/include/mxstring.h @@ -22,6 +22,9 @@ class MxString : public MxCore { inline MxS8 Compare(const MxString& p_str) const { return strcmp(m_data, p_str.m_data); } inline const char* GetData() const { return m_data; } + // SYNTHETIC: LEGO1 0x100ae280 + // MxString::`scalar deleting destructor' + private: char* m_data; // 0x08 MxU16 m_length; // 0x0c diff --git a/LEGO1/omni/include/mxstringlist.h b/LEGO1/omni/include/mxstringlist.h index 2a61f530..6d07584f 100644 --- a/LEGO1/omni/include/mxstringlist.h +++ b/LEGO1/omni/include/mxstringlist.h @@ -13,6 +13,9 @@ class MxStringList : public MxList {}; class MxStringListCursor : public MxListCursor { public: MxStringListCursor(MxStringList* p_list) : MxListCursor(p_list){}; + + // SYNTHETIC: LEGO1 0x100cb860 + // MxStringList::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dd010 diff --git a/LEGO1/omni/include/mxthread.h b/LEGO1/omni/include/mxthread.h index e3af186d..5ab80041 100644 --- a/LEGO1/omni/include/mxthread.h +++ b/LEGO1/omni/include/mxthread.h @@ -21,6 +21,9 @@ class MxThread { inline MxBool IsRunning() { return m_running; } + // SYNTHETIC: LEGO1 0x100bf580 + // MxThread::`scalar deleting destructor' + protected: MxThread(); @@ -48,6 +51,9 @@ class MxTickleThread : public MxThread { MxResult Run() override; + // SYNTHETIC: LEGO1 0x100b8c20 + // MxTickleThread::`scalar deleting destructor' + private: MxS32 m_frequencyMS; // 0x1c }; diff --git a/LEGO1/omni/include/mxticklemanager.h b/LEGO1/omni/include/mxticklemanager.h index 0fdb648a..6ebd655b 100644 --- a/LEGO1/omni/include/mxticklemanager.h +++ b/LEGO1/omni/include/mxticklemanager.h @@ -44,6 +44,9 @@ class MxTickleManager : public MxCore { virtual void SetClientTickleInterval(MxCore* p_client, MxTime p_interval); // vtable+0x1c virtual MxTime GetClientTickleInterval(MxCore* p_client); // vtable+0x20 + // SYNTHETIC: LEGO1 0x1005a510 + // MxTickleManager::`scalar deleting destructor' + private: MxTickleClientPtrList m_clients; // 0x8 }; diff --git a/LEGO1/omni/include/mxtimer.h b/LEGO1/omni/include/mxtimer.h index 70d52d79..63b597ac 100644 --- a/LEGO1/omni/include/mxtimer.h +++ b/LEGO1/omni/include/mxtimer.h @@ -22,6 +22,9 @@ class MxTimer : public MxCore { return g_lastTimeCalculated - this->m_startTime; } + // SYNTHETIC: LEGO1 0x100ae0d0 + // MxTimer::`scalar deleting destructor' + private: MxLong m_startTime; MxBool m_isRunning; diff --git a/LEGO1/omni/include/mxvariabletable.h b/LEGO1/omni/include/mxvariabletable.h index 0d79570c..fd5cdea2 100644 --- a/LEGO1/omni/include/mxvariabletable.h +++ b/LEGO1/omni/include/mxvariabletable.h @@ -18,6 +18,9 @@ class MxVariableTable : public MxHashTable { virtual MxS8 Compare(MxVariable*, MxVariable*) override; // vtable+0x14 virtual MxU32 Hash(MxVariable*) override; // vtable+0x18 + + // SYNTHETIC: LEGO1 0x100afdd0 + // MxVariableTable::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dc1b0 @@ -56,6 +59,9 @@ class MxVariableTable : public MxHashTable { // TEMPLATE: LEGO1 0x100b7680 // MxHashTableCursor::~MxHashTableCursor +// SYNTHETIC: LEGO1 0x100b76d0 +// MxHashTableCursor::`scalar deleting destructor' + // TEMPLATE: LEGO1 0x100b7ab0 // MxHashTable::Resize diff --git a/LEGO1/omni/include/mxvideomanager.h b/LEGO1/omni/include/mxvideomanager.h index 4befdb9c..57919da3 100644 --- a/LEGO1/omni/include/mxvideomanager.h +++ b/LEGO1/omni/include/mxvideomanager.h @@ -44,6 +44,9 @@ class MxVideoManager : public MxMediaManager { inline MxDisplaySurface* GetDisplaySurface() { return this->m_displaySurface; } inline MxRegion* GetRegion() { return this->m_region; } + // SYNTHETIC: LEGO1 0x100be280 + // MxVideoManager::`scalar deleting destructor' + protected: MxVideoParam m_videoParam; // 0x2c LPDIRECTDRAW m_pDirectDraw; // 0x50 diff --git a/LEGO1/omni/include/mxvideopresenter.h b/LEGO1/omni/include/mxvideopresenter.h index f91f2eb7..f338b972 100644 --- a/LEGO1/omni/include/mxvideopresenter.h +++ b/LEGO1/omni/include/mxvideopresenter.h @@ -92,11 +92,17 @@ class MxVideoPresenter : public MxMediaPresenter { virtual ~AlphaMask(); MxS32 IsHit(MxU32 p_x, MxU32 p_y); + + // SYNTHETIC: LEGO1 0x100b2650 + // MxVideoPresenter::AlphaMask::`scalar deleting destructor' }; inline MxS32 PrepareRects(MxRect32& p_rectDest, MxRect32& p_rectSrc); inline MxBitmap* GetBitmap() { return m_bitmap; } + // SYNTHETIC: LEGO1 0x1000c910 + // MxVideoPresenter::`scalar deleting destructor' + private: void Init(); diff --git a/LEGO1/omni/include/mxwavepresenter.h b/LEGO1/omni/include/mxwavepresenter.h index 3bdf734f..bffefe15 100644 --- a/LEGO1/omni/include/mxwavepresenter.h +++ b/LEGO1/omni/include/mxwavepresenter.h @@ -57,6 +57,9 @@ class MxWavePresenter : public MxSoundPresenter { MxU32 m_flags; }; + // SYNTHETIC: LEGO1 0x1000d810 + // MxWavePresenter::`scalar deleting destructor' + protected: void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/realtime/matrix.h b/LEGO1/realtime/matrix.h index 4e661ddb..9a301a01 100644 --- a/LEGO1/realtime/matrix.h +++ b/LEGO1/realtime/matrix.h @@ -58,7 +58,7 @@ class Matrix4 { m_data[3][3] = 1.0f; } // vtable+0x24 - // FUNCTION: LEGO1 0x10002850 + // FUNCTION: LEGO1 0x10002420 virtual void operator=(const Matrix4& p_matrix) { Equals(p_matrix); } // vtable+0x28 // FUNCTION: LEGO1 0x10002430 diff --git a/LEGO1/realtime/roi.h b/LEGO1/realtime/roi.h index 2cdf943a..08db5080 100644 --- a/LEGO1/realtime/roi.h +++ b/LEGO1/realtime/roi.h @@ -103,6 +103,9 @@ class ROI { int GetLODCount() const { return m_lods ? m_lods->Size() : 0; } const CompoundObject* GetComp() const { return m_comp; } + // SYNTHETIC: LEGO1 0x100a5d60 + // ROI::`scalar deleting destructor' + protected: CompoundObject* m_comp; // 0x4 LODListBase* m_lods; // 0x8 diff --git a/LEGO1/tgl/tgl.h b/LEGO1/tgl/tgl.h index 137a78ff..b8a09c3e 100644 --- a/LEGO1/tgl/tgl.h +++ b/LEGO1/tgl/tgl.h @@ -104,6 +104,9 @@ class Object { virtual ~Object() {} virtual void* ImplementationDataPtr() = 0; + + // SYNTHETIC: LEGO1 0x100a2250 + // Tgl::Object::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100db948 @@ -142,6 +145,9 @@ class Renderer : public Object { // vtable+0x30 virtual Result SetTextureDefaultColorCount(unsigned long) = 0; + + // SYNTHETIC: LEGO1 0x100a17c0 + // Tgl::Renderer::`scalar deleting destructor' }; Renderer* CreateRenderer(); @@ -163,6 +169,9 @@ class Device : public Object { virtual Result Update() = 0; virtual void InitFromD3DDevice(Device*) = 0; virtual void InitFromWindowsDevice(Device*) = 0; + + // SYNTHETIC: LEGO1 0x100a28e0 + // Tgl::Device::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dba28 @@ -217,12 +226,18 @@ class View : public Object { const Group**& rppPickedGroups, int& rPickedGroupCount ) = 0; + + // SYNTHETIC: LEGO1 0x100a2950 + // Tgl::View::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dbae8 class Camera : public Object { public: virtual Result SetTransformation(FloatMatrix4&) = 0; + + // SYNTHETIC: LEGO1 0x100a2a30 + // Tgl::Camera::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dbb08 @@ -230,6 +245,9 @@ class Light : public Object { public: virtual Result SetTransformation(FloatMatrix4&) = 0; virtual Result SetColor(float r, float g, float b) = 0; + + // SYNTHETIC: LEGO1 0x100a2aa0 + // Tgl::Light::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dbbb0 @@ -247,6 +265,9 @@ class Mesh : public Object { // Just get another Group pointing to the same underlying data virtual Mesh* ShallowClone(Unk*) = 0; + + // SYNTHETIC: LEGO1 0x100a3e60 + // Tgl::Mesh::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dbaa0 @@ -266,6 +287,9 @@ class Group : public Object { // This is TransformLocalToWorld in the leak, however it seems // to have been replaced by something else in the shipped code. virtual Result Unknown() = 0; + + // SYNTHETIC: LEGO1 0x100a29c0 + // Tgl::Group::`scalar deleting destructor' }; // Don't know what this is. Seems like another Tgl object which @@ -285,6 +309,9 @@ class Unk : public Object { ) = 0; virtual Result GetBoundingBox(float min[3], float max[3]) = 0; virtual Unk* Clone() = 0; + + // SYNTHETIC: LEGO1 0x100a2b10 + // Tgl::Unk::`scalar deleting destructor' }; // VTABLE: LEGO1 0x100dbb68 @@ -305,6 +332,9 @@ class Texture : public Object { PaletteEntry** ppPalette ) = 0; virtual Result SetPalette(int entryCount, PaletteEntry* pEntries) = 0; + + // SYNTHETIC: LEGO1 0x100a2b80 + // Tgl::Texture::`scalar deleting destructor' }; } // namespace Tgl diff --git a/LEGO1/viewmanager/viewlodlist.h b/LEGO1/viewmanager/viewlodlist.h index 1ecec3f8..df918350 100644 --- a/LEGO1/viewmanager/viewlodlist.h +++ b/LEGO1/viewmanager/viewlodlist.h @@ -89,6 +89,9 @@ class ViewLODListManager { void Dump(void (*pTracer)(const char*, ...)) const; #endif + // SYNTHETIC: LEGO1 0x100a70c0 + // ViewLODListManager::`scalar deleting destructor' + private: ViewLODListMap m_map; }; diff --git a/LEGO1/viewmanager/viewmanager.h b/LEGO1/viewmanager/viewmanager.h index 03b23366..f2ccc6c6 100644 --- a/LEGO1/viewmanager/viewmanager.h +++ b/LEGO1/viewmanager/viewmanager.h @@ -16,6 +16,9 @@ class ViewManager { void SetResolution(int width, int height); void SetFrustrum(float fov, float front, float back); + // SYNTHETIC: LEGO1 0x100a6000 + // ViewManager::`scalar deleting destructor' + private: undefined m_pad[0x1b8]; }; diff --git a/tools/isledecomp/isledecomp/compare/core.py b/tools/isledecomp/isledecomp/compare/core.py index c8ae7809..58f99d32 100644 --- a/tools/isledecomp/isledecomp/compare/core.py +++ b/tools/isledecomp/isledecomp/compare/core.py @@ -1,6 +1,7 @@ import os import logging import difflib +import struct from dataclasses import dataclass from typing import Iterable, List, Optional from isledecomp.cvdump.demangler import demangle_string_const @@ -18,6 +19,7 @@ @dataclass class DiffReport: + match_type: SymbolType orig_addr: int recomp_addr: int name: str @@ -214,17 +216,11 @@ def _match_thunks(self): # function in the first place. self._db.skip_compare(thunk_from_orig) - def get_one_function(self, addr: int) -> Optional[MatchInfo]: - """i.e. verbose mode for reccmp""" - return self._db.get_one_function(addr) - - def get_functions(self) -> List[MatchInfo]: - return self._db.get_matches(SymbolType.FUNCTION) - def _compare_function(self, match: MatchInfo) -> DiffReport: if match.size == 0: # Report a failed match to make the user aware of the empty function. return DiffReport( + match_type=SymbolType.FUNCTION, orig_addr=match.orig_addr, recomp_addr=match.recomp_addr, name=match.name, @@ -281,6 +277,7 @@ def recomp_lookup(addr: int) -> Optional[str]: unified_diff = [] return DiffReport( + match_type=SymbolType.FUNCTION, orig_addr=match.orig_addr, recomp_addr=match.recomp_addr, name=match.name, @@ -289,16 +286,121 @@ def recomp_lookup(addr: int) -> Optional[str]: is_effective_match=is_effective_match, ) - def compare_function(self, addr: int) -> Optional[DiffReport]: - match = self.get_one_function(addr) + def _compare_vtable(self, match: MatchInfo) -> DiffReport: + vtable_size = match.size + + # The vtable size should always be a multiple of 4 because that + # is the pointer size. If it is not (for whatever reason) + # it would cause iter_unpack to blow up so let's just fix it. + if vtable_size % 4 != 0: + logger.warning( + "Vtable for class %s has irregular size %d", match.name, vtable_size + ) + vtable_size = 4 * (vtable_size // 4) + + orig_table = self.orig_bin.read(match.orig_addr, vtable_size) + recomp_table = self.recomp_bin.read(match.recomp_addr, vtable_size) + + raw_addrs = zip( + [t for (t,) in struct.iter_unpack(" str: + """Format the function reference at this vtable index as text. + If we have not identified this function, we have the option to + display the raw address. This is only worth doing for the original addr + because we should always be able to identify the recomp function. + If the original function is missing then this probably means that the class + should override the given function from the superclass, but we have not + implemented this yet. + """ + index = f"vtable0x{i*4:02x}" + + if m is not None: + orig = hex(m.orig_addr) if m.orig_addr is not None else "no orig" + recomp = ( + hex(m.recomp_addr) if m.recomp_addr is not None else "no recomp" + ) + return f"{index:>12} : ({orig:10} / {recomp:10}) : {m.name}" + + if raw_addr is not None: + return f"{index:>12} : 0x{raw_addr:x} from orig not annotated." + + return f"{index:>12} : (no match)" + + orig_text = [] + recomp_text = [] + ratio = 0 + n_entries = 0 + + # Now compare each pointer from the two vtables. + for i, (raw_orig, raw_recomp) in enumerate(raw_addrs): + orig = self._db.get_by_orig(raw_orig) + recomp = self._db.get_by_recomp(raw_recomp) + + if ( + orig is not None + and recomp is not None + and orig.recomp_addr == recomp.recomp_addr + ): + ratio += 1 + + n_entries += 1 + orig_text.append(match_text(i, orig, raw_orig)) + recomp_text.append(match_text(i, recomp)) + + ratio = ratio / float(n_entries) if n_entries > 0 else 0 + + # n=100: Show the entire table if there is a diff to display. + # Otherwise it would be confusing if the table got cut off. + unified_diff = difflib.unified_diff(orig_text, recomp_text, n=100) + + return DiffReport( + match_type=SymbolType.VTABLE, + orig_addr=match.orig_addr, + recomp_addr=match.recomp_addr, + name=f"{match.name}::`vftable'", + udiff=unified_diff, + ratio=ratio, + ) + + def _compare_match(self, match: MatchInfo) -> Optional[DiffReport]: + """Router for comparison type""" + if match.compare_type == SymbolType.FUNCTION: + return self._compare_function(match) + + if match.compare_type == SymbolType.VTABLE: + return self._compare_vtable(match) + + return None + + ## Public API + + def get_functions(self) -> List[MatchInfo]: + return self._db.get_matches_by_type(SymbolType.FUNCTION) + + def get_vtables(self) -> List[MatchInfo]: + return self._db.get_matches_by_type(SymbolType.VTABLE) + + def compare_address(self, addr: int) -> Optional[DiffReport]: + match = self._db.get_one_match(addr) if match is None: return None - return self._compare_function(match) + return self._compare_match(match) + + def compare_all(self) -> Iterable[DiffReport]: + for match in self._db.get_matches(): + diff = self._compare_match(match) + if diff is not None: + yield diff def compare_functions(self) -> Iterable[DiffReport]: for match in self.get_functions(): - yield self._compare_function(match) + yield self._compare_match(match) def compare_variables(self): pass @@ -309,5 +411,6 @@ def compare_pointers(self): def compare_strings(self): pass - def compare_vtables(self): - pass + def compare_vtables(self) -> Iterable[DiffReport]: + for match in self.get_vtables(): + yield self._compare_match(match) diff --git a/tools/isledecomp/isledecomp/compare/db.py b/tools/isledecomp/isledecomp/compare/db.py index d2c2cbf9..dea2b590 100644 --- a/tools/isledecomp/isledecomp/compare/db.py +++ b/tools/isledecomp/isledecomp/compare/db.py @@ -82,17 +82,29 @@ def get_unmatched_strings(self) -> List[str]: return [string for (string,) in cur.fetchall()] - def get_one_function(self, addr: int) -> Optional[MatchInfo]: + def get_matches(self) -> Optional[MatchInfo]: cur = self._db.execute( """SELECT compare_type, orig_addr, recomp_addr, name, size FROM `symbols` - WHERE compare_type = ? - AND orig_addr = ? + WHERE orig_addr IS NOT NULL AND recomp_addr IS NOT NULL AND should_skip IS FALSE ORDER BY orig_addr """, - (SymbolType.FUNCTION.value, addr), + ) + cur.row_factory = matchinfo_factory + + return cur.fetchall() + + def get_one_match(self, addr: int) -> Optional[MatchInfo]: + cur = self._db.execute( + """SELECT compare_type, orig_addr, recomp_addr, name, size + FROM `symbols` + WHERE orig_addr = ? + AND recomp_addr IS NOT NULL + AND should_skip IS FALSE + """, + (addr,), ) cur.row_factory = matchinfo_factory return cur.fetchone() @@ -119,7 +131,7 @@ def get_by_recomp(self, addr: int) -> Optional[MatchInfo]: cur.row_factory = matchinfo_factory return cur.fetchone() - def get_matches(self, compare_type: SymbolType) -> List[MatchInfo]: + def get_matches_by_type(self, compare_type: SymbolType) -> List[MatchInfo]: cur = self._db.execute( """SELECT compare_type, orig_addr, recomp_addr, name, size FROM `symbols` diff --git a/tools/reccmp/reccmp.py b/tools/reccmp/reccmp.py index 66bb0f66..69783cb2 100755 --- a/tools/reccmp/reccmp.py +++ b/tools/reccmp/reccmp.py @@ -12,6 +12,7 @@ print_diff, ) from isledecomp.compare import Compare as IsleCompare +from isledecomp.types import SymbolType from pystache import Renderer import colorama @@ -225,9 +226,9 @@ def main(): ### Compare one or none. if args.verbose is not None: - match = isle_compare.compare_function(args.verbose) + match = isle_compare.compare_address(args.verbose) if match is None: - print(f"Failed to find the function with address 0x{args.verbose:x}") + print(f"Failed to find a match at address 0x{args.verbose:x}") return print_match_verbose( @@ -242,14 +243,15 @@ def main(): total_effective_accuracy = 0 htmlinsert = [] - for match in isle_compare.compare_functions(): + for match in isle_compare.compare_all(): print_match_oneline( match, show_both_addrs=args.print_rec_addr, is_plain=args.no_color ) - function_count += 1 - total_accuracy += match.ratio - total_effective_accuracy += match.effective_ratio + if match.match_type == SymbolType.FUNCTION: + function_count += 1 + total_accuracy += match.ratio + total_effective_accuracy += match.effective_ratio # If html, record the diffs to an HTML file if args.html is not None: