Compare commits

...

2 Commits

Author SHA1 Message Date
Fabian Neundorf
190c040c96 Clear unknowns in LegoWorld (#1674) 2025-08-25 15:13:10 -04:00
Fabian Neundorf
34293a9c04 Clear unknowns in RegistrationBook (#1678) 2025-08-25 08:18:56 -04:00
25 changed files with 121 additions and 120 deletions

View File

@@ -106,7 +106,7 @@ public:
MxResult Tickle() override; // vtable+0x08 MxResult Tickle() override; // vtable+0x08
// FUNCTION: LEGO1 0x10072500 // FUNCTION: LEGO1 0x10072500
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10072510 // FUNCTION: LEGO1 0x10072510
// FUNCTION: BETA10 0x10017550 // FUNCTION: BETA10 0x10017550

View File

@@ -18,7 +18,7 @@ public:
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x10017f10 // FUNCTION: LEGO1 0x10017f10
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10017f20 // FUNCTION: LEGO1 0x10017f20
// FUNCTION: BETA10 0x10028130 // FUNCTION: BETA10 0x10028130

View File

@@ -75,7 +75,7 @@ public:
MxResult Tickle() override; // vtable+0x08 MxResult Tickle() override; // vtable+0x08
// FUNCTION: LEGO1 0x10004770 // FUNCTION: LEGO1 0x10004770
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10004780 // FUNCTION: LEGO1 0x10004780
// FUNCTION: BETA10 0x10029d40 // FUNCTION: BETA10 0x10029d40

View File

@@ -79,7 +79,7 @@ public:
MxResult Tickle() override; // vtable+0x08 MxResult Tickle() override; // vtable+0x08
// FUNCTION: LEGO1 0x100746a0 // FUNCTION: LEGO1 0x100746a0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x100746b0 // FUNCTION: LEGO1 0x100746b0
// FUNCTION: BETA10 0x1002e1a0 // FUNCTION: BETA10 0x1002e1a0

View File

@@ -141,7 +141,7 @@ public:
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool VTable0x5c() override; // vtable+0x5c MxBool WaitForTransition() override; // vtable+0x5c
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68 void Enable(MxBool p_enable) override; // vtable+0x68

View File

@@ -17,7 +17,7 @@ public:
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x100377a0 // FUNCTION: LEGO1 0x100377a0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x100377b0 // FUNCTION: LEGO1 0x100377b0
// FUNCTION: BETA10 0x10032790 // FUNCTION: BETA10 0x10032790

View File

@@ -134,7 +134,7 @@ public:
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x10030900 // FUNCTION: LEGO1 0x10030900
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10030910 // FUNCTION: LEGO1 0x10030910
// FUNCTION: BETA10 0x10035d70 // FUNCTION: BETA10 0x10035d70

View File

@@ -60,7 +60,7 @@ public:
MxResult Tickle() override; // vtable+0x08 MxResult Tickle() override; // vtable+0x08
// FUNCTION: LEGO1 0x1005d6e0 // FUNCTION: LEGO1 0x1005d6e0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x1005d6f0 // FUNCTION: LEGO1 0x1005d6f0
// FUNCTION: BETA10 0x100388d0 // FUNCTION: BETA10 0x100388d0

View File

@@ -71,7 +71,7 @@ public:
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
// FUNCTION: LEGO1 0x1004fe10 // FUNCTION: LEGO1 0x1004fe10
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
void VTable0x60() override; // vtable+0x60 void VTable0x60() override; // vtable+0x60
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64

View File

@@ -94,7 +94,7 @@ public:
// FUNCTION: LEGO1 0x10022930 // FUNCTION: LEGO1 0x10022930
// FUNCTION: BETA10 0x10070070 // FUNCTION: BETA10 0x10070070
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x10022940 // FUNCTION: LEGO1 0x10022940
// FUNCTION: BETA10 0x10070090 // FUNCTION: BETA10 0x10070090

View File

@@ -153,7 +153,7 @@ public:
} }
// FUNCTION: LEGO1 0x1000dae0 // FUNCTION: LEGO1 0x1000dae0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
void Enable(MxBool p_enable) override; // vtable+0x68 void Enable(MxBool p_enable) override; // vtable+0x68

View File

