diff --git a/ISLE/define.h b/ISLE/define.h index aac9f28d..3f92244b 100644 --- a/ISLE/define.h +++ b/ISLE/define.h @@ -8,9 +8,9 @@ class IsleApp; extern IsleApp* g_isle; extern int g_closed; -// GLOBAL: ISLE 0x4101c4 +// STRING: ISLE 0x4101c4 #define WNDCLASS_NAME "Lego Island MainNoM App" -// GLOBAL: ISLE 0x4101dc +// STRING: ISLE 0x4101dc #define WINDOW_TITLE "LEGO\xAE" extern unsigned char g_mousedown; extern unsigned char g_mousemoved; diff --git a/LEGO1/act1state.h b/LEGO1/act1state.h index e2e8d3e1..d0daec7d 100644 --- a/LEGO1/act1state.h +++ b/LEGO1/act1state.h @@ -12,7 +12,7 @@ class Act1State : public LegoState { // FUNCTION: LEGO1 0x100338a0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0154 + // STRING: LEGO1 0x100f0154 return "Act1State"; }; diff --git a/LEGO1/act2brick.h b/LEGO1/act2brick.h index de4f29b1..10665c40 100644 --- a/LEGO1/act2brick.h +++ b/LEGO1/act2brick.h @@ -16,7 +16,7 @@ class Act2Brick : public LegoPathActor { // FUNCTION: LEGO1 0x1007a360 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0438 + // STRING: LEGO1 0x100f0438 return "Act2Brick"; } diff --git a/LEGO1/act2policestation.h b/LEGO1/act2policestation.h index 2ca1a4e8..887ab542 100644 --- a/LEGO1/act2policestation.h +++ b/LEGO1/act2policestation.h @@ -12,7 +12,7 @@ class Act2PoliceStation : public LegoEntity { // FUNCTION: LEGO1 0x1000e200 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03fc + // STRING: LEGO1 0x100f03fc return "Act2PoliceStation"; } diff --git a/LEGO1/act3.h b/LEGO1/act3.h index cc4a2c3f..76c9722b 100644 --- a/LEGO1/act3.h +++ b/LEGO1/act3.h @@ -14,7 +14,7 @@ class Act3 : public LegoWorld { // FUNCTION: LEGO1 0x10072510 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f013c + // STRING: LEGO1 0x100f013c return "Act3"; } diff --git a/LEGO1/act3actor.h b/LEGO1/act3actor.h index bfdf879a..cd1e1fcd 100644 --- a/LEGO1/act3actor.h +++ b/LEGO1/act3actor.h @@ -8,7 +8,7 @@ class Act3Actor : public MxCore { // FUNCTION: LEGO1 0x100431b0 inline virtual const char* ClassName() override { - // GLOBAL: LEGO1 0x100f03ac + // STRING: LEGO1 0x100f03ac return "Act3Actor"; } }; diff --git a/LEGO1/act3shark.h b/LEGO1/act3shark.h index 63a4e7a6..611cbc38 100644 --- a/LEGO1/act3shark.h +++ b/LEGO1/act3shark.h @@ -9,7 +9,7 @@ class Act3Shark : public LegoAnimActor { // FUNCTION: LEGO1 0x100430c0 inline virtual const char* ClassName() const override { - // GLOBAL: LEGO1 0x100f03a0 + // STRING: LEGO1 0x100f03a0 return "Act3Shark"; } }; diff --git a/LEGO1/act3state.h b/LEGO1/act3state.h index 5da94fac..dca6c3ea 100644 --- a/LEGO1/act3state.h +++ b/LEGO1/act3state.h @@ -12,7 +12,7 @@ class Act3State : public LegoState { // FUNCTION: LEGO1 0x1000e300 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03f0 + // STRING: LEGO1 0x100f03f0 return "Act3State"; } diff --git a/LEGO1/ambulance.h b/LEGO1/ambulance.h index eb46a1ed..3bc80212 100644 --- a/LEGO1/ambulance.h +++ b/LEGO1/ambulance.h @@ -12,7 +12,7 @@ class Ambulance : public IslePathActor { // FUNCTION: LEGO1 0x10035fa0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03c4 + // STRING: LEGO1 0x100f03c4 return "Ambulance"; } diff --git a/LEGO1/ambulancemissionstate.h b/LEGO1/ambulancemissionstate.h index 05d09859..a09bf117 100644 --- a/LEGO1/ambulancemissionstate.h +++ b/LEGO1/ambulancemissionstate.h @@ -12,7 +12,7 @@ class AmbulanceMissionState : public LegoState { // FUNCTION: LEGO1 0x10037600 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f00e8 + // STRING: LEGO1 0x100f00e8 return "AmbulanceMissionState"; } diff --git a/LEGO1/animstate.h b/LEGO1/animstate.h index 5e8fa4e5..c1098b6a 100644 --- a/LEGO1/animstate.h +++ b/LEGO1/animstate.h @@ -13,7 +13,7 @@ class AnimState : public LegoState { // FUNCTION: LEGO1 0x10065070 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0460 + // STRING: LEGO1 0x100f0460 return "AnimState"; } diff --git a/LEGO1/beachhouseentity.h b/LEGO1/beachhouseentity.h index cf6a8909..58aa3c68 100644 --- a/LEGO1/beachhouseentity.h +++ b/LEGO1/beachhouseentity.h @@ -12,7 +12,7 @@ class BeachHouseEntity : public BuildingEntity { // FUNCTION: LEGO1 0x1000ee80 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0314 + // STRING: LEGO1 0x100f0314 return "BeachHouseEntity"; } diff --git a/LEGO1/bike.h b/LEGO1/bike.h index f3d5c90d..899cfd21 100644 --- a/LEGO1/bike.h +++ b/LEGO1/bike.h @@ -13,7 +13,7 @@ class Bike : public IslePathActor { // FUNCTION: LEGO1 0x100766f0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03d0 + // STRING: LEGO1 0x100f03d0 return "Bike"; } diff --git a/LEGO1/buildingentity.h b/LEGO1/buildingentity.h index f0ba4c3c..7f2abe07 100644 --- a/LEGO1/buildingentity.h +++ b/LEGO1/buildingentity.h @@ -13,7 +13,7 @@ class BuildingEntity : public LegoEntity { // FUNCTION: LEGO1 0x10014f20 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f07e8 + // STRING: LEGO1 0x100f07e8 return "BuildingEntity"; } diff --git a/LEGO1/bumpbouy.h b/LEGO1/bumpbouy.h index 8399c7ef..a56526e4 100644 --- a/LEGO1/bumpbouy.h +++ b/LEGO1/bumpbouy.h @@ -10,7 +10,7 @@ class BumpBouy : public LegoAnimActor { // FUNCTION: LEGO1 0x100274e0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0394 + // STRING: LEGO1 0x100f0394 return "BumpBouy"; } diff --git a/LEGO1/carrace.h b/LEGO1/carrace.h index 3b9a768e..767fa567 100644 --- a/LEGO1/carrace.h +++ b/LEGO1/carrace.h @@ -13,7 +13,7 @@ class CarRace : public LegoRace { // FUNCTION: LEGO1 0x10016b20 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0528 + // STRING: LEGO1 0x100f0528 return "CarRace"; } diff --git a/LEGO1/carracestate.h b/LEGO1/carracestate.h index c922354f..561f277b 100644 --- a/LEGO1/carracestate.h +++ b/LEGO1/carracestate.h @@ -10,7 +10,7 @@ class CarRaceState : public RaceState { // FUNCTION: LEGO1 0x1000dd30 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f009c + // STRING: LEGO1 0x100f009c return "CarRaceState"; } diff --git a/LEGO1/doors.h b/LEGO1/doors.h index a2c142a4..feea0460 100644 --- a/LEGO1/doors.h +++ b/LEGO1/doors.h @@ -10,7 +10,7 @@ class Doors : public LegoPathActor { // FUNCTION: LEGO1 0x1000e430 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03e8 + // STRING: LEGO1 0x100f03e8 return "Doors"; } diff --git a/LEGO1/dunebuggy.h b/LEGO1/dunebuggy.h index 1accaa05..e45fe8fe 100644 --- a/LEGO1/dunebuggy.h +++ b/LEGO1/dunebuggy.h @@ -13,7 +13,7 @@ class DuneBuggy : public IslePathActor { // FUNCTION: LEGO1 0x10067c30 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0410 + // STRING: LEGO1 0x100f0410 return "DuneBuggy"; } diff --git a/LEGO1/elevatorbottom.h b/LEGO1/elevatorbottom.h index 2a0f2570..64b3f221 100644 --- a/LEGO1/elevatorbottom.h +++ b/LEGO1/elevatorbottom.h @@ -14,7 +14,7 @@ class ElevatorBottom : public LegoWorld { // FUNCTION: LEGO1 0x10017f20 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f04ac + // STRING: LEGO1 0x100f04ac return "ElevatorBottom"; } diff --git a/LEGO1/gasstation.h b/LEGO1/gasstation.h index d6761980..0617e161 100644 --- a/LEGO1/gasstation.h +++ b/LEGO1/gasstation.h @@ -17,7 +17,7 @@ class GasStation : public LegoWorld { // FUNCTION: LEGO1 0x10004780 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0168 + // STRING: LEGO1 0x100f0168 return "GasStation"; } diff --git a/LEGO1/gasstationentity.h b/LEGO1/gasstationentity.h index 17aa22cf..b4a27942 100644 --- a/LEGO1/gasstationentity.h +++ b/LEGO1/gasstationentity.h @@ -10,7 +10,7 @@ class GasStationEntity : public BuildingEntity { // FUNCTION: LEGO1 0x1000eb20 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0348 + // STRING: LEGO1 0x100f0348 return "GasStationEntity"; } diff --git a/LEGO1/gasstationstate.h b/LEGO1/gasstationstate.h index 2fb7e512..e2768a98 100644 --- a/LEGO1/gasstationstate.h +++ b/LEGO1/gasstationstate.h @@ -12,7 +12,7 @@ class GasStationState : public LegoState { // FUNCTION: LEGO1 0x100061d0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0174 + // STRING: LEGO1 0x100f0174 return "GasStationState"; } diff --git a/LEGO1/helicopter.h b/LEGO1/helicopter.h index cc4f3b35..7c5be4ea 100644 --- a/LEGO1/helicopter.h +++ b/LEGO1/helicopter.h @@ -27,7 +27,7 @@ class Helicopter : public IslePathActor { // FUNCTION: LEGO1 0x10003070 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0130 + // STRING: LEGO1 0x100f0130 return "Helicopter"; } diff --git a/LEGO1/helicopterstate.h b/LEGO1/helicopterstate.h index 1c43b04f..2cb3b747 100644 --- a/LEGO1/helicopterstate.h +++ b/LEGO1/helicopterstate.h @@ -11,7 +11,7 @@ class HelicopterState : public LegoState { // FUNCTION: LEGO1 0x1000e0d0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0144 + // STRING: LEGO1 0x100f0144 return "HelicopterState"; } diff --git a/LEGO1/historybook.h b/LEGO1/historybook.h index 18154c79..80cc78b5 100644 --- a/LEGO1/historybook.h +++ b/LEGO1/historybook.h @@ -15,7 +15,7 @@ class HistoryBook : public LegoWorld { // FUNCTION: LEGO1 0x10082390 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f04bc + // STRING: LEGO1 0x100f04bc return "HistoryBook"; } diff --git a/LEGO1/hospital.h b/LEGO1/hospital.h index 014c301d..627dc4cc 100644 --- a/LEGO1/hospital.h +++ b/LEGO1/hospital.h @@ -15,7 +15,7 @@ class Hospital : public LegoWorld { // FUNCTION: LEGO1 0x100746b0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0490 + // STRING: LEGO1 0x100f0490 return "Hospital"; } diff --git a/LEGO1/hospitalentity.h b/LEGO1/hospitalentity.h index 9dc597f1..f4f14b70 100644 --- a/LEGO1/hospitalentity.h +++ b/LEGO1/hospitalentity.h @@ -10,7 +10,7 @@ class HospitalEntity : public BuildingEntity { // FUNCTION: LEGO1 0x1000ec40 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0338 + // STRING: LEGO1 0x100f0338 return "HospitalEntity"; } diff --git a/LEGO1/hospitalstate.h b/LEGO1/hospitalstate.h index 8b24a3d5..25c23d96 100644 --- a/LEGO1/hospitalstate.h +++ b/LEGO1/hospitalstate.h @@ -13,7 +13,7 @@ class HospitalState : public LegoState { // FUNCTION: LEGO1 0x10076400 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0480 + // STRING: LEGO1 0x100f0480 return "HospitalState"; } diff --git a/LEGO1/infocenter.h b/LEGO1/infocenter.h index 3b4e7856..89fcc54f 100644 --- a/LEGO1/infocenter.h +++ b/LEGO1/infocenter.h @@ -16,7 +16,7 @@ class Infocenter : public LegoWorld { // FUNCTION: LEGO1 0x1006eb40 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f04ec + // STRING: LEGO1 0x100f04ec return "Infocenter"; } diff --git a/LEGO1/infocenterdoor.h b/LEGO1/infocenterdoor.h index 1586dbc8..5bc5e407 100644 --- a/LEGO1/infocenterdoor.h +++ b/LEGO1/infocenterdoor.h @@ -15,7 +15,7 @@ class InfocenterDoor : public LegoWorld { // FUNCTION: LEGO1 0x100377b0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f049c + // STRING: LEGO1 0x100f049c return "InfocenterDoor"; } diff --git a/LEGO1/infocenterentity.h b/LEGO1/infocenterentity.h index 44121ae2..e011aeb8 100644 --- a/LEGO1/infocenterentity.h +++ b/LEGO1/infocenterentity.h @@ -10,7 +10,7 @@ class InfoCenterEntity : public BuildingEntity { // FUNCTION: LEGO1 0x1000ea00 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f035c + // STRING: LEGO1 0x100f035c return "InfoCenterEntity"; } diff --git a/LEGO1/infocenterstate.h b/LEGO1/infocenterstate.h index 322e7bec..b1bce306 100644 --- a/LEGO1/infocenterstate.h +++ b/LEGO1/infocenterstate.h @@ -14,7 +14,7 @@ class InfocenterState : public LegoState { // FUNCTION: LEGO1 0x10071840 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f04dc + // STRING: LEGO1 0x100f04dc return "InfocenterState"; } diff --git a/LEGO1/isle.h b/LEGO1/isle.h index 9f44eadd..c3579aec 100644 --- a/LEGO1/isle.h +++ b/LEGO1/isle.h @@ -30,7 +30,7 @@ class Isle : public LegoWorld { // FUNCTION: LEGO1 0x10030910 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0458 + // STRING: LEGO1 0x100f0458 return "Isle"; } diff --git a/LEGO1/isleactor.h b/LEGO1/isleactor.h index aa205483..8fd7d039 100644 --- a/LEGO1/isleactor.h +++ b/LEGO1/isleactor.h @@ -9,7 +9,7 @@ class IsleActor : public LegoActor { // FUNCTION: LEGO1 0x1000e660 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f07dc + // STRING: LEGO1 0x100f07dc return "IsleActor"; } diff --git a/LEGO1/islepathactor.h b/LEGO1/islepathactor.h index 44f50475..d7a8ff60 100644 --- a/LEGO1/islepathactor.h +++ b/LEGO1/islepathactor.h @@ -18,7 +18,7 @@ class IslePathActor : public LegoPathActor { // FUNCTION: LEGO1 0x10002ea0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0104 + // STRING: LEGO1 0x100f0104 return "IslePathActor"; } diff --git a/LEGO1/jetski.h b/LEGO1/jetski.h index 8c669ca6..1a64a4b6 100644 --- a/LEGO1/jetski.h +++ b/LEGO1/jetski.h @@ -13,7 +13,7 @@ class Jetski : public IslePathActor { // FUNCTION: LEGO1 0x1007e430 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03d8 + // STRING: LEGO1 0x100f03d8 return "Jetski"; } diff --git a/LEGO1/jetskirace.h b/LEGO1/jetskirace.h index 9488ed04..9b16d9a7 100644 --- a/LEGO1/jetskirace.h +++ b/LEGO1/jetskirace.h @@ -10,7 +10,7 @@ class JetskiRace : public LegoRace { // FUNCTION: LEGO1 0x1000daf0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0530 + // STRING: LEGO1 0x100f0530 return "JetskiRace"; } diff --git a/LEGO1/jetskiracestate.h b/LEGO1/jetskiracestate.h index 9724e4a1..5610ac32 100644 --- a/LEGO1/jetskiracestate.h +++ b/LEGO1/jetskiracestate.h @@ -10,7 +10,7 @@ class JetskiRaceState : public RaceState { // FUNCTION: LEGO1 0x1000dc40 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f00ac + // STRING: LEGO1 0x100f00ac return "JetskiRaceState"; } diff --git a/LEGO1/jukebox.h b/LEGO1/jukebox.h index 63b04520..59aee194 100644 --- a/LEGO1/jukebox.h +++ b/LEGO1/jukebox.h @@ -13,7 +13,7 @@ class JukeBox : public LegoWorld { // FUNCTION: LEGO1 0x1005d6f0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f02cc + // STRING: LEGO1 0x100f02cc return "JukeBox"; } diff --git a/LEGO1/jukeboxentity.h b/LEGO1/jukeboxentity.h index 3e175568..c451787d 100644 --- a/LEGO1/jukeboxentity.h +++ b/LEGO1/jukeboxentity.h @@ -13,7 +13,7 @@ class JukeBoxEntity : public LegoEntity { // FUNCTION: LEGO1 0x10085cc0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f02f0 + // STRING: LEGO1 0x100f02f0 return "JukeBoxEntity"; } diff --git a/LEGO1/jukeboxstate.h b/LEGO1/jukeboxstate.h index 8a481437..7a517bb0 100644 --- a/LEGO1/jukeboxstate.h +++ b/LEGO1/jukeboxstate.h @@ -10,7 +10,7 @@ class JukeBoxState : public LegoState { // FUNCTION: LEGO1 0x1000f310 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f02bc + // STRING: LEGO1 0x100f02bc return "JukeBoxState"; } diff --git a/LEGO1/lego3dwavepresenter.h b/LEGO1/lego3dwavepresenter.h index ca72f212..ed1942da 100644 --- a/LEGO1/lego3dwavepresenter.h +++ b/LEGO1/lego3dwavepresenter.h @@ -10,7 +10,7 @@ class Lego3DWavePresenter : public MxWavePresenter { // FUNCTION: LEGO1 0x1000d890 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f058c + // STRING: LEGO1 0x100f058c return "Lego3DWavePresenter"; } diff --git a/LEGO1/legoact2state.h b/LEGO1/legoact2state.h index a26cdd7d..38584769 100644 --- a/LEGO1/legoact2state.h +++ b/LEGO1/legoact2state.h @@ -10,7 +10,7 @@ class LegoAct2State : public LegoState { // FUNCTION: LEGO1 0x1000df80 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0428 + // STRING: LEGO1 0x100f0428 return "LegoAct2State"; } diff --git a/LEGO1/legoactioncontrolpresenter.h b/LEGO1/legoactioncontrolpresenter.h index 98815348..746300a6 100644 --- a/LEGO1/legoactioncontrolpresenter.h +++ b/LEGO1/legoactioncontrolpresenter.h @@ -15,7 +15,7 @@ class LegoActionControlPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x1000d0e0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f05bc + // STRING: LEGO1 0x100f05bc return "LegoActionControlPresenter"; } diff --git a/LEGO1/legoactor.h b/LEGO1/legoactor.h index c8380177..95c991df 100644 --- a/LEGO1/legoactor.h +++ b/LEGO1/legoactor.h @@ -13,7 +13,7 @@ class LegoActor : public LegoEntity { // FUNCTION: LEGO1 0x1002d210 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0124 + // STRING: LEGO1 0x100f0124 return "LegoActor"; } diff --git a/LEGO1/legoactorpresenter.h b/LEGO1/legoactorpresenter.h index 359960dc..a9709686 100644 --- a/LEGO1/legoactorpresenter.h +++ b/LEGO1/legoactorpresenter.h @@ -10,7 +10,7 @@ class LegoActorPresenter : public LegoEntityPresenter { // FUNCTION: LEGO1 0x1000cb10 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f06a4 + // STRING: LEGO1 0x100f06a4 return "LegoActorPresenter"; } diff --git a/LEGO1/legoanimationmanager.h b/LEGO1/legoanimationmanager.h index 0a647e8f..f943b062 100644 --- a/LEGO1/legoanimationmanager.h +++ b/LEGO1/legoanimationmanager.h @@ -16,7 +16,7 @@ class LegoAnimationManager : public MxCore { // FUNCTION: LEGO1 0x1005ec80 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f7508 + // STRING: LEGO1 0x100f7508 return "LegoAnimationManager"; } diff --git a/LEGO1/legoanimmmpresenter.h b/LEGO1/legoanimmmpresenter.h index 9fc9d19f..2e1ab918 100644 --- a/LEGO1/legoanimmmpresenter.h +++ b/LEGO1/legoanimmmpresenter.h @@ -12,7 +12,7 @@ class LegoAnimMMPresenter : public MxCompositePresenter { // FUNCTION: LEGO1 0x1004a950 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f046c + // STRING: LEGO1 0x100f046c return "LegoAnimMMPresenter"; } diff --git a/LEGO1/legoanimpresenter.h b/LEGO1/legoanimpresenter.h index 5961f74a..de8e91d9 100644 --- a/LEGO1/legoanimpresenter.h +++ b/LEGO1/legoanimpresenter.h @@ -11,7 +11,7 @@ class LegoAnimPresenter : public MxVideoPresenter { // FUNCTION: LEGO1 0x10068530 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f071c + // STRING: LEGO1 0x100f071c return "LegoAnimPresenter"; } diff --git a/LEGO1/legobuildingmanager.h b/LEGO1/legobuildingmanager.h index 38c9cd57..bb9c96bb 100644 --- a/LEGO1/legobuildingmanager.h +++ b/LEGO1/legobuildingmanager.h @@ -13,7 +13,7 @@ class LegoBuildingManager : public MxCore { // FUNCTION: LEGO1 0x1002f930 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f37d0 + // STRING: LEGO1 0x100f37d0 return "LegoBuildingManager"; } diff --git a/LEGO1/legocachesound.h b/LEGO1/legocachesound.h index e045a719..6398c04e 100644 --- a/LEGO1/legocachesound.h +++ b/LEGO1/legocachesound.h @@ -13,7 +13,7 @@ class LegoCacheSound : public MxCore { // FUNCTION: LEGO1 0x10006580 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f01c4 + // STRING: LEGO1 0x100f01c4 return "LegoCacheSound"; } diff --git a/LEGO1/legocameracontroller.h b/LEGO1/legocameracontroller.h index 7fa9552d..09785df1 100644 --- a/LEGO1/legocameracontroller.h +++ b/LEGO1/legocameracontroller.h @@ -15,7 +15,7 @@ class LegoCameraController : public MxCore { // FUNCTION: LEGO1 0x10011ec0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0850 + // STRING: LEGO1 0x100f0850 return "LegoCameraController"; } diff --git a/LEGO1/legocarbuild.h b/LEGO1/legocarbuild.h index b4a93e7c..74d850d4 100644 --- a/LEGO1/legocarbuild.h +++ b/LEGO1/legocarbuild.h @@ -16,7 +16,7 @@ class LegoCarBuild : public LegoWorld { // FUNCTION: LEGO1 0x10022940 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0504 + // STRING: LEGO1 0x100f0504 return "LegoCarBuild"; } diff --git a/LEGO1/legocarbuildanimpresenter.h b/LEGO1/legocarbuildanimpresenter.h index 8be926f7..0440a0f3 100644 --- a/LEGO1/legocarbuildanimpresenter.h +++ b/LEGO1/legocarbuildanimpresenter.h @@ -13,7 +13,7 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter { // FUNCTION: LEGO1 0x10078510 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f05ec + // STRING: LEGO1 0x100f05ec return "LegoCarBuildAnimPresenter"; } diff --git a/LEGO1/legocarraceactor.h b/LEGO1/legocarraceactor.h index d03b20eb..f00d900e 100644 --- a/LEGO1/legocarraceactor.h +++ b/LEGO1/legocarraceactor.h @@ -9,7 +9,7 @@ class LegoCarRaceActor : public LegoRaceActor { // FUNCTION: LEGO1 0x10081650 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0568 + // STRING: LEGO1 0x100f0568 return "LegoCarRaceActor"; } diff --git a/LEGO1/legocontrolmanager.h b/LEGO1/legocontrolmanager.h index 591effb6..7bc8dc0f 100644 --- a/LEGO1/legocontrolmanager.h +++ b/LEGO1/legocontrolmanager.h @@ -14,7 +14,7 @@ class LegoControlManager : public MxCore { // FUNCTION: LEGO1 0x10028cb0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f31b8 + // STRING: LEGO1 0x100f31b8 return "LegoControlManager"; } diff --git a/LEGO1/legoentity.h b/LEGO1/legoentity.h index 4d4c19b6..5a2eb715 100644 --- a/LEGO1/legoentity.h +++ b/LEGO1/legoentity.h @@ -22,7 +22,7 @@ class LegoEntity : public MxEntity { // FUNCTION: LEGO1 0x1000c2f0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0064 + // STRING: LEGO1 0x100f0064 return "LegoEntity"; } diff --git a/LEGO1/legoentitypresenter.h b/LEGO1/legoentitypresenter.h index 994e5a79..72af0498 100644 --- a/LEGO1/legoentitypresenter.h +++ b/LEGO1/legoentitypresenter.h @@ -15,7 +15,7 @@ class LegoEntityPresenter : public MxCompositePresenter { // FUNCTION: LEGO1 0x100534b0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f06b8 + // STRING: LEGO1 0x100f06b8 return "LegoEntityPresenter"; } diff --git a/LEGO1/legoextraactor.h b/LEGO1/legoextraactor.h index 6b8a9198..c4c76cee 100644 --- a/LEGO1/legoextraactor.h +++ b/LEGO1/legoextraactor.h @@ -9,7 +9,7 @@ class LegoExtraActor : public LegoAnimActor { // FUNCTION: LEGO1 0x1002b7a0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f3204 + // STRING: LEGO1 0x100f3204 return "LegoExtraActor"; } diff --git a/LEGO1/legoflctexturepresenter.h b/LEGO1/legoflctexturepresenter.h index c55249cf..36d1fefc 100644 --- a/LEGO1/legoflctexturepresenter.h +++ b/LEGO1/legoflctexturepresenter.h @@ -13,7 +13,7 @@ class LegoFlcTexturePresenter : public MxFlcPresenter { // FUNCTION: LEGO1 0x1005def0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0634 + // STRING: LEGO1 0x100f0634 return "LegoFlcTexturePresenter"; } diff --git a/LEGO1/legohideanimpresenter.h b/LEGO1/legohideanimpresenter.h index aca44424..f6e86c2e 100644 --- a/LEGO1/legohideanimpresenter.h +++ b/LEGO1/legohideanimpresenter.h @@ -12,7 +12,7 @@ class LegoHideAnimPresenter : public LegoLoopingAnimPresenter { // FUNCTION: LEGO1 0x1006d880 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f06cc + // STRING: LEGO1 0x100f06cc return "LegoHideAnimPresenter"; } diff --git a/LEGO1/legojetski.h b/LEGO1/legojetski.h index b7909a46..09a9f8d1 100644 --- a/LEGO1/legojetski.h +++ b/LEGO1/legojetski.h @@ -9,7 +9,7 @@ class LegoJetski : public LegoJetskiRaceActor { // FUNCTION: LEGO1 0x10013e80 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f053c + // STRING: LEGO1 0x100f053c return "LegoJetski"; } diff --git a/LEGO1/legojetskiraceactor.h b/LEGO1/legojetskiraceactor.h index d2ab88d8..28d151e8 100644 --- a/LEGO1/legojetskiraceactor.h +++ b/LEGO1/legojetskiraceactor.h @@ -9,7 +9,7 @@ class LegoJetskiRaceActor : public LegoCarRaceActor { // FUNCTION: LEGO1 0x10081d80 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0554 + // STRING: LEGO1 0x100f0554 return "LegoJetskiRaceActor"; } diff --git a/LEGO1/legoloadcachesoundpresenter.h b/LEGO1/legoloadcachesoundpresenter.h index c9255b01..1c26cdec 100644 --- a/LEGO1/legoloadcachesoundpresenter.h +++ b/LEGO1/legoloadcachesoundpresenter.h @@ -14,7 +14,7 @@ class LegoLoadCacheSoundPresenter : public MxWavePresenter { // FUNCTION: LEGO1 0x10018450 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f05a0 + // STRING: LEGO1 0x100f05a0 return "LegoLoadCacheSoundPresenter"; } diff --git a/LEGO1/legolocomotionanimpresenter.h b/LEGO1/legolocomotionanimpresenter.h index e7d7af25..36facd1d 100644 --- a/LEGO1/legolocomotionanimpresenter.h +++ b/LEGO1/legolocomotionanimpresenter.h @@ -11,7 +11,7 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { // FUNCTION: LEGO1 0x1006ce50 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f06e4 + // STRING: LEGO1 0x100f06e4 return "LegoLocomotionAnimPresenter"; } diff --git a/LEGO1/legoloopinganimpresenter.h b/LEGO1/legoloopinganimpresenter.h index 7f033a98..a17c671c 100644 --- a/LEGO1/legoloopinganimpresenter.h +++ b/LEGO1/legoloopinganimpresenter.h @@ -10,7 +10,7 @@ class LegoLoopingAnimPresenter : public LegoAnimPresenter { // FUNCTION: LEGO1 0x1000c9a0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0700 + // STRING: LEGO1 0x100f0700 return "LegoLoopingAnimPresenter"; } diff --git a/LEGO1/legomodelpresenter.h b/LEGO1/legomodelpresenter.h index df9cbba1..b55372dd 100644 --- a/LEGO1/legomodelpresenter.h +++ b/LEGO1/legomodelpresenter.h @@ -12,7 +12,7 @@ class LegoModelPresenter : public MxVideoPresenter { // FUNCTION: LEGO1 0x1000ccb0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f067c + // STRING: LEGO1 0x100f067c return "LegoModelPresenter"; } diff --git a/LEGO1/legonavcontroller.h b/LEGO1/legonavcontroller.h index ffaf99cb..c6505341 100644 --- a/LEGO1/legonavcontroller.h +++ b/LEGO1/legonavcontroller.h @@ -42,7 +42,7 @@ class LegoNavController : public MxCore { // FUNCTION: LEGO1 0x10054b80 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f66d8 + // STRING: LEGO1 0x100f66d8 return "LegoNavController"; } diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 81c3d6f1..f0ac8369 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -76,7 +76,7 @@ class LegoOmni : public MxOmni { // FUNCTION: LEGO1 0x10058aa0 inline virtual const char* ClassName() const override // vtable+0c { - // GLOBAL: LEGO1 0x100f671c + // STRING: LEGO1 0x100f671c return "LegoOmni"; } diff --git a/LEGO1/legopalettepresenter.h b/LEGO1/legopalettepresenter.h index c350159b..f725149d 100644 --- a/LEGO1/legopalettepresenter.h +++ b/LEGO1/legopalettepresenter.h @@ -15,7 +15,7 @@ class LegoPalettePresenter : public MxVideoPresenter { // FUNCTION: LEGO1 0x10079f30 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f061c + // STRING: LEGO1 0x100f061c return "LegoPalettePresenter"; } diff --git a/LEGO1/legopartpresenter.h b/LEGO1/legopartpresenter.h index 936d4876..6695a70b 100644 --- a/LEGO1/legopartpresenter.h +++ b/LEGO1/legopartpresenter.h @@ -10,7 +10,7 @@ class LegoPartPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x1000cf70 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f05d8 + // STRING: LEGO1 0x100f05d8 return "LegoPartPresenter"; } diff --git a/LEGO1/legopathactor.h b/LEGO1/legopathactor.h index f331e8ce..a3f5756c 100644 --- a/LEGO1/legopathactor.h +++ b/LEGO1/legopathactor.h @@ -15,7 +15,7 @@ class LegoPathActor : public LegoActor { // FUNCTION: LEGO1 0x1000c430 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0114 + // STRING: LEGO1 0x100f0114 return "LegoPathActor"; } diff --git a/LEGO1/legopathcontroller.h b/LEGO1/legopathcontroller.h index 7bb6d30d..f7278ca8 100644 --- a/LEGO1/legopathcontroller.h +++ b/LEGO1/legopathcontroller.h @@ -15,7 +15,7 @@ class LegoPathController : public MxCore { // FUNCTION: LEGO1 0x10045110 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f11b8 + // STRING: LEGO1 0x100f11b8 return "LegoPathController"; } diff --git a/LEGO1/legopathpresenter.h b/LEGO1/legopathpresenter.h index 8fe2d5ee..de7b14d1 100644 --- a/LEGO1/legopathpresenter.h +++ b/LEGO1/legopathpresenter.h @@ -12,7 +12,7 @@ class LegoPathPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x100449a0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0690 + // STRING: LEGO1 0x100f0690 return "LegoPathPresenter"; } diff --git a/LEGO1/legophonemepresenter.h b/LEGO1/legophonemepresenter.h index 7b620723..330b1c7a 100644 --- a/LEGO1/legophonemepresenter.h +++ b/LEGO1/legophonemepresenter.h @@ -16,7 +16,7 @@ class LegoPhonemePresenter : public MxFlcPresenter { // FUNCTION: LEGO1 0x1004e310 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f064c + // STRING: LEGO1 0x100f064c return "LegoPhonemePresenter"; } diff --git a/LEGO1/legoplantmanager.h b/LEGO1/legoplantmanager.h index 87a6ec79..7fd20746 100644 --- a/LEGO1/legoplantmanager.h +++ b/LEGO1/legoplantmanager.h @@ -15,7 +15,7 @@ class LegoPlantManager : public MxCore { // FUNCTION: LEGO1 0x10026290 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f318c + // STRING: LEGO1 0x100f318c return "LegoPlantManager"; } diff --git a/LEGO1/legorace.h b/LEGO1/legorace.h index 9ddbdfb3..530c289c 100644 --- a/LEGO1/legorace.h +++ b/LEGO1/legorace.h @@ -18,7 +18,7 @@ class LegoRace : public LegoWorld { // FUNCTION: LEGO1 0x10015ba0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f07c4 + // STRING: LEGO1 0x100f07c4 return "LegoRace"; } diff --git a/LEGO1/legoraceactor.h b/LEGO1/legoraceactor.h index 9a4e34ec..eb459e81 100644 --- a/LEGO1/legoraceactor.h +++ b/LEGO1/legoraceactor.h @@ -9,7 +9,7 @@ class LegoRaceActor : public LegoAnimActor { // FUNCTION: LEGO1 0x10014af0 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0bf4 + // STRING: LEGO1 0x100f0bf4 return "LegoRaceActor"; } diff --git a/LEGO1/legoracecar.h b/LEGO1/legoracecar.h index 38099af2..d3800b5a 100644 --- a/LEGO1/legoracecar.h +++ b/LEGO1/legoracecar.h @@ -11,7 +11,7 @@ class LegoRaceCar : public LegoCarRaceActor { // FUNCTION: LEGO1 0x10014290 inline const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0548 + // STRING: LEGO1 0x100f0548 return "LegoRaceCar"; } diff --git a/LEGO1/legostate.h b/LEGO1/legostate.h index 55f0a1af..ba4403de 100644 --- a/LEGO1/legostate.h +++ b/LEGO1/legostate.h @@ -14,7 +14,7 @@ class LegoState : public MxCore { // FUNCTION: LEGO1 0x100060d0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f01b8 + // STRING: LEGO1 0x100f01b8 return "LegoState"; } diff --git a/LEGO1/legotexturepresenter.h b/LEGO1/legotexturepresenter.h index 36cc59b9..0ac13926 100644 --- a/LEGO1/legotexturepresenter.h +++ b/LEGO1/legotexturepresenter.h @@ -12,7 +12,7 @@ class LegoTexturePresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x1000ce50 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0664 + // STRING: LEGO1 0x100f0664 return "LegoTexturePresenter"; } diff --git a/LEGO1/legoworld.h b/LEGO1/legoworld.h index fadeea5c..f6210e8e 100644 --- a/LEGO1/legoworld.h +++ b/LEGO1/legoworld.h @@ -23,7 +23,7 @@ class LegoWorld : public LegoEntity { // FUNCTION: LEGO1 0x1001d690 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0058 + // STRING: LEGO1 0x100f0058 return "LegoWorld"; } diff --git a/LEGO1/legoworldpresenter.h b/LEGO1/legoworldpresenter.h index 3cd02a8f..be18baca 100644 --- a/LEGO1/legoworldpresenter.h +++ b/LEGO1/legoworldpresenter.h @@ -15,7 +15,7 @@ class LegoWorldPresenter : public LegoEntityPresenter { // FUNCTION: LEGO1 0x10066630 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0608 + // STRING: LEGO1 0x100f0608 return "LegoWorldPresenter"; } diff --git a/LEGO1/motorcycle.h b/LEGO1/motorcycle.h index a698fcd8..af04b4ad 100644 --- a/LEGO1/motorcycle.h +++ b/LEGO1/motorcycle.h @@ -13,7 +13,7 @@ class Motorcycle : public IslePathActor { // FUNCTION: LEGO1 0x10035840 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f38e8 + // STRING: LEGO1 0x100f38e8 return "Motorcycle"; } diff --git a/LEGO1/mxaudiopresenter.h b/LEGO1/mxaudiopresenter.h index f1d207e1..73024aac 100644 --- a/LEGO1/mxaudiopresenter.h +++ b/LEGO1/mxaudiopresenter.h @@ -13,7 +13,7 @@ class MxAudioPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x1000d280 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f078c + // STRING: LEGO1 0x100f078c return "MxAudioPresenter"; } diff --git a/LEGO1/mxbackgroundaudiomanager.h b/LEGO1/mxbackgroundaudiomanager.h index cb03624c..9d47947f 100644 --- a/LEGO1/mxbackgroundaudiomanager.h +++ b/LEGO1/mxbackgroundaudiomanager.h @@ -21,7 +21,7 @@ class MxBackgroundAudioManager : public MxCore { // FUNCTION: LEGO1 0x1007eb70 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f7ac4 + // STRING: LEGO1 0x100f7ac4 return "MxBackgroundAudioManager"; } diff --git a/LEGO1/mxcompositemediapresenter.h b/LEGO1/mxcompositemediapresenter.h index 4f0efc76..ed6f1335 100644 --- a/LEGO1/mxcompositemediapresenter.h +++ b/LEGO1/mxcompositemediapresenter.h @@ -15,7 +15,7 @@ class MxCompositeMediaPresenter : public MxCompositePresenter { // FUNCTION: LEGO1 0x10073f10 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f02d4 + // STRING: LEGO1 0x100f02d4 return "MxCompositeMediaPresenter"; } diff --git a/LEGO1/mxcompositepresenter.h b/LEGO1/mxcompositepresenter.h index f6929b6d..6f14e615 100644 --- a/LEGO1/mxcompositepresenter.h +++ b/LEGO1/mxcompositepresenter.h @@ -19,7 +19,7 @@ class MxCompositePresenter : public MxPresenter { // FUNCTION: LEGO1 0x100b6210 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0774 + // STRING: LEGO1 0x100f0774 return "MxCompositePresenter"; } diff --git a/LEGO1/mxcontrolpresenter.h b/LEGO1/mxcontrolpresenter.h index 515af808..9779e45f 100644 --- a/LEGO1/mxcontrolpresenter.h +++ b/LEGO1/mxcontrolpresenter.h @@ -14,7 +14,7 @@ class MxControlPresenter : public MxCompositePresenter { // FUNCTION: LEGO1 0x10044000 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0514 + // STRING: LEGO1 0x100f0514 return "MxControlPresenter"; } diff --git a/LEGO1/mxcore.h b/LEGO1/mxcore.h index 5792eaf2..db812bba 100644 --- a/LEGO1/mxcore.h +++ b/LEGO1/mxcore.h @@ -20,7 +20,7 @@ class MxCore { // FUNCTION: LEGO1 0x100144c0 inline virtual const char* ClassName() const // vtable+0c { - // GLOBAL: LEGO1 0x100f007c + // STRING: LEGO1 0x100f007c return "MxCore"; } diff --git a/LEGO1/mxdiskstreamcontroller.h b/LEGO1/mxdiskstreamcontroller.h index 3fc5111f..52032675 100644 --- a/LEGO1/mxdiskstreamcontroller.h +++ b/LEGO1/mxdiskstreamcontroller.h @@ -22,7 +22,7 @@ class MxDiskStreamController : public MxStreamController { // FUNCTION: LEGO1 0x100c7360 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x10102144 + // STRING: LEGO1 0x10102144 return "MxDiskStreamController"; } diff --git a/LEGO1/mxdiskstreamprovider.h b/LEGO1/mxdiskstreamprovider.h index bc73c0e4..1314e3f9 100644 --- a/LEGO1/mxdiskstreamprovider.h +++ b/LEGO1/mxdiskstreamprovider.h @@ -32,7 +32,7 @@ class MxDiskStreamProvider : public MxStreamProvider { // FUNCTION: LEGO1 0x100d1160 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x1010287c + // STRING: LEGO1 0x1010287c return "MxDiskStreamProvider"; } diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index 4898eb91..c32dd4aa 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -33,7 +33,7 @@ class MxDSAction : public MxDSObject { // FUNCTION: LEGO1 0x100ad980 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101013f4 + // STRING: LEGO1 0x101013f4 return "MxDSAction"; } diff --git a/LEGO1/mxdsanim.h b/LEGO1/mxdsanim.h index ee206e6a..213fcf87 100644 --- a/LEGO1/mxdsanim.h +++ b/LEGO1/mxdsanim.h @@ -16,7 +16,7 @@ class MxDSAnim : public MxDSMediaAction { // FUNCTION: LEGO1 0x100c9060 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101025d8 + // STRING: LEGO1 0x101025d8 return "MxDSAnim"; } diff --git a/LEGO1/mxdsbuffer.h b/LEGO1/mxdsbuffer.h index e9fe2675..daa3263e 100644 --- a/LEGO1/mxdsbuffer.h +++ b/LEGO1/mxdsbuffer.h @@ -27,7 +27,7 @@ class MxDSBuffer : public MxCore { // FUNCTION: LEGO1 0x100c6500 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101025b8 + // STRING: LEGO1 0x101025b8 return "MxDSBuffer"; } diff --git a/LEGO1/mxdschunk.h b/LEGO1/mxdschunk.h index 70209596..9f2ac9b6 100644 --- a/LEGO1/mxdschunk.h +++ b/LEGO1/mxdschunk.h @@ -25,7 +25,7 @@ class MxDSChunk : public MxCore { // FUNCTION: LEGO1 0x100be0c0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x10101e6c + // STRING: LEGO1 0x10101e6c return "MxDSChunk"; } diff --git a/LEGO1/mxdsevent.h b/LEGO1/mxdsevent.h index 8c6e825e..01cf1fa4 100644 --- a/LEGO1/mxdsevent.h +++ b/LEGO1/mxdsevent.h @@ -14,7 +14,7 @@ class MxDSEvent : public MxDSMediaAction { // FUNCTION: LEGO1 0x100c9660 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101025f0 + // STRING: LEGO1 0x101025f0 return "MxDSEvent"; } diff --git a/LEGO1/mxdsfile.h b/LEGO1/mxdsfile.h index e453cb9a..34afeccb 100644 --- a/LEGO1/mxdsfile.h +++ b/LEGO1/mxdsfile.h @@ -17,7 +17,7 @@ class MxDSFile : public MxDSSource { // FUNCTION: LEGO1 0x100c0120 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x10102594 + // STRING: LEGO1 0x10102594 return "MxDSFile"; } diff --git a/LEGO1/mxdsmediaaction.h b/LEGO1/mxdsmediaaction.h index 72fcf036..1f1b97d5 100644 --- a/LEGO1/mxdsmediaaction.h +++ b/LEGO1/mxdsmediaaction.h @@ -18,7 +18,7 @@ class MxDSMediaAction : public MxDSAction { // FUNCTION: LEGO1 0x100c8be0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f7624 + // STRING: LEGO1 0x100f7624 return "MxDSMediaAction"; } diff --git a/LEGO1/mxdsmultiaction.h b/LEGO1/mxdsmultiaction.h index 5003a378..a600b787 100644 --- a/LEGO1/mxdsmultiaction.h +++ b/LEGO1/mxdsmultiaction.h @@ -17,7 +17,7 @@ class MxDSMultiAction : public MxDSAction { // FUNCTION: LEGO1 0x100c9f50 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x10101dbc + // STRING: LEGO1 0x10101dbc return "MxDSMultiAction"; } diff --git a/LEGO1/mxdsobjectaction.h b/LEGO1/mxdsobjectaction.h index 3286f110..a31f6d6b 100644 --- a/LEGO1/mxdsobjectaction.h +++ b/LEGO1/mxdsobjectaction.h @@ -15,7 +15,7 @@ class MxDSObjectAction : public MxDSMediaAction { // FUNCTION: LEGO1 0x100c88e0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101025c4 + // STRING: LEGO1 0x101025c4 return "MxDSObjectAction"; } diff --git a/LEGO1/mxdsparallelaction.h b/LEGO1/mxdsparallelaction.h index 65028ce3..89fc1df0 100644 --- a/LEGO1/mxdsparallelaction.h +++ b/LEGO1/mxdsparallelaction.h @@ -16,7 +16,7 @@ class MxDSParallelAction : public MxDSMultiAction { // FUNCTION: LEGO1 0x100caf00 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x10102608 + // STRING: LEGO1 0x10102608 return "MxDSParallelAction"; } diff --git a/LEGO1/mxdsselectaction.h b/LEGO1/mxdsselectaction.h index 187e3a72..6b68bfc9 100644 --- a/LEGO1/mxdsselectaction.h +++ b/LEGO1/mxdsselectaction.h @@ -18,7 +18,7 @@ class MxDSSelectAction : public MxDSParallelAction { // FUNCTION: LEGO1 0x100cb6f0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x1010261c + // STRING: LEGO1 0x1010261c return "MxDSSelectAction"; } diff --git a/LEGO1/mxdsserialaction.h b/LEGO1/mxdsserialaction.h index ea758afa..c4fa18b3 100644 --- a/LEGO1/mxdsserialaction.h +++ b/LEGO1/mxdsserialaction.h @@ -17,7 +17,7 @@ class MxDSSerialAction : public MxDSMultiAction { // FUNCTION: LEGO1 0x100caad0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f75dc + // STRING: LEGO1 0x100f75dc return "MxDSSerialAction"; } diff --git a/LEGO1/mxdssound.h b/LEGO1/mxdssound.h index 45f93942..5dc6bbd7 100644 --- a/LEGO1/mxdssound.h +++ b/LEGO1/mxdssound.h @@ -16,7 +16,7 @@ class MxDSSound : public MxDSMediaAction { // FUNCTION: LEGO1 0x100c9330 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101025e4 + // STRING: LEGO1 0x101025e4 return "MxDSSound"; } diff --git a/LEGO1/mxdssource.h b/LEGO1/mxdssource.h index 711ba110..db009fb4 100644 --- a/LEGO1/mxdssource.h +++ b/LEGO1/mxdssource.h @@ -14,7 +14,7 @@ class MxDSSource : public MxCore { // FUNCTION: LEGO1 0x100c0010 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x10102588 + // STRING: LEGO1 0x10102588 return "MxDSSource"; } diff --git a/LEGO1/mxdsstill.h b/LEGO1/mxdsstill.h index 846f8293..268fe79f 100644 --- a/LEGO1/mxdsstill.h +++ b/LEGO1/mxdsstill.h @@ -16,7 +16,7 @@ class MxDSStill : public MxDSMediaAction { // FUNCTION: LEGO1 0x100c9930 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101025fc + // STRING: LEGO1 0x101025fc return "MxDSStill"; } diff --git a/LEGO1/mxdssubscriber.h b/LEGO1/mxdssubscriber.h index 13d62040..8187e354 100644 --- a/LEGO1/mxdssubscriber.h +++ b/LEGO1/mxdssubscriber.h @@ -19,7 +19,7 @@ class MxDSSubscriber : public MxCore { // FUNCTION: LEGO1 0x100b7d50 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x101020f8 + // STRING: LEGO1 0x101020f8 return "MxDSSubscriber"; } diff --git a/LEGO1/mxentity.h b/LEGO1/mxentity.h index a83462cd..64a003ee 100644 --- a/LEGO1/mxentity.h +++ b/LEGO1/mxentity.h @@ -17,7 +17,7 @@ class MxEntity : public MxCore { // FUNCTION: LEGO1 0x1000c180 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0070 + // STRING: LEGO1 0x100f0070 return "MxEntity"; } diff --git a/LEGO1/mxeventpresenter.h b/LEGO1/mxeventpresenter.h index d022f609..201b15e5 100644 --- a/LEGO1/mxeventpresenter.h +++ b/LEGO1/mxeventpresenter.h @@ -14,7 +14,7 @@ class MxEventPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x100c2c30 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101dcc + // STRING: LEGO1 0x10101dcc return "MxEventPresenter"; } diff --git a/LEGO1/mxflcpresenter.h b/LEGO1/mxflcpresenter.h index 393e2810..0ad44de3 100644 --- a/LEGO1/mxflcpresenter.h +++ b/LEGO1/mxflcpresenter.h @@ -22,7 +22,7 @@ class MxFlcPresenter : public MxVideoPresenter { // FUNCTION: LEGO1 0x100b33f0 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f43c8 + // STRING: LEGO1 0x100f43c8 return "MxFlcPresenter"; } diff --git a/LEGO1/mxloopingflcpresenter.h b/LEGO1/mxloopingflcpresenter.h index e4f781c9..c05c3657 100644 --- a/LEGO1/mxloopingflcpresenter.h +++ b/LEGO1/mxloopingflcpresenter.h @@ -14,7 +14,7 @@ class MxLoopingFlcPresenter : public MxFlcPresenter { // FUNCTION: LEGO1 0x100b4380 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101e20 + // STRING: LEGO1 0x10101e20 return "MxLoopingFlcPresenter"; } diff --git a/LEGO1/mxloopingmidipresenter.h b/LEGO1/mxloopingmidipresenter.h index 49df30f4..e47ef30d 100644 --- a/LEGO1/mxloopingmidipresenter.h +++ b/LEGO1/mxloopingmidipresenter.h @@ -10,7 +10,7 @@ class MxLoopingMIDIPresenter : public MxMIDIPresenter { // FUNCTION: LEGO1 0x100b1830 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101de0 + // STRING: LEGO1 0x10101de0 return "MxLoopingMIDIPresenter"; } diff --git a/LEGO1/mxloopingsmkpresenter.h b/LEGO1/mxloopingsmkpresenter.h index 2f20676e..9506de84 100644 --- a/LEGO1/mxloopingsmkpresenter.h +++ b/LEGO1/mxloopingsmkpresenter.h @@ -14,7 +14,7 @@ class MxLoopingSmkPresenter : public MxSmkPresenter { // FUNCTION: LEGO1 0x100b4920 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101e08 + // STRING: LEGO1 0x10101e08 return "MxLoopingSmkPresenter"; } diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h index 4a482a78..32c7b6d0 100644 --- a/LEGO1/mxmediapresenter.h +++ b/LEGO1/mxmediapresenter.h @@ -18,7 +18,7 @@ class MxMediaPresenter : public MxPresenter { // FUNCTION: LEGO1 0x1000c5c0 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f074c + // STRING: LEGO1 0x100f074c return "MxMediaPresenter"; } diff --git a/LEGO1/mxmidipresenter.h b/LEGO1/mxmidipresenter.h index 09e11dde..2ec11b0b 100644 --- a/LEGO1/mxmidipresenter.h +++ b/LEGO1/mxmidipresenter.h @@ -14,7 +14,7 @@ class MxMIDIPresenter : public MxMusicPresenter { // FUNCTION: LEGO1 0x100c2650 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101df8 + // STRING: LEGO1 0x10101df8 return "MxMIDIPresenter"; } diff --git a/LEGO1/mxmusicpresenter.h b/LEGO1/mxmusicpresenter.h index 965c38df..bba2afb0 100644 --- a/LEGO1/mxmusicpresenter.h +++ b/LEGO1/mxmusicpresenter.h @@ -13,7 +13,7 @@ class MxMusicPresenter : public MxAudioPresenter { // FUNCTION: LEGO1 0x100c23a0 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101e48 + // STRING: LEGO1 0x10101e48 return "MxMusicPresenter"; } diff --git a/LEGO1/mxnextactiondatastart.h b/LEGO1/mxnextactiondatastart.h index c9534899..15e35b00 100644 --- a/LEGO1/mxnextactiondatastart.h +++ b/LEGO1/mxnextactiondatastart.h @@ -18,7 +18,7 @@ class MxNextActionDataStart : public MxCore { // FUNCTION: LEGO1 0x100c1900 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x101025a0 + // STRING: LEGO1 0x101025a0 return "MxNextActionDataStart"; } diff --git a/LEGO1/mxobjectfactory.h b/LEGO1/mxobjectfactory.h index cfc97308..3741bfa3 100644 --- a/LEGO1/mxobjectfactory.h +++ b/LEGO1/mxobjectfactory.h @@ -26,7 +26,7 @@ class MxObjectFactory : public MxCore { // FUNCTION: LEGO1 0x10008f70 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0730 + // STRING: LEGO1 0x100f0730 return "MxObjectFactory"; } diff --git a/LEGO1/mxpalette.cpp b/LEGO1/mxpalette.cpp index 6d4f0306..8431fb76 100644 --- a/LEGO1/mxpalette.cpp +++ b/LEGO1/mxpalette.cpp @@ -4,7 +4,6 @@ #include "mxvideomanager.h" // GLOBAL: LEGO1 0x10102188 -// SIZE 0x400 PALETTEENTRY g_defaultPaletteEntries[256] = { {0u, 0u, 0u, 0u}, {128u, 0u, 0u, 0u}, {0u, 128u, 0u, 0u}, {128u, 128u, 0u, 0u}, {0u, 0u, 128u, 0u}, {128u, 0u, 128u, 0u}, {0u, 128u, 128u, 0u}, {128u, 128u, 128u, 0u}, diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index e0e91fe6..bc327c1f 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -34,7 +34,7 @@ class MxPresenter : public MxCore { // FUNCTION: LEGO1 0x1000bfe0 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0740 + // STRING: LEGO1 0x100f0740 return "MxPresenter"; } diff --git a/LEGO1/mxramstreamcontroller.h b/LEGO1/mxramstreamcontroller.h index 008fe458..aa70ec33 100644 --- a/LEGO1/mxramstreamcontroller.h +++ b/LEGO1/mxramstreamcontroller.h @@ -14,7 +14,7 @@ class MxRAMStreamController : public MxStreamController { // FUNCTION: LEGO1 0x100b9430 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10102118 + // STRING: LEGO1 0x10102118 return "MxRAMStreamController"; } diff --git a/LEGO1/mxramstreamprovider.h b/LEGO1/mxramstreamprovider.h index 112f6b71..16ed5a4c 100644 --- a/LEGO1/mxramstreamprovider.h +++ b/LEGO1/mxramstreamprovider.h @@ -12,7 +12,7 @@ class MxRAMStreamProvider : public MxStreamProvider { // FUNCTION: LEGO1 0x100d0970 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10102864 + // STRING: LEGO1 0x10102864 return "MxRAMStreamProvider"; } diff --git a/LEGO1/mxsmkpresenter.h b/LEGO1/mxsmkpresenter.h index 95b6a201..4c3913cc 100644 --- a/LEGO1/mxsmkpresenter.h +++ b/LEGO1/mxsmkpresenter.h @@ -15,7 +15,7 @@ class MxSmkPresenter : public MxVideoPresenter { // FUNCTION: LEGO1 0x100b3730 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101e38 + // STRING: LEGO1 0x10101e38 return "MxSmkPresenter"; } diff --git a/LEGO1/mxsoundpresenter.h b/LEGO1/mxsoundpresenter.h index 1c4051ee..d61d8088 100644 --- a/LEGO1/mxsoundpresenter.h +++ b/LEGO1/mxsoundpresenter.h @@ -13,7 +13,7 @@ class MxSoundPresenter : public MxAudioPresenter { // FUNCTION: LEGO1 0x1000d4a0 inline virtual const char* ClassName() const // vtable+0x0c { - // GLOBAL: LEGO1 0x100f07a0 + // STRING: LEGO1 0x100f07a0 return "MxSoundPresenter"; }; diff --git a/LEGO1/mxstillpresenter.h b/LEGO1/mxstillpresenter.h index e28ab84f..828f58b7 100644 --- a/LEGO1/mxstillpresenter.h +++ b/LEGO1/mxstillpresenter.h @@ -15,7 +15,7 @@ class MxStillPresenter : public MxVideoPresenter { // FUNCTION: LEGO1 0x100435c0 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0184 + // STRING: LEGO1 0x100f0184 return "MxStillPresenter"; } diff --git a/LEGO1/mxstreamchunk.h b/LEGO1/mxstreamchunk.h index 18bc2335..5b258603 100644 --- a/LEGO1/mxstreamchunk.h +++ b/LEGO1/mxstreamchunk.h @@ -17,7 +17,7 @@ class MxStreamChunk : public MxDSChunk { // FUNCTION: LEGO1 0x100b1fe0 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10101e5c + // STRING: LEGO1 0x10101e5c return "MxStreamChunk"; } diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h index 0389772b..bbd1eb3d 100644 --- a/LEGO1/mxstreamcontroller.h +++ b/LEGO1/mxstreamcontroller.h @@ -24,7 +24,7 @@ class MxStreamController : public MxCore { // FUNCTION: LEGO1 0x100c0f10 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x10102130 + // STRING: LEGO1 0x10102130 return "MxStreamController"; } diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index 8017e898..4d3684e9 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -78,7 +78,7 @@ class MxStreamer : public MxCore { // FUNCTION: LEGO1 0x100b9000 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x1010210c + // STRING: LEGO1 0x1010210c return "MxStreamer"; } diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h index d25ecb2b..4c1bab5e 100644 --- a/LEGO1/mxvideopresenter.h +++ b/LEGO1/mxvideopresenter.h @@ -23,7 +23,7 @@ class MxVideoPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x1000c820 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0760 + // STRING: LEGO1 0x100f0760 return "MxVideoPresenter"; } diff --git a/LEGO1/mxwavepresenter.h b/LEGO1/mxwavepresenter.h index 4210a44e..cd09d486 100644 --- a/LEGO1/mxwavepresenter.h +++ b/LEGO1/mxwavepresenter.h @@ -16,7 +16,7 @@ class MxWavePresenter : public MxSoundPresenter { // FUNCTION: LEGO1 0x1000d6c0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f07b4 + // STRING: LEGO1 0x100f07b4 return "MxWavePresenter"; } diff --git a/LEGO1/pizza.h b/LEGO1/pizza.h index f1ac9f45..11bf6814 100644 --- a/LEGO1/pizza.h +++ b/LEGO1/pizza.h @@ -20,7 +20,7 @@ class Pizza : public IsleActor { // FUNCTION: LEGO1 0x10037f90 inline const char* ClassName() const // vtable+0c { - // GLOBAL: LEGO1 0x100f038c + // STRING: LEGO1 0x100f038c return "Pizza"; } diff --git a/LEGO1/pizzamissionstate.h b/LEGO1/pizzamissionstate.h index a9231c81..85b8e4bb 100644 --- a/LEGO1/pizzamissionstate.h +++ b/LEGO1/pizzamissionstate.h @@ -18,7 +18,7 @@ class PizzaMissionState : public LegoState { // FUNCTION: LEGO1 0x10039290 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f00d4 + // STRING: LEGO1 0x100f00d4 return "PizzaMissionState"; } diff --git a/LEGO1/pizzeria.h b/LEGO1/pizzeria.h index b9fcadf3..0196d616 100644 --- a/LEGO1/pizzeria.h +++ b/LEGO1/pizzeria.h @@ -10,7 +10,7 @@ class Pizzeria : public IsleActor { // FUNCTION: LEGO1 0x1000e780 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0380 + // STRING: LEGO1 0x100f0380 return "Pizzeria"; } diff --git a/LEGO1/pizzeriastate.h b/LEGO1/pizzeriastate.h index 53f4ddd5..c27fcef0 100644 --- a/LEGO1/pizzeriastate.h +++ b/LEGO1/pizzeriastate.h @@ -12,7 +12,7 @@ class PizzeriaState : public LegoState { // FUNCTION: LEGO1 0x10017c20 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0370 + // STRING: LEGO1 0x100f0370 return "PizzeriaState"; } diff --git a/LEGO1/police.h b/LEGO1/police.h index 0da58828..829c7e66 100644 --- a/LEGO1/police.h +++ b/LEGO1/police.h @@ -16,7 +16,7 @@ class Police : public LegoWorld { // FUNCTION: LEGO1 0x1005e1e0 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0450 + // STRING: LEGO1 0x100f0450 return "Police"; } diff --git a/LEGO1/policeentity.h b/LEGO1/policeentity.h index e2314dd3..735cf0bc 100644 --- a/LEGO1/policeentity.h +++ b/LEGO1/policeentity.h @@ -10,7 +10,7 @@ class PoliceEntity : public BuildingEntity { // FUNCTION: LEGO1 0x1000ed60 inline virtual const char* ClassName() const override // vtable+0xc { - // GLOBAL: LEGO1 0x100f0328 + // STRING: LEGO1 0x100f0328 return "PoliceEntity"; } diff --git a/LEGO1/policestate.h b/LEGO1/policestate.h index b3a732c9..2638a393 100644 --- a/LEGO1/policestate.h +++ b/LEGO1/policestate.h @@ -12,7 +12,7 @@ class PoliceState : public LegoState { // FUNCTION: LEGO1 0x1005e860 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0444 + // STRING: LEGO1 0x100f0444 return "PoliceState"; } diff --git a/LEGO1/racecar.h b/LEGO1/racecar.h index b0db77c5..b4a210e6 100644 --- a/LEGO1/racecar.h +++ b/LEGO1/racecar.h @@ -14,7 +14,7 @@ class RaceCar : public IslePathActor { // FUNCTION: LEGO1 0x10028270 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03e0 + // STRING: LEGO1 0x100f03e0 return "RaceCar"; } diff --git a/LEGO1/racestate.h b/LEGO1/racestate.h index 63a775d4..ef3cfa63 100644 --- a/LEGO1/racestate.h +++ b/LEGO1/racestate.h @@ -20,7 +20,7 @@ class RaceState : public LegoState { // FUNCTION: LEGO1 0x10016010 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f07d0 + // STRING: LEGO1 0x100f07d0 return "RaceState"; } diff --git a/LEGO1/radio.h b/LEGO1/radio.h index 8d454483..54aef25b 100644 --- a/LEGO1/radio.h +++ b/LEGO1/radio.h @@ -13,7 +13,7 @@ class Radio : public MxCore { // FUNCTION: LEGO1 0x1002c8e0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f328c + // STRING: LEGO1 0x100f328c return "Radio"; } diff --git a/LEGO1/radiostate.h b/LEGO1/radiostate.h index dc2c8b8f..a5ea6035 100644 --- a/LEGO1/radiostate.h +++ b/LEGO1/radiostate.h @@ -12,7 +12,7 @@ class RadioState : public LegoState { // FUNCTION: LEGO1 0x1002cf60 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f04f8 + // STRING: LEGO1 0x100f04f8 return "RadioState"; } diff --git a/LEGO1/realtime/matrix.cpp b/LEGO1/realtime/matrix.cpp index 852e14d0..61f7b1a9 100644 --- a/LEGO1/realtime/matrix.cpp +++ b/LEGO1/realtime/matrix.cpp @@ -138,7 +138,7 @@ void Matrix4Impl::ToQuaternion(Vector4Impl* p_outQuat) return; } - // GLOBAL: LEGO1 0x100d4090 + // ~GLOBAL: LEGO1 0x100d4090 static int rotateIndex[] = {1, 2, 0}; // Largest element along the trace diff --git a/LEGO1/registrationbook.h b/LEGO1/registrationbook.h index 4f19a8dc..3ae904c9 100644 --- a/LEGO1/registrationbook.h +++ b/LEGO1/registrationbook.h @@ -15,7 +15,7 @@ class RegistrationBook : public LegoWorld { // FUNCTION: LEGO1 0x10076e10 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f04c8 + // STRING: LEGO1 0x100f04c8 return "RegistrationBook"; } diff --git a/LEGO1/score.h b/LEGO1/score.h index 89d9608d..c927863f 100644 --- a/LEGO1/score.h +++ b/LEGO1/score.h @@ -18,7 +18,7 @@ class Score : public LegoWorld { // FUNCTION: LEGO1 0x100010c0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0050 + // STRING: LEGO1 0x100f0050 return "Score"; } diff --git a/LEGO1/scorestate.h b/LEGO1/scorestate.h index 2797ad34..21be3493 100644 --- a/LEGO1/scorestate.h +++ b/LEGO1/scorestate.h @@ -10,7 +10,7 @@ class ScoreState : public LegoState { // FUNCTION: LEGO1 0x1000de40 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f0084 + // STRING: LEGO1 0x100f0084 return "ScoreState"; }; diff --git a/LEGO1/skateboard.h b/LEGO1/skateboard.h index 671c7f86..171705c4 100644 --- a/LEGO1/skateboard.h +++ b/LEGO1/skateboard.h @@ -13,7 +13,7 @@ class SkateBoard : public IslePathActor { // FUNCTION: LEGO1 0x1000fdd0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f041c + // STRING: LEGO1 0x100f041c return "SkateBoard"; } diff --git a/LEGO1/tgl/d3drm/renderer.cpp b/LEGO1/tgl/d3drm/renderer.cpp index d098f7ff..bd9ed873 100644 --- a/LEGO1/tgl/d3drm/renderer.cpp +++ b/LEGO1/tgl/d3drm/renderer.cpp @@ -61,7 +61,7 @@ Device* RendererImpl::CreateDevice(const DeviceDirect3DCreateData& data) } // GLOBAL: LEGO1 0x10101040 -static int gSetBufferCount = 1; +static int g_SetBufferCount = 1; // FUNCTION: LEGO1 0x100a1900 Device* RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& data) @@ -73,7 +73,7 @@ Device* RendererImpl::CreateDevice(const DeviceDirectDrawCreateData& data) data.m_pBackBuffer, &device->m_data ); - if (SUCCEEDED(result) && data.m_pBackBuffer && gSetBufferCount) { + if (SUCCEEDED(result) && data.m_pBackBuffer && g_SetBufferCount) { device->m_data->SetBufferCount(2); } if (!SUCCEEDED(result)) { diff --git a/LEGO1/towtrack.h b/LEGO1/towtrack.h index 2243f9a2..1cc7e6af 100644 --- a/LEGO1/towtrack.h +++ b/LEGO1/towtrack.h @@ -13,7 +13,7 @@ class TowTrack : public IslePathActor { // FUNCTION: LEGO1 0x1004c7c0 inline virtual const char* ClassName() const override // vtable+0x0c { - // GLOBAL: LEGO1 0x100f03b8 + // STRING: LEGO1 0x100f03b8 return "TowTrack"; } diff --git a/LEGO1/towtrackmissionstate.h b/LEGO1/towtrackmissionstate.h index 7537cb94..9dc7c587 100644 --- a/LEGO1/towtrackmissionstate.h +++ b/LEGO1/towtrackmissionstate.h @@ -12,7 +12,7 @@ class TowTrackMissionState : public LegoState { // FUNCTION: LEGO1 0x1004dfa0 inline virtual const char* ClassName() const // vtable+0x0c { - // GLOBAL: LEGO1 0x100f00bc + // STRING: LEGO1 0x100f00bc return "TowTrackMissionState"; } diff --git a/tools/isledecomp/isledecomp/parser/error.py b/tools/isledecomp/isledecomp/parser/error.py index 638a806e..eb1aa7b8 100644 --- a/tools/isledecomp/isledecomp/parser/error.py +++ b/tools/isledecomp/isledecomp/parser/error.py @@ -39,6 +39,14 @@ class ParserError(Enum): # WARN: We found a marker to be referenced by name outside of a header file. BYNAME_FUNCTION_IN_CPP = 109 + # WARN: A GLOBAL marker appeared over a variable without the g_ prefix + GLOBAL_MISSING_PREFIX = 110 + + # WARN: GLOBAL marker points at something other than variable declaration. + # We can't match global variables based on position, but the goal here is + # to ignore things like string literal that are not variables. + GLOBAL_NOT_VARIABLE = 111 + # This code or higher is an error, not a warning DECOMP_ERROR_START = 200 @@ -50,13 +58,18 @@ class ParserError(Enum): # For example, a GLOBAL cannot follow FUNCTION/STUB INCOMPATIBLE_MARKER = 201 - # ERROR: The line following a synthetic marker was not a comment - BAD_SYNTHETIC = 202 + # ERROR: The line following an explicit by-name marker was not a comment + # We assume a syntax error here rather than try to use the next line + BAD_NAMEREF = 202 # ERROR: This function offset comes before the previous offset from the same module # This hopefully gives some hint about which functions need to be rearranged. FUNCTION_OUT_OF_ORDER = 203 + # ERROR: The line following an explicit by-name marker that does _not_ expect + # a comment -- i.e. VTABLE or GLOBAL -- could not extract the name + NO_SUITABLE_NAME = 204 + @dataclass class ParserAlert: diff --git a/tools/isledecomp/isledecomp/parser/marker.py b/tools/isledecomp/isledecomp/parser/marker.py new file mode 100644 index 00000000..d2e181dd --- /dev/null +++ b/tools/isledecomp/isledecomp/parser/marker.py @@ -0,0 +1,103 @@ +import re +from typing import Optional +from enum import Enum + + +class MarkerType(Enum): + UNKNOWN = -100 + FUNCTION = 1 + STUB = 2 + SYNTHETIC = 3 + TEMPLATE = 4 + GLOBAL = 5 + VTABLE = 6 + STRING = 7 + LIBRARY = 8 + + +markerRegex = re.compile( + r"\s*//\s*(?P\w+):\s*(?P\w+)\s+(?P0x[a-f0-9]+)", + flags=re.I, +) + + +markerExactRegex = re.compile( + r"\s*// (?P[A-Z]+): (?P[A-Z0-9]+) (?P0x[a-f0-9]+)$" +) + + +class DecompMarker: + def __init__(self, marker_type: str, module: str, offset: int) -> None: + try: + self._type = MarkerType[marker_type.upper()] + except KeyError: + self._type = MarkerType.UNKNOWN + + # Convert to upper here. A lot of other analysis depends on this name + # being consistent and predictable. If the name is _not_ capitalized + # we will emit a syntax error. + self._module: str = module.upper() + self._offset: int = offset + + @property + def type(self) -> MarkerType: + return self._type + + @property + def module(self) -> str: + return self._module + + @property + def offset(self) -> int: + return self._offset + + def is_regular_function(self) -> bool: + """Regular function, meaning: not an explicit byname lookup. FUNCTION + markers can be _implicit_ byname. + FUNCTION and STUB markers are (currently) the only heterogenous marker types that + can be lumped together, although the reasons for doing so are a little vague.""" + return self._type in (MarkerType.FUNCTION, MarkerType.STUB) + + def is_explicit_byname(self) -> bool: + return self._type in ( + MarkerType.SYNTHETIC, + MarkerType.TEMPLATE, + MarkerType.LIBRARY, + ) + + def is_variable(self) -> bool: + return self._type == MarkerType.GLOBAL + + def is_synthetic(self) -> bool: + return self._type == MarkerType.SYNTHETIC + + def is_template(self) -> bool: + return self._type == MarkerType.TEMPLATE + + def is_vtable(self) -> bool: + return self._type == MarkerType.VTABLE + + def is_library(self) -> bool: + return self._type == MarkerType.LIBRARY + + def is_string(self) -> bool: + return self._type == MarkerType.STRING + + def allowed_in_func(self) -> bool: + return self._type in (MarkerType.GLOBAL, MarkerType.STRING) + + +def match_marker(line: str) -> Optional[DecompMarker]: + match = markerRegex.match(line) + if match is None: + return None + + return DecompMarker( + marker_type=match.group("type"), + module=match.group("module"), + offset=int(match.group("offset"), 16), + ) + + +def is_marker_exact(line: str) -> bool: + return markerExactRegex.match(line) is not None diff --git a/tools/isledecomp/isledecomp/parser/node.py b/tools/isledecomp/isledecomp/parser/node.py index 721a24b9..b6561fd6 100644 --- a/tools/isledecomp/isledecomp/parser/node.py +++ b/tools/isledecomp/isledecomp/parser/node.py @@ -1,35 +1,57 @@ +from typing import Optional from dataclasses import dataclass +from .marker import MarkerType @dataclass -class ParserNode: +class ParserSymbol: + """Exported decomp marker with all information (except the code filename) required to + cross-reference with cvdump data.""" + + type: MarkerType line_number: int - - -@dataclass -class ParserSymbol(ParserNode): module: str offset: int + name: str + + # The parser doesn't (currently) know about the code filename, but if you + # wanted to set it here after the fact, here's the spot. + filename: Optional[str] = None + + def should_skip(self) -> bool: + """The default is to compare any symbols we have""" + return False + + def is_nameref(self) -> bool: + """All symbols default to name lookup""" + return True @dataclass class ParserFunction(ParserSymbol): - name: str + # We are able to detect the closing line of a function with some reliability. + # This isn't used for anything right now, but perhaps later it will be. + end_line: Optional[int] = None + + # All marker types are referenced by name except FUNCTION/STUB. These can also be + # referenced by name, but only if this flag is true. lookup_by_name: bool = False - is_stub: bool = False - is_synthetic: bool = False - is_template: bool = False - end_line: int = -1 + + def should_skip(self) -> bool: + return self.type == MarkerType.STUB + + def is_nameref(self) -> bool: + return ( + self.type in (MarkerType.SYNTHETIC, MarkerType.TEMPLATE, MarkerType.LIBRARY) + or self.lookup_by_name + ) @dataclass class ParserVariable(ParserSymbol): - name: str - size: int = -1 is_static: bool = False @dataclass class ParserVtable(ParserSymbol): - class_name: str - num_entries: int = -1 + pass diff --git a/tools/isledecomp/isledecomp/parser/parser.py b/tools/isledecomp/isledecomp/parser/parser.py index 336d4b0c..f9485e65 100644 --- a/tools/isledecomp/isledecomp/parser/parser.py +++ b/tools/isledecomp/isledecomp/parser/parser.py @@ -3,15 +3,19 @@ from typing import List, Iterable, Iterator from enum import Enum from .util import ( - DecompMarker, is_blank_or_comment, - match_marker, - is_marker_exact, get_class_name, + get_variable_name, get_synthetic_name, remove_trailing_comment, ) +from .marker import ( + DecompMarker, + match_marker, + is_marker_exact, +) from .node import ( + ParserSymbol, ParserFunction, ParserVariable, ParserVtable, @@ -28,44 +32,23 @@ class ReaderState(Enum): IN_GLOBAL = 5 IN_FUNC_GLOBAL = 6 IN_VTABLE = 7 + IN_SYNTHETIC = 8 + IN_LIBRARY = 9 DONE = 100 -def marker_is_stub(marker: DecompMarker) -> bool: - return marker.type.upper() == "STUB" - - -def marker_is_variable(marker: DecompMarker) -> bool: - return marker.type.upper() == "GLOBAL" - - -def marker_is_synthetic(marker: DecompMarker) -> bool: - return marker.type.upper() in ("SYNTHETIC", "TEMPLATE") - - -def marker_is_template(marker: DecompMarker) -> bool: - return marker.type.upper() == "TEMPLATE" - - -def marker_is_function(marker: DecompMarker) -> bool: - return marker.type.upper() in ("FUNCTION", "STUB") - - -def marker_is_vtable(marker: DecompMarker) -> bool: - return marker.type.upper() == "VTABLE" - - class MarkerDict: def __init__(self) -> None: self.markers: dict = {} def insert(self, marker: DecompMarker) -> bool: """Return True if this insert would overwrite""" - module = marker.module.upper() + module = marker.module if module in self.markers: return True - self.markers[module] = (marker.type, marker.offset) + # TODO: type converted back to string version here instead of using enum + self.markers[module] = (marker.type.name, marker.offset) return False def iter(self) -> Iterator[DecompMarker]: @@ -82,9 +65,7 @@ class DecompParser: # but not right now def __init__(self) -> None: # The lists to be populated as we parse - self.functions: List[ParserFunction] = [] - self.vtables: List[ParserVtable] = [] - self.variables: List[ParserVariable] = [] + self._symbols: List[ParserSymbol] = [] self.alerts: List[ParserAlert] = [] self.line_number: int = 0 @@ -113,9 +94,7 @@ def __init__(self) -> None: self.function_sig: str = "" def reset(self): - self.functions = [] - self.vtables = [] - self.variables = [] + self._symbols = [] self.alerts = [] self.line_number = 0 @@ -131,6 +110,18 @@ def reset(self): self.function_start = 0 self.function_sig = "" + @property + def functions(self) -> List[ParserSymbol]: + return [s for s in self._symbols if isinstance(s, ParserFunction)] + + @property + def vtables(self) -> List[ParserSymbol]: + return [s for s in self._symbols if isinstance(s, ParserVtable)] + + @property + def variables(self) -> List[ParserSymbol]: + return [s for s in self._symbols if isinstance(s, ParserVariable)] + def _recover(self): """We hit a syntax error and need to reset temp structures""" self.state = ReaderState.SEARCH @@ -159,10 +150,17 @@ def _function_marker(self, marker: DecompMarker): self._syntax_warning(ParserError.DUPLICATE_MODULE) self.state = ReaderState.WANT_SIG - def _synthetic_marker(self, marker: DecompMarker): + def _nameref_marker(self, marker: DecompMarker): + """Functions explicitly referenced by name are set here""" if self.fun_markers.insert(marker): self._syntax_warning(ParserError.DUPLICATE_MODULE) - self.state = ReaderState.IN_TEMPLATE + + if marker.is_template(): + self.state = ReaderState.IN_TEMPLATE + elif marker.is_synthetic(): + self.state = ReaderState.IN_SYNTHETIC + else: + self.state = ReaderState.IN_LIBRARY def _function_done(self, lookup_by_name: bool = False, unexpected: bool = False): end_line = self.line_number @@ -173,16 +171,14 @@ def _function_done(self, lookup_by_name: bool = False, unexpected: bool = False) end_line -= 1 for marker in self.fun_markers.iter(): - self.functions.append( + self._symbols.append( ParserFunction( + type=marker.type, line_number=self.function_start, module=marker.module, offset=marker.offset, - lookup_by_name=lookup_by_name, - is_stub=marker_is_stub(marker), - is_synthetic=marker_is_synthetic(marker), - is_template=marker_is_template(marker), name=self.function_sig, + lookup_by_name=lookup_by_name, end_line=end_line, ) ) @@ -202,12 +198,13 @@ def _vtable_done(self, class_name: str = None): class_name = self.last_line.strip() for marker in self.tbl_markers.iter(): - self.vtables.append( + self._symbols.append( ParserVtable( + type=marker.type, line_number=self.line_number, module=marker.module, offset=marker.offset, - class_name=class_name, + name=class_name, ) ) @@ -223,14 +220,19 @@ def _variable_marker(self, marker: DecompMarker): else: self.state = ReaderState.IN_GLOBAL - def _variable_done(self): + def _variable_done(self, name: str): + if not name.startswith("g_"): + self._syntax_warning(ParserError.GLOBAL_MISSING_PREFIX) + for marker in self.var_markers.iter(): - self.variables.append( + self._symbols.append( ParserVariable( + type=marker.type, line_number=self.line_number, module=marker.module, offset=marker.offset, - name=self.last_line.strip(), + name=name, + is_static=self.state == ReaderState.IN_FUNC_GLOBAL, ) ) @@ -246,12 +248,23 @@ def _handle_marker(self, marker: DecompMarker): self._syntax_error(ParserError.UNEXPECTED_MARKER) return + # If we are inside a function, the only markers we accept are: + # GLOBAL, indicating a static variable + # STRING, indicating a literal string. + # Otherwise we assume that the parser missed the end of the function + # and we have moved on to something else. + # This is unlikely to occur with well-formed code, but + # we can recover easily by just ending the function here. + if self.state == ReaderState.IN_FUNC and not marker.allowed_in_func(): + self._syntax_warning(ParserError.MISSED_END_OF_FUNCTION) + self._function_done(unexpected=True) + # TODO: How uncertain are we of detecting the end of a function # in a clang-formatted file? For now we assume we have missed the # end if we detect a non-GLOBAL marker while state is IN_FUNC. # Maybe these cases should be syntax errors instead - if marker_is_function(marker): + if marker.is_regular_function(): if self.state in ( ReaderState.SEARCH, ReaderState.WANT_SIG, @@ -259,29 +272,41 @@ def _handle_marker(self, marker: DecompMarker): # We will allow multiple offsets if we have just begun # the code block, but not after we hit the curly brace. self._function_marker(marker) - elif self.state == ReaderState.IN_FUNC: - # We hit another offset unexpectedly. - # We can recover easily by just ending the function here. - self._syntax_warning(ParserError.MISSED_END_OF_FUNCTION) - self._function_done(unexpected=True) - - # Start the next function right after so we can - # read the next line. - self._function_marker(marker) else: self._syntax_error(ParserError.INCOMPATIBLE_MARKER) - elif marker_is_synthetic(marker): + elif marker.is_template(): if self.state in (ReaderState.SEARCH, ReaderState.IN_TEMPLATE): - self._synthetic_marker(marker) - elif self.state == ReaderState.IN_FUNC: - self._syntax_warning(ParserError.MISSED_END_OF_FUNCTION) - self._function_done(lookup_by_name=True, unexpected=True) - self._synthetic_marker(marker) + self._nameref_marker(marker) else: self._syntax_error(ParserError.INCOMPATIBLE_MARKER) - elif marker_is_variable(marker): + elif marker.is_synthetic(): + if self.state in (ReaderState.SEARCH, ReaderState.IN_SYNTHETIC): + self._nameref_marker(marker) + else: + self._syntax_error(ParserError.INCOMPATIBLE_MARKER) + + elif marker.is_library(): + if self.state in (ReaderState.SEARCH, ReaderState.IN_LIBRARY): + self._nameref_marker(marker) + else: + self._syntax_error(ParserError.INCOMPATIBLE_MARKER) + + elif marker.is_string(): + # TODO: We are ignoring string markers for the moment. + # We already have a lot of them in the codebase, though, so we'll + # hang onto them for now in case we can use them later. + # To match up string constants, the strategy will be: + # 1. Use cvdump to find all string constants in the recomp + # 2. In the original binary, look at relocated vaddrs from .rdata + # 3. Try to match up string data from #1 with locations in #2 + + # Throw the syntax error we would throw if we were parsing these + if self.state not in (ReaderState.SEARCH, ReaderState.IN_FUNC): + self._syntax_error(ParserError.INCOMPATIBLE_MARKER) + + elif marker.is_variable(): if self.state in ( ReaderState.SEARCH, ReaderState.IN_GLOBAL, @@ -292,13 +317,9 @@ def _handle_marker(self, marker: DecompMarker): else: self._syntax_error(ParserError.INCOMPATIBLE_MARKER) - elif marker_is_vtable(marker): + elif marker.is_vtable(): if self.state in (ReaderState.SEARCH, ReaderState.IN_VTABLE): self._vtable_marker(marker) - elif self.state == ReaderState.IN_FUNC: - self._syntax_warning(ParserError.MISSED_END_OF_FUNCTION) - self._function_done(unexpected=True) - self._vtable_marker(marker) else: self._syntax_error(ParserError.INCOMPATIBLE_MARKER) @@ -322,12 +343,16 @@ def read_line(self, line: str): return line_strip = line.strip() - if self.state == ReaderState.IN_TEMPLATE: - # TEMPLATE functions are a special case. The signature is - # given on the next line (in a // comment) + if self.state in ( + ReaderState.IN_SYNTHETIC, + ReaderState.IN_TEMPLATE, + ReaderState.IN_LIBRARY, + ): + # Explicit nameref functions provide the function name + # on the next line (in a // comment) name = get_synthetic_name(line) if name is None: - self._syntax_error(ParserError.BAD_SYNTHETIC) + self._syntax_error(ParserError.BAD_NAMEREF) else: self.function_sig = name self._function_starts_here() @@ -384,8 +409,28 @@ def read_line(self, line: str): self._function_done() elif self.state in (ReaderState.IN_GLOBAL, ReaderState.IN_FUNC_GLOBAL): - if not is_blank_or_comment(line): - self._variable_done() + # TODO: Known problem that an error here will cause us to abandon a + # function we have already parsed if state == IN_FUNC_GLOBAL. + # However, we are not tolerant of _any_ syntax problems in our + # CI actions, so the solution is to just fix the invalid marker. + if is_blank_or_comment(line): + self._syntax_error(ParserError.NO_SUITABLE_NAME) + return + + # We don't have a foolproof mechanism to tell what is and is not a variable. + # If the GLOBAL is being declared on a `return` statement, though, this is + # not correct. It is either a string literal (which will be handled differently) + # or it is not the variable declaration, which is incorrect decomp syntax. + if line.strip().startswith("return"): + self._syntax_error(ParserError.GLOBAL_NOT_VARIABLE) + return + + name = get_variable_name(line) + if name is None: + self._syntax_error(ParserError.NO_SUITABLE_NAME) + return + + self._variable_done(name) elif self.state == ReaderState.IN_VTABLE: vtable_class = get_class_name(line) diff --git a/tools/isledecomp/isledecomp/parser/util.py b/tools/isledecomp/isledecomp/parser/util.py index 99ab1c56..a106d841 100644 --- a/tools/isledecomp/isledecomp/parser/util.py +++ b/tools/isledecomp/isledecomp/parser/util.py @@ -1,17 +1,6 @@ # C++ Parser utility functions and data structures -from __future__ import annotations # python <3.10 compatibility import re -from collections import namedtuple - -DecompMarker = namedtuple("DecompMarker", ["type", "module", "offset"]) - - -markerRegex = re.compile( - r"\s*//\s*(\w+):\s*(\w+)\s+(0x[a-f0-9]+)", - flags=re.I, -) - -markerExactRegex = re.compile(r"\s*// ([A-Z]+): ([A-Z0-9]+) (0x[a-f0-9]+)$") +from typing import Optional # The goal here is to just read whatever is on the next line, so some # flexibility in the formatting seems OK @@ -23,7 +12,7 @@ trailingCommentRegex = re.compile(r"(\s*(?://|/\*).*)$") -def get_synthetic_name(line: str) -> str | None: +def get_synthetic_name(line: str) -> Optional[str]: """Synthetic names appear on a single line comment on the line after the marker. If that's not what we have, return None""" template_match = templateCommentRegex.match(line) @@ -51,20 +40,6 @@ def is_blank_or_comment(line: str) -> bool: ) -def match_marker(line: str) -> DecompMarker | None: - match = markerRegex.match(line) - if match is None: - return None - - return DecompMarker( - type=match.group(1), module=match.group(2), offset=int(match.group(3), 16) - ) - - -def is_marker_exact(line: str) -> bool: - return markerExactRegex.match(line) is not None - - template_class_decl_regex = re.compile( r"\s*(?:\/\/)?\s*(?:class|struct) (\w+)<([\w]+)\s*(\*+)?\s*>" ) @@ -73,7 +48,7 @@ def is_marker_exact(line: str) -> bool: class_decl_regex = re.compile(r"\s*(?:\/\/)?\s*(?:class|struct) (\w+)") -def get_class_name(line: str) -> str | None: +def get_class_name(line: str) -> Optional[str]: """For VTABLE markers, extract the class name from the code line or comment where it appears.""" @@ -93,3 +68,21 @@ def get_class_name(line: str) -> str | None: return match.group(1) return None + + +global_regex = re.compile(r"(?Pg_\w+)") +less_strict_global_regex = re.compile(r"(?P\w+)(?:\)\(|\[.*|\s*=.*|;)") + + +def get_variable_name(line: str) -> Optional[str]: + """Grab the name of the variable annotated with the GLOBAL marker. + Correct syntax would have the variable start with the prefix "g_" + but we will try to match regardless.""" + + if (match := global_regex.search(line)) is not None: + return match.group("name") + + if (match := less_strict_global_regex.search(line)) is not None: + return match.group("name") + + return None diff --git a/tools/isledecomp/tests/test_parser.py b/tools/isledecomp/tests/test_parser.py index c31602f1..853e773d 100644 --- a/tools/isledecomp/tests/test_parser.py +++ b/tools/isledecomp/tests/test_parser.py @@ -115,7 +115,7 @@ def test_different_markers_same_module(parser): # Use first marker declaration, don't replace assert len(parser.functions) == 1 - assert parser.functions[0].is_stub is False + assert parser.functions[0].should_skip() is False # Should alert to this assert len(parser.alerts) == 1 @@ -193,7 +193,7 @@ def test_multiple_vtables(parser): ) assert len(parser.alerts) == 0 assert len(parser.vtables) == 2 - assert parser.vtables[0].class_name == "MxString" + assert parser.vtables[0].name == "MxString" def test_multiple_vtables_same_module(parser): @@ -247,7 +247,7 @@ def test_synthetic_no_comment(parser): ) assert len(parser.functions) == 0 assert len(parser.alerts) == 1 - assert parser.alerts[0].code == ParserError.BAD_SYNTHETIC + assert parser.alerts[0].code == ParserError.BAD_NAMEREF assert parser.state == ReaderState.SEARCH @@ -375,3 +375,70 @@ def test_unexpected_eof(parser): assert len(parser.functions) == 1 assert len(parser.alerts) == 1 assert parser.alerts[0].code == ParserError.UNEXPECTED_END_OF_FILE + + +def test_global_variable_prefix(parser): + """Global and static variables should have the g_ prefix.""" + parser.read_lines( + [ + "// GLOBAL: TEST 0x1234", + 'const char* g_msg = "hello";', + ] + ) + assert len(parser.variables) == 1 + assert len(parser.alerts) == 0 + + parser.read_lines( + [ + "// GLOBAL: TEXT 0x5555", + "int test = 5;", + ] + ) + assert len(parser.alerts) == 1 + assert parser.alerts[0].code == ParserError.GLOBAL_MISSING_PREFIX + # In spite of that, we should still grab the variable name. + assert parser.variables[1].name == "test" + + +def test_global_nomatch(parser): + """We do our best to grab the variable name, even without the g_ prefix + but this (by design) will not match everything.""" + + parser.read_lines( + [ + "// GLOBAL: TEST 0x1234", + "FunctionCall();", + ] + ) + assert len(parser.variables) == 0 + assert len(parser.alerts) == 1 + assert parser.alerts[0].code == ParserError.NO_SUITABLE_NAME + + +def test_static_variable(parser): + """We can detect whether a variable is a static function variable + based on the parser's state when we detect it. + Checking for the word `static` alone is not a good test. + Static class variables are filed as S_GDATA32, same as regular globals. + Only function statics are filed as S_LDATA32.""" + + parser.read_lines( + [ + "// GLOBAL: TEST 0x1234", + "int g_test = 1234;", + ] + ) + assert len(parser.variables) == 1 + assert parser.variables[0].is_static is False + + parser.read_lines( + [ + "// FUNCTION: TEST 0x5555", + "void test_function() {", + "// GLOBAL: TEST 0x8888", + "int g_internal = 0;", + "}", + ] + ) + assert len(parser.variables) == 2 + assert parser.variables[1].is_static is True diff --git a/tools/isledecomp/tests/test_parser_statechange.py b/tools/isledecomp/tests/test_parser_statechange.py index 8d18d547..cb54cf0a 100644 --- a/tools/isledecomp/tests/test_parser_statechange.py +++ b/tools/isledecomp/tests/test_parser_statechange.py @@ -11,9 +11,11 @@ (_rs.SEARCH, "FUNCTION", _rs.WANT_SIG, None), (_rs.SEARCH, "GLOBAL", _rs.IN_GLOBAL, None), (_rs.SEARCH, "STUB", _rs.WANT_SIG, None), - (_rs.SEARCH, "SYNTHETIC", _rs.IN_TEMPLATE, None), + (_rs.SEARCH, "SYNTHETIC", _rs.IN_SYNTHETIC, None), (_rs.SEARCH, "TEMPLATE", _rs.IN_TEMPLATE, None), (_rs.SEARCH, "VTABLE", _rs.IN_VTABLE, None), + (_rs.SEARCH, "LIBRARY", _rs.IN_LIBRARY, None), + (_rs.SEARCH, "STRING", _rs.SEARCH, None), (_rs.WANT_SIG, "FUNCTION", _rs.WANT_SIG, None), (_rs.WANT_SIG, "GLOBAL", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), @@ -21,20 +23,26 @@ (_rs.WANT_SIG, "SYNTHETIC", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.WANT_SIG, "TEMPLATE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.WANT_SIG, "VTABLE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.WANT_SIG, "LIBRARY", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.WANT_SIG, "STRING", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_FUNC, "FUNCTION", _rs.WANT_SIG, _pe.MISSED_END_OF_FUNCTION), (_rs.IN_FUNC, "GLOBAL", _rs.IN_FUNC_GLOBAL, None), (_rs.IN_FUNC, "STUB", _rs.WANT_SIG, _pe.MISSED_END_OF_FUNCTION), - (_rs.IN_FUNC, "SYNTHETIC", _rs.IN_TEMPLATE, _pe.MISSED_END_OF_FUNCTION), + (_rs.IN_FUNC, "SYNTHETIC", _rs.IN_SYNTHETIC, _pe.MISSED_END_OF_FUNCTION), (_rs.IN_FUNC, "TEMPLATE", _rs.IN_TEMPLATE, _pe.MISSED_END_OF_FUNCTION), (_rs.IN_FUNC, "VTABLE", _rs.IN_VTABLE, _pe.MISSED_END_OF_FUNCTION), + (_rs.IN_FUNC, "LIBRARY", _rs.IN_LIBRARY, _pe.MISSED_END_OF_FUNCTION), + (_rs.IN_FUNC, "STRING", _rs.IN_FUNC, None), (_rs.IN_TEMPLATE, "FUNCTION", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_TEMPLATE, "GLOBAL", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_TEMPLATE, "STUB", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), - (_rs.IN_TEMPLATE, "SYNTHETIC", _rs.IN_TEMPLATE, None), + (_rs.IN_TEMPLATE, "SYNTHETIC", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_TEMPLATE, "TEMPLATE", _rs.IN_TEMPLATE, None), (_rs.IN_TEMPLATE, "VTABLE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_TEMPLATE, "LIBRARY", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_TEMPLATE, "STRING", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.WANT_CURLY, "FUNCTION", _rs.SEARCH, _pe.UNEXPECTED_MARKER), (_rs.WANT_CURLY, "GLOBAL", _rs.SEARCH, _pe.UNEXPECTED_MARKER), @@ -42,6 +50,8 @@ (_rs.WANT_CURLY, "SYNTHETIC", _rs.SEARCH, _pe.UNEXPECTED_MARKER), (_rs.WANT_CURLY, "TEMPLATE", _rs.SEARCH, _pe.UNEXPECTED_MARKER), (_rs.WANT_CURLY, "VTABLE", _rs.SEARCH, _pe.UNEXPECTED_MARKER), + (_rs.WANT_CURLY, "LIBRARY", _rs.SEARCH, _pe.UNEXPECTED_MARKER), + (_rs.WANT_CURLY, "STRING", _rs.SEARCH, _pe.UNEXPECTED_MARKER), (_rs.IN_GLOBAL, "FUNCTION", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_GLOBAL, "GLOBAL", _rs.IN_GLOBAL, None), @@ -49,6 +59,8 @@ (_rs.IN_GLOBAL, "SYNTHETIC", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_GLOBAL, "TEMPLATE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_GLOBAL, "VTABLE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_GLOBAL, "LIBRARY", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_GLOBAL, "STRING", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_FUNC_GLOBAL, "FUNCTION", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_FUNC_GLOBAL, "GLOBAL", _rs.IN_FUNC_GLOBAL, None), @@ -56,6 +68,8 @@ (_rs.IN_FUNC_GLOBAL, "SYNTHETIC", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_FUNC_GLOBAL, "TEMPLATE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_FUNC_GLOBAL, "VTABLE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_FUNC_GLOBAL, "LIBRARY", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_FUNC_GLOBAL, "STRING", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_VTABLE, "FUNCTION", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_VTABLE, "GLOBAL", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), @@ -63,6 +77,26 @@ (_rs.IN_VTABLE, "SYNTHETIC", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_VTABLE, "TEMPLATE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), (_rs.IN_VTABLE, "VTABLE", _rs.IN_VTABLE, None), + (_rs.IN_VTABLE, "LIBRARY", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_VTABLE, "STRING", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + + (_rs.IN_SYNTHETIC, "FUNCTION", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_SYNTHETIC, "GLOBAL", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_SYNTHETIC, "STUB", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_SYNTHETIC, "SYNTHETIC", _rs.IN_SYNTHETIC, None), + (_rs.IN_SYNTHETIC, "TEMPLATE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_SYNTHETIC, "VTABLE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_SYNTHETIC, "LIBRARY", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_SYNTHETIC, "STRING", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + + (_rs.IN_LIBRARY, "FUNCTION", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_LIBRARY, "GLOBAL", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_LIBRARY, "STUB", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_LIBRARY, "SYNTHETIC", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_LIBRARY, "TEMPLATE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_LIBRARY, "VTABLE", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), + (_rs.IN_LIBRARY, "LIBRARY", _rs.IN_LIBRARY, None), + (_rs.IN_LIBRARY, "STRING", _rs.SEARCH, _pe.INCOMPATIBLE_MARKER), ] # fmt: on @@ -105,47 +139,3 @@ def test_state_search_line(line: str): p.read_line(line) assert p.state == _rs.SEARCH assert len(p.alerts) == 0 - - -global_lines = [ - ("// A comment", _rs.IN_GLOBAL), - ("", _rs.IN_GLOBAL), - ("\t", _rs.IN_GLOBAL), - (" ", _rs.IN_GLOBAL), - # TODO: no check for "likely" variable declaration so these all count - ("void function()", _rs.SEARCH), - ("int x = 123;", _rs.SEARCH), - ("just some text", _rs.SEARCH), -] - - -@pytest.mark.parametrize("line, new_state", global_lines) -def test_state_global_line(line: str, new_state: _rs): - p = DecompParser() - p.read_line("// GLOBAL: TEST 0x1234") - assert p.state == _rs.IN_GLOBAL - p.read_line(line) - assert p.state == new_state - - -# mostly same as above -in_func_global_lines = [ - ("// A comment", _rs.IN_FUNC_GLOBAL), - ("", _rs.IN_FUNC_GLOBAL), - ("\t", _rs.IN_FUNC_GLOBAL), - (" ", _rs.IN_FUNC_GLOBAL), - # TODO: no check for "likely" variable declaration so these all count - ("void function()", _rs.IN_FUNC), - ("int x = 123;", _rs.IN_FUNC), - ("just some text", _rs.IN_FUNC), -] - - -@pytest.mark.parametrize("line, new_state", in_func_global_lines) -def test_state_in_func_global_line(line: str, new_state: _rs): - p = DecompParser() - p.state = _rs.IN_FUNC - p.read_line("// GLOBAL: TEST 0x1234") - assert p.state == _rs.IN_FUNC_GLOBAL - p.read_line(line) - assert p.state == new_state diff --git a/tools/isledecomp/tests/test_parser_util.py b/tools/isledecomp/tests/test_parser_util.py index 643abf3e..af102fc2 100644 --- a/tools/isledecomp/tests/test_parser_util.py +++ b/tools/isledecomp/tests/test_parser_util.py @@ -1,11 +1,15 @@ import pytest from isledecomp.parser.parser import MarkerDict -from isledecomp.parser.util import ( +from isledecomp.parser.marker import ( DecompMarker, - is_blank_or_comment, + MarkerType, match_marker, is_marker_exact, +) +from isledecomp.parser.util import ( + is_blank_or_comment, get_class_name, + get_variable_name, ) @@ -96,7 +100,7 @@ def test_marker_dict_type_replace(): d.insert(DecompMarker("STUB", "TEST", 0x1234)) markers = list(d.iter()) assert len(markers) == 1 - assert markers[0].type == "FUNCTION" + assert markers[0].type == MarkerType.FUNCTION class_name_match_cases = [ @@ -131,3 +135,26 @@ def test_get_class_name(line: str, class_name: str): @pytest.mark.parametrize("line", class_name_no_match_cases) def test_get_class_name_none(line: str): assert get_class_name(line) is None + + +variable_name_cases = [ + # with prefix for easy access + ("char* g_test;", "g_test"), + ("g_test;", "g_test"), + ("void (*g_test)(int);", "g_test"), + ("char g_test[50];", "g_test"), + ("char g_test[50] = {1234,", "g_test"), + ("int g_test = 500;", "g_test"), + # no prefix + ("char* hello;", "hello"), + ("hello;", "hello"), + ("void (*hello)(int);", "hello"), + ("char hello[50];", "hello"), + ("char hello[50] = {1234,", "hello"), + ("int hello = 500;", "hello"), +] + + +@pytest.mark.parametrize("line,name", variable_name_cases) +def test_get_variable_name(line: str, name: str): + assert get_variable_name(line) == name diff --git a/tools/reccmp/reccmp.py b/tools/reccmp/reccmp.py index 913154f5..c7db5e2c 100755 --- a/tools/reccmp/reccmp.py +++ b/tools/reccmp/reccmp.py @@ -316,7 +316,7 @@ def main(): parser.read_lines(srcfile) for fun in parser.functions: - if fun.is_stub: + if fun.should_skip(): continue if fun.module != basename: @@ -330,7 +330,7 @@ def main(): else: continue - if fun.lookup_by_name: + if fun.is_nameref(): recinfo = syminfo.get_recompiled_address_from_name(fun.name) if not recinfo: continue