@@ -47,18 +47,18 @@ public:
LegoWorld(); LegoWorld();
~LegoWorld() override; // vtable+0x00 ~LegoWorld() override; // vtable+0x00
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
MxResult Tickle() override; // vtable+0x08 MxResult Tickle() override; // vtable+0x08
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c
virtual void ReadyWorld(); // vtable+0x50 virtual void ReadyWorld(); // vtable+0x50
virtual LegoCameraController* VTable0x54(); // vtable+0x54 virtual LegoCameraController* InitializeCameraController(); // vtable+0x54
virtual void Add(MxCore* p_object); // vtable+0x58 virtual void Add(MxCore* p_object); // vtable+0x58
// The BETA10 match could also be LegoWorld::Escape(), only the child classes might be able to tell // The BETA10 match could also be LegoWorld::Escape(), only the child classes might be able to tell
// FUNCTION: LEGO1 0x1001d670 // FUNCTION: LEGO1 0x1001d670
// FUNCTION: BETA10 0x10017530 // FUNCTION: BETA10 0x10017530
virtual MxBool VTable0x5c() { return FALSE; } // vtable+0x5c virtual MxBool WaitForTransition() { return FALSE; } // vtable+0x5c
// FUNCTION: LEGO1 0x100010a0 // FUNCTION: LEGO1 0x100010a0
virtual void VTable0x60() {} // vtable+0x60 virtual void VTable0x60() {} // vtable+0x60
@@ -102,8 +102,8 @@ public:
); );
void RemoveActor(LegoPathActor* p_actor); void RemoveActor(LegoPathActor* p_actor);
MxBool ActorExists(LegoPathActor* p_actor); MxBool ActorExists(LegoPathActor* p_actor);
void FUN_1001fda0(LegoAnimPresenter* p_presenter); void AddPresenterIfInRange(LegoAnimPresenter* p_presenter);
void FUN_1001fe90(LegoAnimPresenter* p_presenter); void RemovePresenterFromBoundaries(LegoAnimPresenter* p_presenter);
LegoPathBoundary* FindPathBoundary(const char* p_name); LegoPathBoundary* FindPathBoundary(const char* p_name);
void AddPath(LegoPathController* p_controller); void AddPath(LegoPathController* p_controller);
MxResult GetCurrPathInfo(LegoPathBoundary** p_boundaries, MxS32& p_numL); MxResult GetCurrPathInfo(LegoPathBoundary** p_boundaries, MxS32& p_numL);
@@ -115,7 +115,7 @@ public:
LegoEntityList* GetEntityList() { return m_entityList; } LegoEntityList* GetEntityList() { return m_entityList; }
LegoOmni::World GetWorldId() { return m_worldId; } LegoOmni::World GetWorldId() { return m_worldId; }
MxBool GetUnknown0xd0Empty() { return m_set0xd0.empty(); } MxBool NoDisabledObjects() { return m_disabledObjects.empty(); }
list<LegoROI*>& GetROIList() { return m_roiList; } list<LegoROI*>& GetROIList() { return m_roiList; }
LegoHideAnimPresenter* GetHideAnimPresenter() { return m_hideAnim; } LegoHideAnimPresenter* GetHideAnimPresenter() { return m_hideAnim; }
@@ -131,9 +131,9 @@ protected:
LegoEntityList* m_entityList; // 0x9c LegoEntityList* m_entityList; // 0x9c
LegoCacheSoundList* m_cacheSoundList; // 0xa0 LegoCacheSoundList* m_cacheSoundList; // 0xa0
MxBool m_destroyed; // 0xa4 MxBool m_destroyed; // 0xa4
MxCoreSet m_set0xa8; // 0xa8 MxCoreSet m_objects; // 0xa8
MxPresenterList m_controlPresenters; // 0xb8 MxPresenterList m_controlPresenters; // 0xb8
MxCoreSet m_set0xd0; // 0xd0 MxCoreSet m_disabledObjects; // 0xd0
list<LegoROI*> m_roiList; // 0xe0 list<LegoROI*> m_roiList; // 0xe0
LegoOmni::World m_worldId; // 0xec LegoOmni::World m_worldId; // 0xec

View File

@@ -65,7 +65,7 @@ public:
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x1005e1d0 // FUNCTION: LEGO1 0x1005e1d0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x1005e1e0 // FUNCTION: LEGO1 0x1005e1e0
// FUNCTION: BETA10 0x100f0c50 // FUNCTION: BETA10 0x100f0c50

View File

@@ -54,12 +54,12 @@ private:
struct { struct {
MxS16 m_letters[7]; // 0x00 MxS16 m_letters[7]; // 0x00
MxS16 m_cursorPos; // 0x0e MxS16 m_cursorPos; // 0x0e
} m_unk0x280; // 0x280 } m_newName; // 0x280
MxControlPresenter* m_checkmark[10]; // 0x290 MxControlPresenter* m_checkmark[10]; // 0x290
undefined2 m_unk0x2b8; // 0x2b8 undefined2 m_vehiclesToPosition; // 0x2b8
InfocenterState* m_infocenterState; // 0x2bc InfocenterState* m_infocenterState; // 0x2bc
undefined m_unk0x2c0; // 0x2c0 undefined m_unk0x2c0; // 0x2c0
undefined m_unk0x2c1; // 0x2c1 undefined m_awaitLoad; // 0x2c1
undefined m_unk0x2c2[0x02]; // 0x2c2 undefined m_unk0x2c2[0x02]; // 0x2c2
LPDIRECTDRAWSURFACE m_checkboxHilite; // 0x2c4 LPDIRECTDRAWSURFACE m_checkboxHilite; // 0x2c4
LPDIRECTDRAWSURFACE m_checkboxSurface; // 0x2c8 LPDIRECTDRAWSURFACE m_checkboxSurface; // 0x2c8
@@ -69,9 +69,9 @@ private:
MxLong HandleKeyPress(MxU8 p_key); MxLong HandleKeyPress(MxU8 p_key);
MxLong HandleControl(LegoControlManagerNotificationParam& p_param); MxLong HandleControl(LegoControlManagerNotificationParam& p_param);
MxLong HandlePathStruct(LegoPathStructNotificationParam& p_param); MxLong HandlePathStruct(LegoPathStructNotificationParam& p_param);
void FUN_100775c0(MxS16 p_playerIndex); void LoadSave(MxS16 p_checkMarkIndex);
void WriteInfocenterLetters(MxS16); void WriteInfocenterLetters(MxS16);
void FUN_100778c0(); void LoadVehicles();
MxBool CreateSurface(); MxBool CreateSurface();
}; };

View File

@@ -60,7 +60,7 @@ public:
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x100010b0 // FUNCTION: LEGO1 0x100010b0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c MxBool WaitForTransition() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x100010c0 // FUNCTION: LEGO1 0x100010c0
// FUNCTION: BETA10 0x100f4f20 // FUNCTION: BETA10 0x100f4f20

View File

@@ -835,7 +835,7 @@ inline void LoadIsle()
{ {
LegoWorld* world = FindWorld(*g_isleScript, IsleScript::c__Isle); LegoWorld* world = FindWorld(*g_isleScript, IsleScript::c__Isle);
if (world != NULL) { if (world != NULL) {
if (!world->GetUnknown0xd0Empty()) { if (!world->NoDisabledObjects()) {
NotificationManager()->Send(world, MxNotificationParam(c_notificationType20, NULL)); NotificationManager()->Send(world, MxNotificationParam(c_notificationType20, NULL));
} }
} }

View File

@@ -70,7 +70,7 @@ MxResult LegoWorld::Create(MxDSAction& p_dsAction)
return FAILURE; return FAILURE;
} }
if (!VTable0x54()) { if (!InitializeCameraController()) {
return FAILURE; return FAILURE;
} }
@@ -130,10 +130,10 @@ void LegoWorld::Destroy(MxBool p_fromDestructor)
} }
} }
while (!m_set0xa8.empty()) { while (!m_objects.empty()) {
MxCoreSet::iterator it = m_set0xa8.begin(); MxCoreSet::iterator it = m_objects.begin();
MxCore* object = *it; MxCore* object = *it;
m_set0xa8.erase(it); m_objects.erase(it);
if (object->IsA("MxPresenter")) { if (object->IsA("MxPresenter")) {
MxPresenter* presenter = (MxPresenter*) object; MxPresenter* presenter = (MxPresenter*) object;
@@ -161,7 +161,7 @@ void LegoWorld::Destroy(MxBool p_fromDestructor)
} }
} }
if (m_worldId != LegoOmni::e_undefined && m_set0xd0.empty()) { if (m_worldId != LegoOmni::e_undefined && m_disabledObjects.empty()) {
PlantManager()->Reset(m_worldId); PlantManager()->Reset(m_worldId);
BuildingManager()->Reset(); BuildingManager()->Reset();
} }
@@ -229,7 +229,7 @@ MxLong LegoWorld::Notify(MxParam& p_param)
// FUNCTION: LEGO1 0x1001f630 // FUNCTION: LEGO1 0x1001f630
// FUNCTION: BETA10 0x100d9fc2 // FUNCTION: BETA10 0x100d9fc2
LegoCameraController* LegoWorld::VTable0x54() LegoCameraController* LegoWorld::InitializeCameraController()
{ {
MxBool success = FALSE; MxBool success = FALSE;
@@ -352,7 +352,7 @@ MxBool LegoWorld::ActorExists(LegoPathActor* p_actor)
// FUNCTION: LEGO1 0x1001fda0 // FUNCTION: LEGO1 0x1001fda0
// FUNCTION: BETA10 0x100da621 // FUNCTION: BETA10 0x100da621
void LegoWorld::FUN_1001fda0(LegoAnimPresenter* p_presenter) void LegoWorld::AddPresenterIfInRange(LegoAnimPresenter* p_presenter)
{ {
LegoPathControllerListCursor cursor(&m_pathControllerList); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
@@ -364,7 +364,7 @@ void LegoWorld::FUN_1001fda0(LegoAnimPresenter* p_presenter)
// FUNCTION: LEGO1 0x1001fe90 // FUNCTION: LEGO1 0x1001fe90
// FUNCTION: BETA10 0x100da6b5 // FUNCTION: BETA10 0x100da6b5
void LegoWorld::FUN_1001fe90(LegoAnimPresenter* p_presenter) void LegoWorld::RemovePresenterFromBoundaries(LegoAnimPresenter* p_presenter)
{ {
LegoPathControllerListCursor cursor(&m_pathControllerList); LegoPathControllerListCursor cursor(&m_pathControllerList);
LegoPathController* controller; LegoPathController* controller;
@@ -481,25 +481,25 @@ void LegoWorld::Add(MxCore* p_object)
} }
#endif #endif
else { else {
MxCoreSet::iterator it = m_set0xa8.find(p_object); MxCoreSet::iterator it = m_objects.find(p_object);
if (it == m_set0xa8.end()) { if (it == m_objects.end()) {
#ifdef BETA10 #ifdef BETA10
if (p_object->IsA("MxPresenter")) { if (p_object->IsA("MxPresenter")) {
assert(static_cast<MxPresenter*>(p_object)->GetAction()); assert(static_cast<MxPresenter*>(p_object)->GetAction());
} }
#endif #endif
m_set0xa8.insert(p_object); m_objects.insert(p_object);
} }
else { else {
assert(0); assert(0);
} }
} }
if (m_set0xd0.size() != 0 && p_object->IsA("MxPresenter")) { if (m_disabledObjects.size() != 0 && p_object->IsA("MxPresenter")) {
if (((MxPresenter*) p_object)->IsEnabled()) { if (((MxPresenter*) p_object)->IsEnabled()) {
((MxPresenter*) p_object)->Enable(FALSE); ((MxPresenter*) p_object)->Enable(FALSE);
m_set0xd0.insert(p_object); m_disabledObjects.insert(p_object);
} }
} }
} }
@@ -557,15 +557,15 @@ void LegoWorld::Remove(MxCore* p_object)
} }
#endif #endif
else { else {
it = m_set0xa8.find(p_object); it = m_objects.find(p_object);
if (it != m_set0xa8.end()) { if (it != m_objects.end()) {
m_set0xa8.erase(it); m_objects.erase(it);
} }
} }
it = m_set0xd0.find(p_object); it = m_disabledObjects.find(p_object);
if (it != m_set0xd0.end()) { if (it != m_disabledObjects.end()) {
m_set0xd0.erase(it); m_disabledObjects.erase(it);
} }
} }
@@ -617,7 +617,7 @@ MxCore* LegoWorld::Find(const char* p_class, const char* p_name)
return NULL; return NULL;
} }
for (MxCoreSet::iterator i = m_set0xa8.begin(); i != m_set0xa8.end(); i++) { for (MxCoreSet::iterator i = m_objects.begin(); i != m_objects.end(); i++) {
if ((*i)->IsA(p_class) && (*i)->IsA("MxPresenter")) { if ((*i)->IsA(p_class) && (*i)->IsA("MxPresenter")) {
assert(((MxPresenter*) (*i))->GetAction()); assert(((MxPresenter*) (*i))->GetAction());
@@ -664,7 +664,7 @@ MxCore* LegoWorld::Find(const MxAtomId& p_atom, MxS32 p_entityId)
} }
} }
for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { for (MxCoreSet::iterator it = m_objects.begin(); it != m_objects.end(); it++) {
MxCore* core = *it; MxCore* core = *it;
if (core->IsA("MxPresenter")) { if (core->IsA("MxPresenter")) {
@@ -686,7 +686,7 @@ void LegoWorld::Enable(MxBool p_enable)
{ {
MxCoreSet::iterator it; MxCoreSet::iterator it;
if (p_enable && m_set0xd0.size() != 0) { if (p_enable && m_disabledObjects.size() != 0) {
if (CurrentWorld() == this) { if (CurrentWorld() == this) {
return; return;
} }
@@ -709,8 +709,8 @@ void LegoWorld::Enable(MxBool p_enable)
} }
} }
while (m_set0xd0.size() != 0) { while (m_disabledObjects.size() != 0) {
it = m_set0xd0.begin(); it = m_disabledObjects.begin();
if ((*it)->IsA("MxPresenter")) { if ((*it)->IsA("MxPresenter")) {
((MxPresenter*) *it)->Enable(TRUE); ((MxPresenter*) *it)->Enable(TRUE);
@@ -719,7 +719,7 @@ void LegoWorld::Enable(MxBool p_enable)
((LegoPathController*) *it)->Enable(TRUE); ((LegoPathController*) *it)->Enable(TRUE);
} }
m_set0xd0.erase(it); m_disabledObjects.erase(it);
} }
SetCurrentWorld(this); SetCurrentWorld(this);
@@ -743,7 +743,7 @@ void LegoWorld::Enable(MxBool p_enable)
SetIsWorldActive(TRUE); SetIsWorldActive(TRUE);
#endif #endif
} }
else if (!p_enable && m_set0xd0.size() == 0) { else if (!p_enable && m_disabledObjects.size() == 0) {
MxPresenter* presenter; MxPresenter* presenter;
LegoPathController* controller; LegoPathController* controller;
LegoPathActor* actor = UserActor(); LegoPathActor* actor = UserActor();
@@ -753,7 +753,7 @@ void LegoWorld::Enable(MxBool p_enable)
} }
AnimationManager()->Reset(FALSE); AnimationManager()->Reset(FALSE);
m_set0xd0.insert(this); m_disabledObjects.insert(this);
if (m_worldId != LegoOmni::e_undefined) { if (m_worldId != LegoOmni::e_undefined) {
PlantManager()->Reset(m_worldId); PlantManager()->Reset(m_worldId);
@@ -766,15 +766,15 @@ void LegoWorld::Enable(MxBool p_enable)
while (controlPresenterCursor.Next(presenter)) { while (controlPresenterCursor.Next(presenter)) {
if (presenter->IsEnabled()) { if (presenter->IsEnabled()) {
m_set0xd0.insert(presenter); m_disabledObjects.insert(presenter);
presenter->Enable(FALSE); presenter->Enable(FALSE);
} }
} }
for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { for (MxCoreSet::iterator it = m_objects.begin(); it != m_objects.end(); it++) {
if ((*it)->IsA("LegoActionControlPresenter") || if ((*it)->IsA("LegoActionControlPresenter") ||
((*it)->IsA("MxPresenter") && ((MxPresenter*) *it)->IsEnabled())) { ((*it)->IsA("MxPresenter") && ((MxPresenter*) *it)->IsEnabled())) {
m_set0xd0.insert(*it); m_disabledObjects.insert(*it);
((MxPresenter*) *it)->Enable(FALSE); ((MxPresenter*) *it)->Enable(FALSE);
} }
} }
@@ -800,7 +800,7 @@ void LegoWorld::Enable(MxBool p_enable)
while (pathControllerCursor.Next(controller)) { while (pathControllerCursor.Next(controller)) {
controller->Enable(FALSE); controller->Enable(FALSE);
m_set0xd0.insert(controller); m_disabledObjects.insert(controller);
} }
GetViewManager()->RemoveAll(NULL); GetViewManager()->RemoveAll(NULL);
@@ -858,7 +858,7 @@ MxBool LegoWorld::PresentersPending()
} }
} }
for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { for (MxCoreSet::iterator it = m_objects.begin(); it != m_objects.end(); it++) {
if ((*it)->IsA("MxPresenter")) { if ((*it)->IsA("MxPresenter")) {
presenter = (MxPresenter*) *it; presenter = (MxPresenter*) *it;

View File

@@ -58,7 +58,7 @@ LegoWorldPresenter::~LegoWorldPresenter()
PlantManager()->LoadWorldInfo(worldId); PlantManager()->LoadWorldInfo(worldId);
AnimationManager()->LoadWorldInfo(worldId); AnimationManager()->LoadWorldInfo(worldId);
BuildingManager()->LoadWorldInfo(); BuildingManager()->LoadWorldInfo();
result = ((LegoWorld*) m_entity)->VTable0x5c(); result = ((LegoWorld*) m_entity)->WaitForTransition();
} }
if (result == FALSE) { if (result == FALSE) {

View File

@@ -101,7 +101,7 @@ MxLong LegoRace::Notify(MxParam& p_param)
// FUNCTION: BETA10 0x100c7c3f // FUNCTION: BETA10 0x100c7c3f
void LegoRace::Enable(MxBool p_enable) void LegoRace::Enable(MxBool p_enable)
{ {
if (GetUnknown0xd0Empty() != p_enable && !p_enable) { if (NoDisabledObjects() != p_enable && !p_enable) {
Remove(UserActor()); Remove(UserActor());
MxU8 oldActorId = GameState()->GetActorId(); MxU8 oldActorId = GameState()->GetActorId();

View File

@@ -1136,7 +1136,7 @@ void LegoAnimPresenter::VTable0x8c()
} }
if (m_currentWorld) { if (m_currentWorld) {
m_currentWorld->FUN_1001fda0(this); m_currentWorld->AddPresenterIfInRange(this);
if (!m_compositePresenter || !m_compositePresenter->IsA("LegoAnimMMPresenter")) { if (!m_compositePresenter || !m_compositePresenter->IsA("LegoAnimMMPresenter")) {
m_currentWorld->Add(this); m_currentWorld->Add(this);
} }
@@ -1148,7 +1148,7 @@ void LegoAnimPresenter::VTable0x8c()
void LegoAnimPresenter::VTable0x90() void LegoAnimPresenter::VTable0x90()
{ {
if (m_currentWorld != NULL) { if (m_currentWorld != NULL) {
m_currentWorld->FUN_1001fe90(this); m_currentWorld->RemovePresenterFromBoundaries(this);
if (m_compositePresenter != NULL && m_compositePresenter->IsA("LegoAnimMMPresenter")) { if (m_compositePresenter != NULL && m_compositePresenter->IsA("LegoAnimMMPresenter")) {
return; return;

View File

@@ -888,7 +888,7 @@ void Act3::FUN_10073a60()
// FUNCTION: LEGO1 0x10073a90 // FUNCTION: LEGO1 0x10073a90
void Act3::Enable(MxBool p_enable) void Act3::Enable(MxBool p_enable)
{ {
if ((MxBool) m_set0xd0.empty() == p_enable) { if ((MxBool) m_disabledObjects.empty() == p_enable) {
return; return;
} }

View File

@@ -1290,7 +1290,7 @@ void Infocenter::StopCutscene()
} }
// FUNCTION: LEGO1 0x10070d00 // FUNCTION: LEGO1 0x10070d00
MxBool Infocenter::VTable0x5c() MxBool Infocenter::WaitForTransition()
{ {
return TRUE; return TRUE;
} }
@@ -1442,10 +1442,10 @@ void Infocenter::StartCredits()
{ {
MxPresenter* presenter; MxPresenter* presenter;
while (!m_set0xa8.empty()) { while (!m_objects.empty()) {
MxCoreSet::iterator it = m_set0xa8.begin(); MxCoreSet::iterator it = m_objects.begin();
MxCore* object = *it; MxCore* object = *it;
m_set0xa8.erase(it); m_objects.erase(it);
if (object->IsA("MxPresenter")) { if (object->IsA("MxPresenter")) {
presenter = (MxPresenter*) object; presenter = (MxPresenter*) object;

View File

@@ -529,7 +529,7 @@ MxLong Isle::HandlePathStruct(LegoPathStructNotificationParam& p_param)
// FUNCTION: BETA10 0x10034158 // FUNCTION: BETA10 0x10034158
void Isle::Enable(MxBool p_enable) void Isle::Enable(MxBool p_enable)
{ {
if ((MxBool) m_set0xd0.empty() == p_enable) { if ((MxBool) m_disabledObjects.empty() == p_enable) {
return; return;
} }

View File

@@ -522,7 +522,7 @@ void LegoAct2::ReadyWorld()
// FUNCTION: BETA10 0x1003bb2d // FUNCTION: BETA10 0x1003bb2d
void LegoAct2::Enable(MxBool p_enable) void LegoAct2::Enable(MxBool p_enable)
{ {
if ((MxBool) m_set0xd0.empty() == p_enable) { if ((MxBool) m_disabledObjects.empty() == p_enable) {
return; return;
} }

View File

@@ -46,17 +46,17 @@ RegistrationBook::RegistrationBook() : m_registerDialogueTimer(0x80000000), m_un
{ {
memset(m_alphabet, 0, sizeof(m_alphabet)); memset(m_alphabet, 0, sizeof(m_alphabet));
memset(m_name, 0, sizeof(m_name)); memset(m_name, 0, sizeof(m_name));
m_unk0x280.m_cursorPos = 0; m_newName.m_cursorPos = 0;
memset(m_checkmark, 0, sizeof(m_checkmark)); memset(m_checkmark, 0, sizeof(m_checkmark));
memset(&m_unk0x280, -1, sizeof(m_unk0x280) - 2); memset(&m_newName, -1, sizeof(m_newName) - 2);
m_unk0x2b8 = 0; m_vehiclesToPosition = 0;
m_infocenterState = NULL; m_infocenterState = NULL;
NotificationManager()->Register(this); NotificationManager()->Register(this);
m_unk0x2c1 = FALSE; m_awaitLoad = FALSE;
m_checkboxHilite = NULL; m_checkboxHilite = NULL;
m_checkboxSurface = NULL; m_checkboxSurface = NULL;
m_checkboxNormal = NULL; m_checkboxNormal = NULL;
@@ -152,9 +152,9 @@ MxLong RegistrationBook::HandleEndAction(MxEndActionNotificationParam& p_param)
switch ((MxS32) p_param.GetAction()->GetObjectId()) { switch ((MxS32) p_param.GetAction()->GetObjectId()) {
case RegbookScript::c_Textures: case RegbookScript::c_Textures:
m_unk0x2c1 = FALSE; m_awaitLoad = FALSE;
if (m_unk0x2b8 == 0) { if (m_vehiclesToPosition == 0) {
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
} }
break; break;
@@ -186,37 +186,37 @@ MxLong RegistrationBook::HandleKeyPress(MxU8 p_key)
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
} }
} }
else if (key != VK_BACK && m_unk0x280.m_cursorPos < 7) { else if (key != VK_BACK && m_newName.m_cursorPos < 7) {
m_name[0][m_unk0x280.m_cursorPos] = m_alphabet[key - 'A']->Clone(); m_name[0][m_newName.m_cursorPos] = m_alphabet[key - 'A']->Clone();
if (m_name[0][m_unk0x280.m_cursorPos] != NULL) { if (m_name[0][m_newName.m_cursorPos] != NULL) {
m_alphabet[key - 'A']->GetAction()->SetUnknown24(m_alphabet[key - 'A']->GetAction()->GetUnknown24() + 1); m_alphabet[key - 'A']->GetAction()->SetUnknown24(m_alphabet[key - 'A']->GetAction()->GetUnknown24() + 1);
m_name[0][m_unk0x280.m_cursorPos]->Enable(TRUE); m_name[0][m_newName.m_cursorPos]->Enable(TRUE);
m_name[0][m_unk0x280.m_cursorPos]->SetTickleState(MxPresenter::e_repeating); m_name[0][m_newName.m_cursorPos]->SetTickleState(MxPresenter::e_repeating);
m_name[0][m_unk0x280.m_cursorPos]->SetPosition(m_unk0x280.m_cursorPos * 23 + 343, 121); m_name[0][m_newName.m_cursorPos]->SetPosition(m_newName.m_cursorPos * 23 + 343, 121);
if (m_unk0x280.m_cursorPos == 0) { if (m_newName.m_cursorPos == 0) {
m_checkmark[0]->Enable(TRUE); m_checkmark[0]->Enable(TRUE);
} }
m_unk0x280.m_letters[m_unk0x280.m_cursorPos] = key - 'A'; m_newName.m_letters[m_newName.m_cursorPos] = key - 'A';
m_unk0x280.m_cursorPos++; m_newName.m_cursorPos++;
} }
} }
else { else {
if (key == VK_BACK && m_unk0x280.m_cursorPos > 0) { if (key == VK_BACK && m_newName.m_cursorPos > 0) {
m_unk0x280.m_cursorPos--; m_newName.m_cursorPos--;
m_name[0][m_unk0x280.m_cursorPos]->Enable(FALSE); m_name[0][m_newName.m_cursorPos]->Enable(FALSE);
delete m_name[0][m_unk0x280.m_cursorPos]; delete m_name[0][m_newName.m_cursorPos];
m_name[0][m_unk0x280.m_cursorPos] = NULL; m_name[0][m_newName.m_cursorPos] = NULL;
if (m_unk0x280.m_cursorPos == 0) { if (m_newName.m_cursorPos == 0) {
m_checkmark[0]->Enable(FALSE); m_checkmark[0]->Enable(FALSE);
} }
m_unk0x280.m_letters[m_unk0x280.m_cursorPos] = -1; m_newName.m_letters[m_newName.m_cursorPos] = -1;
} }
} }
@@ -266,7 +266,7 @@ MxLong RegistrationBook::HandleControl(LegoControlManagerNotificationParam& p_pa
} }
} }
FUN_100775c0(i); LoadSave(i);
} }
} }
@@ -275,56 +275,57 @@ MxLong RegistrationBook::HandleControl(LegoControlManagerNotificationParam& p_pa
// FUNCTION: LEGO1 0x100775c0 // FUNCTION: LEGO1 0x100775c0
// STUB: BETA10 0x100f32b2 // STUB: BETA10 0x100f32b2
void RegistrationBook::FUN_100775c0(MxS16 p_playerIndex) void RegistrationBook::LoadSave(MxS16 p_checkMarkIndex)
{ {
if (m_infocenterState->HasRegistered()) { if (m_infocenterState->HasRegistered()) {
GameState()->Save(0); GameState()->Save(0);
} }
// The first checkmark searches for the name and is -1 if not found, while all other checkmarks start at 1
// TODO: structure incorrect // TODO: structure incorrect
MxS16 player = p_playerIndex == 0 ? GameState()->FindPlayer(*(LegoGameState::Username*) &m_unk0x280.m_letters) MxS16 player = p_checkMarkIndex == 0 ? GameState()->FindPlayer(*(LegoGameState::Username*) &m_newName.m_letters)
: p_playerIndex - 1; : p_checkMarkIndex - 1;
switch (player) { switch (player) {
case 0: case 0: // Current save
if (!m_infocenterState->HasRegistered()) { if (!m_infocenterState->HasRegistered()) {
GameState()->SwitchPlayer(0); GameState()->SwitchPlayer(0);
WriteInfocenterLetters(1); WriteInfocenterLetters(1);
FUN_100778c0(); LoadVehicles();
} }
break; break;
case -1: case -1: // New save
GameState()->Init(); GameState()->Init();
PlayAction(RegbookScript::c_Textures); PlayAction(RegbookScript::c_Textures);
m_unk0x2c1 = TRUE; m_awaitLoad = TRUE;
// TOOD: structure incorrect // TOOD: structure incorrect
GameState()->AddPlayer(*(LegoGameState::Username*) &m_unk0x280.m_letters); GameState()->AddPlayer(*(LegoGameState::Username*) &m_newName.m_letters);
GameState()->Save(0); GameState()->Save(0);
WriteInfocenterLetters(0); WriteInfocenterLetters(0);
GameState()->SerializePlayersInfo(2); GameState()->SerializePlayersInfo(LegoFile::c_write);
FUN_100778c0(); LoadVehicles();
break; break;
default: default:
GameState()->Init(); GameState()->Init();
PlayAction(RegbookScript::c_Textures); PlayAction(RegbookScript::c_Textures);
m_unk0x2c1 = TRUE; m_awaitLoad = TRUE;
GameState()->SwitchPlayer(player); GameState()->SwitchPlayer(player);
WriteInfocenterLetters(player + 1); WriteInfocenterLetters(player + 1);
GameState()->SerializePlayersInfo(2); GameState()->SerializePlayersInfo(LegoFile::c_write);
FUN_100778c0(); LoadVehicles();
break; break;
} }
m_infocenterState->m_state = InfocenterState::e_selectedSave; m_infocenterState->m_state = InfocenterState::e_selectedSave;
if (m_unk0x2b8 == 0 && !m_unk0x2c1) { if (m_vehiclesToPosition == 0 && !m_awaitLoad) {
DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav); DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
} }
@@ -341,7 +342,7 @@ void RegistrationBook::WriteInfocenterLetters(MxS16 p_user)
} }
// FUNCTION: LEGO1 0x100778c0 // FUNCTION: LEGO1 0x100778c0
void RegistrationBook::FUN_100778c0() void RegistrationBook::LoadVehicles()
{ {
if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { if (GameState()->GetCurrentAct() == LegoGameState::e_act1) {
Act1State* act1state = (Act1State*) GameState()->GetState("Act1State"); Act1State* act1state = (Act1State*) GameState()->GetState("Act1State");
@@ -353,7 +354,7 @@ void RegistrationBook::FUN_100778c0()
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, CopterScript::c_Helicopter_Actor) LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, CopterScript::c_Helicopter_Actor)
); );
m_unk0x2b8++; m_vehiclesToPosition++;
} }
if (act1state->m_jetskiPlane.IsPresent()) { if (act1state->m_jetskiPlane.IsPresent()) {
@@ -363,7 +364,7 @@ void RegistrationBook::FUN_100778c0()
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, JetskiScript::c_Jetski_Actor) LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, JetskiScript::c_Jetski_Actor)
); );
m_unk0x2b8++; m_vehiclesToPosition++;
} }
if (act1state->m_dunebuggyPlane.IsPresent()) { if (act1state->m_dunebuggyPlane.IsPresent()) {
@@ -373,7 +374,7 @@ void RegistrationBook::FUN_100778c0()
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, DunecarScript::c_DuneBugy_Actor) LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, DunecarScript::c_DuneBugy_Actor)
); );
m_unk0x2b8++; m_vehiclesToPosition++;
} }
if (act1state->m_racecarPlane.IsPresent()) { if (act1state->m_racecarPlane.IsPresent()) {
@@ -383,10 +384,10 @@ void RegistrationBook::FUN_100778c0()
LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, RacecarScript::c_RaceCar_Actor) LegoPathStructNotificationParam(c_notificationPathStruct, NULL, 0, RacecarScript::c_RaceCar_Actor)
); );
m_unk0x2b8++; m_vehiclesToPosition++;
} }
if (m_unk0x2b8 != 0) { if (m_vehiclesToPosition != 0) {
DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav); DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav);
InputManager()->DisableInputProcessing(); InputManager()->DisableInputProcessing();
SetAppCursor(e_cursorBusy); SetAppCursor(e_cursorBusy);
@@ -593,10 +594,10 @@ MxLong RegistrationBook::HandlePathStruct(LegoPathStructNotificationParam& p_par
else { else {
RemoveActor(actor); RemoveActor(actor);
Remove(actor); Remove(actor);
m_unk0x2b8--; m_vehiclesToPosition--;
} }
if (m_unk0x2b8 == 0 && !m_unk0x2c1) { if (m_vehiclesToPosition == 0 && !m_awaitLoad) {
DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav); DeleteObjects(&m_atomId, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav);
TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
} }