From db90807d536f4be299071171ae5e6d3d6e46f0c4 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 24 May 2024 13:07:45 -0400 Subject: [PATCH 01/28] Implement/match LegoPathActor::ParseAction (#946) * Implement/match LegoPathActor::ParseAction * Fix naming * Space --- LEGO1/define.cpp | 12 +++++ LEGO1/define.h | 3 ++ LEGO1/lego/legoomni/include/isle.h | 2 +- LEGO1/lego/legoomni/include/islepathactor.h | 2 +- LEGO1/lego/legoomni/include/legomain.h | 8 +-- LEGO1/lego/legoomni/include/legopathactor.h | 2 +- LEGO1/lego/legoomni/include/legoworld.h | 1 - LEGO1/lego/legoomni/include/misc.h | 6 +-- LEGO1/lego/legoomni/src/actors/helicopter.cpp | 13 ++--- .../legoomni/src/actors/islepathactor.cpp | 2 +- .../legoomni/src/actors/jukeboxentity.cpp | 2 +- LEGO1/lego/legoomni/src/actors/skateboard.cpp | 2 +- .../src/common/legoanimationmanager.cpp | 10 ++-- .../src/common/legoanimmmpresenter.cpp | 2 +- .../legoomni/src/common/legogamestate.cpp | 28 ++++++----- LEGO1/lego/legoomni/src/common/misc.cpp | 4 +- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 3 +- .../src/gasstation/gasstationentity.cpp | 2 +- .../legoomni/src/hospital/hospitalentity.cpp | 2 +- .../src/infocenter/infocenterentity.cpp | 2 +- .../legoomni/src/isle/beachhouseentity.cpp | 2 +- .../lego/legoomni/src/paths/legopathactor.cpp | 48 ++++++++++++++++-- .../lego/legoomni/src/police/policeentity.cpp | 2 +- .../legoomni/src/race/racestandsentity.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/isle.cpp | 50 ++++++++++--------- 25 files changed, 137 insertions(+), 75 deletions(-) diff --git a/LEGO1/define.cpp b/LEGO1/define.cpp index 89d70dd0..0c04bb50 100644 --- a/LEGO1/define.cpp +++ b/LEGO1/define.cpp @@ -20,6 +20,10 @@ const char* g_strAUTO_CREATE = "AUTO_CREATE"; // STRING: LEGO1 0x10102000 const char* g_strBOTTOM_TO_TOP = "BOTTOM_TO_TOP"; +// GLOBAL: LEGO1 0x10102060 +// STRING: LEGO1 0x10101ff4 +const char* g_strCOLLIDEBOX = "COLLIDEBOX"; + // GLOBAL: LEGO1 0x10102064 // STRING: LEGO1 0x10101fec const char* g_strSTYLE = "STYLE"; @@ -68,6 +72,14 @@ const char* g_strMUST_SUCCEED = "MUST_SUCCEED"; // STRING: LEGO1 0x10101f58 const char* g_strOBJECT = "OBJECT"; +// GLOBAL: LEGO1 0x101020a0 +// STRING: LEGO1 0x10101f50 +const char* g_strPATH = "PATH"; + +// GLOBAL: LEGO1 0x101020a4 +// STRING: LEGO1 0x10101f40 +const char* g_strPERMIT_NAVIGATE = "PERMIT_NAVIGATE"; + // GLOBAL: LEGO1 0x101020a8 // STRING: LEGO1 0x10101f38 const char* g_strPTATCAM = "PTATCAM"; diff --git a/LEGO1/define.h b/LEGO1/define.h index 9bb1962a..a73a80f8 100644 --- a/LEGO1/define.h +++ b/LEGO1/define.h @@ -34,5 +34,8 @@ extern const char* g_strVARIABLE; extern const char* g_strBMP_ISMAP; extern const char* g_strAUTO_CREATE; extern const char* g_strDB_CREATE; +extern const char* g_strPERMIT_NAVIGATE; +extern const char* g_strPATH; +extern const char* g_strCOLLIDEBOX; #endif // DEFINE_H diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 76971271..ae7e1af7 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -59,7 +59,7 @@ class Isle : public LegoWorld { MxBool VTable0x64() override; // vtable+64 void Enable(MxBool p_enable) override; // vtable+68 - virtual void VTable0x6c(IslePathActor* p_actor); // vtable+6c + virtual void VTable0x6c(LegoPathActor* p_actor); // vtable+6c MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleClick(LegoControlManagerEvent& p_param); diff --git a/LEGO1/lego/legoomni/include/islepathactor.h b/LEGO1/lego/legoomni/include/islepathactor.h index 6a2c1e78..1b795be0 100644 --- a/LEGO1/lego/legoomni/include/islepathactor.h +++ b/LEGO1/lego/legoomni/include/islepathactor.h @@ -137,7 +137,7 @@ class IslePathActor : public LegoPathActor { protected: LegoWorld* m_world; // 0x154 - IslePathActor* m_unk0x158; // 0x158 + LegoPathActor* m_unk0x158; // 0x158 MxFloat m_unk0x15c; // 0x15c }; diff --git a/LEGO1/lego/legoomni/include/legomain.h b/LEGO1/lego/legoomni/include/legomain.h index 1d2191d5..4a2fad65 100644 --- a/LEGO1/lego/legoomni/include/legomain.h +++ b/LEGO1/lego/legoomni/include/legomain.h @@ -6,7 +6,6 @@ #include "mxomni.h" class Isle; -class IslePathActor; class LegoAnimationManager; class LegoBuildingManager; class LegoCharacterManager; @@ -14,6 +13,7 @@ class LegoEntity; class LegoGameState; class LegoInputManager; class LegoNavController; +class LegoPathActor; class LegoPathBoundary; class LegoPlantManager; class LegoROI; @@ -127,7 +127,7 @@ class LegoOmni : public MxOmni { ViewLODListManager* GetViewLODListManager() { return m_viewLODListManager; } LegoWorld* GetCurrentWorld() { return m_currentWorld; } LegoNavController* GetNavController() { return m_navController; } - IslePathActor* GetCurrentActor() { return m_currentActor; } + LegoPathActor* GetCurrentActor() { return m_currentActor; } LegoPlantManager* GetLegoPlantManager() { return m_plantManager; } LegoAnimationManager* GetAnimationManager() { return m_animationManager; } LegoBuildingManager* GetLegoBuildingManager() { return m_buildingManager; } @@ -139,7 +139,7 @@ class LegoOmni : public MxOmni { LegoWorldList* GetWorldList() { return m_worldList; } inline void SetNavController(LegoNavController* p_navController) { m_navController = p_navController; } - inline void SetCurrentActor(IslePathActor* p_currentActor) { m_currentActor = p_currentActor; } + inline void SetCurrentActor(LegoPathActor* p_currentActor) { m_currentActor = p_currentActor; } inline void SetCurrentWorld(LegoWorld* p_currentWorld) { m_currentWorld = p_currentWorld; } inline void SetExit(MxBool p_exit) { m_exit = p_exit; } inline MxResult StartActionIfUnknown0x13c(MxDSAction& p_dsAction) @@ -162,7 +162,7 @@ class LegoOmni : public MxOmni { LegoWorld* m_currentWorld; // 0x7c MxBool m_exit; // 0x80 LegoNavController* m_navController; // 0x84 - IslePathActor* m_currentActor; // 0x88 + LegoPathActor* m_currentActor; // 0x88 LegoCharacterManager* m_characterManager; // 0x8c LegoPlantManager* m_plantManager; // 0x90 LegoAnimationManager* m_animationManager; // 0x94 diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 4acc28e7..10f79b50 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -155,7 +155,7 @@ class LegoPathActor : public LegoActor { MxU32 m_state; // 0xdc LegoUnknown100db7f4* m_destEdge; // 0xe0 MxFloat m_unk0xe4; // 0xe4 - undefined m_unk0xe8; // 0xe8 + MxBool m_collideBox; // 0xe8 undefined m_unk0xe9; // 0xe9 MxBool m_userNavFlag; // 0xea MxMatrix m_unk0xec; // 0xec diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 5e54c748..15f103a8 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -8,7 +8,6 @@ #include "mxpresenterlist.h" #include "roi/legoroi.h" -class IslePathActor; class LegoCameraController; class LegoPathBoundary; class LegoHideAnimPresenter; diff --git a/LEGO1/lego/legoomni/include/misc.h b/LEGO1/lego/legoomni/include/misc.h index 65606dfb..34824772 100644 --- a/LEGO1/lego/legoomni/include/misc.h +++ b/LEGO1/lego/legoomni/include/misc.h @@ -7,7 +7,6 @@ #include "lego/legoomni/include/actions/actionsfwd.h" #include "mxtypes.h" -class IslePathActor; class LegoAnimationManager; class LegoBuildingManager; class LegoCharacterManager; @@ -16,6 +15,7 @@ class LegoGameState; class LegoInputManager; class LegoNavController; class LegoOmni; +class LegoPathActor; class LegoPlantManager; class LegoROI; class LegoSoundManager; @@ -40,7 +40,7 @@ LegoControlManager* ControlManager(); LegoGameState* GameState(); LegoAnimationManager* AnimationManager(); LegoNavController* NavController(); -IslePathActor* CurrentActor(); +LegoPathActor* CurrentActor(); LegoWorld* CurrentWorld(); LegoCharacterManager* CharacterManager(); ViewManager* GetViewManager(); @@ -51,7 +51,7 @@ ViewLODListManager* GetViewLODListManager(); void FUN_10015820(MxBool p_disable, MxU16 p_flags); LegoROI* FindROI(const char* p_name); void SetROIVisible(const char* p_name, MxBool p_visible); -void SetCurrentActor(IslePathActor* p_currentActor); +void SetCurrentActor(LegoPathActor* p_currentActor); MxResult StartActionIfUnknown0x13c(MxDSAction& p_dsAction); void DeleteAction(); LegoWorld* FindWorld(const MxAtomId& p_atom, MxS32 p_entityid); diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index f4a92d51..078cb6c1 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -78,11 +78,12 @@ void Helicopter::VTable0xe4() if (GameState()->GetCurrentAct() == LegoGameState::e_act1) { GameState()->SetCurrentArea(LegoGameState::e_copter); if (CurrentActor() && CurrentActor()->IsA("IslePathActor")) { - CurrentActor()->SpawnPlayer( - LegoGameState::e_unk55, - TRUE, - IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 - ); + ((IslePathActor*) CurrentActor()) + ->SpawnPlayer( + LegoGameState::e_unk55, + TRUE, + IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 + ); } } @@ -116,7 +117,7 @@ MxU32 Helicopter::VTable0xcc() if (CurrentActor()) { if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } } diff --git a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp index 72f558aa..be2bbc4b 100644 --- a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp +++ b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp @@ -27,7 +27,7 @@ IslePathActor::IslePathActor() m_world = NULL; m_unk0x13c = 6.0; m_unk0x15c = 1.0; - m_unk0x158 = 0; + m_unk0x158 = NULL; } // FUNCTION: LEGO1 0x1001a280 diff --git a/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp b/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp index ade45933..72905a76 100644 --- a/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp +++ b/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp @@ -38,7 +38,7 @@ MxLong JukeBoxEntity::Notify(MxParam& p_param) } if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } ((Isle*) FindWorld(*g_isleScript, 0))->SetDestLocation(LegoGameState::e_jukeboxw); diff --git a/LEGO1/lego/legoomni/src/actors/skateboard.cpp b/LEGO1/lego/legoomni/src/actors/skateboard.cpp index 8b010eb3..2e742d97 100644 --- a/LEGO1/lego/legoomni/src/actors/skateboard.cpp +++ b/LEGO1/lego/legoomni/src/actors/skateboard.cpp @@ -87,7 +87,7 @@ MxU32 SkateBoard::VTable0xcc() if (GameState()->GetActorId() != CurrentActor()->GetActorId()) { if (!CurrentActor()->IsA("SkateBoard")) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } } diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp index 2bd84167..95df6202 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp @@ -994,7 +994,7 @@ MxResult LegoAnimationManager::FUN_100605e0( FUN_100648f0(tranInfo, m_unk0x404); } else if (p_unk0x0a) { - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); if (actor != NULL) { actor->SetState(4); @@ -1432,7 +1432,7 @@ MxResult LegoAnimationManager::Tickle() return SUCCESS; } - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); LegoROI* roi; if (actor == NULL || (roi = actor->GetROI()) == NULL) { @@ -1655,7 +1655,7 @@ MxBool LegoAnimationManager::FUN_100623a0(AnimInfo& p_info) LegoEntityListCursor cursor(entityList); LegoEntity* entity; - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); while (cursor.Next(entity)) { if (entity != actor && entity->IsA("LegoPathActor")) { @@ -1858,7 +1858,7 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und) if (world != NULL) { PurgeExtra(FALSE); - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); if (actor == NULL || actor->GetWorldSpeed() <= 20.0f) { MxU32 i; for (i = 0; i < m_numAllowedExtras && m_extras[i].m_roi != NULL; i++) { @@ -2163,7 +2163,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx { MxU32 local2c = 12; float destScale = ((rand() * 0.5) / 32767.0) + 0.25; - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); if (actor == NULL) { return FALSE; diff --git a/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp b/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp index d1c73605..d2e37eba 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp @@ -425,7 +425,7 @@ MxBool LegoAnimMMPresenter::FUN_1004b6b0(MxLong p_time) MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time) { LegoROI* viewROI = VideoManager()->GetViewROI(); - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); if (m_tranInfo != NULL && m_tranInfo->m_unk0x14 && m_tranInfo->m_location != -1 && actor != NULL) { if (m_unk0x64 != NULL) { diff --git a/LEGO1/lego/legoomni/src/common/legogamestate.cpp b/LEGO1/lego/legoomni/src/common/legogamestate.cpp index 101a3e6a..79d6b1d4 100644 --- a/LEGO1/lego/legoomni/src/common/legogamestate.cpp +++ b/LEGO1/lego/legoomni/src/common/legogamestate.cpp @@ -172,7 +172,7 @@ void LegoGameState::SetActor(MxU8 p_actorId) m_actorId = p_actorId; } - IslePathActor* oldActor = CurrentActor(); + LegoPathActor* oldActor = CurrentActor(); SetCurrentActor(NULL); IslePathActor* newActor = new IslePathActor(); @@ -199,7 +199,7 @@ void LegoGameState::SetActor(MxU8 p_actorId) // FUNCTION: LEGO1 0x10039910 void LegoGameState::RemoveActor() { - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); SetCurrentActor(NULL); delete actor; m_actorId = 0; @@ -209,7 +209,7 @@ void LegoGameState::RemoveActor() void LegoGameState::ResetROI() { if (m_actorId) { - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); if (actor) { LegoROI* roi = actor->GetROI(); @@ -906,11 +906,12 @@ void LegoGameState::SwitchArea(Area p_area) AnimationManager()->Resume(); } - CurrentActor()->SpawnPlayer( - p_area, - TRUE, - IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 - ); + ((IslePathActor*) CurrentActor()) + ->SpawnPlayer( + p_area, + TRUE, + IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 + ); break; } case e_hospital: @@ -922,11 +923,12 @@ void LegoGameState::SwitchArea(Area p_area) SetCameraControllerFromIsle(); CurrentActor()->ResetWorldTransform(TRUE); AnimationManager()->Resume(); - CurrentActor()->SpawnPlayer( - p_area, - TRUE, - IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 - ); + ((IslePathActor*) CurrentActor()) + ->SpawnPlayer( + p_area, + TRUE, + IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 + ); break; case e_police: VideoManager()->SetUnk0x554(TRUE); diff --git a/LEGO1/lego/legoomni/src/common/misc.cpp b/LEGO1/lego/legoomni/src/common/misc.cpp index bf77f5e8..34060c5f 100644 --- a/LEGO1/lego/legoomni/src/common/misc.cpp +++ b/LEGO1/lego/legoomni/src/common/misc.cpp @@ -67,7 +67,7 @@ LegoNavController* NavController() } // FUNCTION: LEGO1 0x10015790 -IslePathActor* CurrentActor() +LegoPathActor* CurrentActor() { return LegoOmni::GetInstance()->GetCurrentActor(); } @@ -137,7 +137,7 @@ void SetROIVisible(const char* p_name, MxBool p_visible) } // FUNCTION: LEGO1 0x10015880 -void SetCurrentActor(IslePathActor* p_currentActor) +void SetCurrentActor(LegoPathActor* p_currentActor) { LegoOmni::GetInstance()->SetCurrentActor(p_currentActor); } diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 0455f1a7..2eb76ed2 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -1,7 +1,6 @@ #include "legoworld.h" #include "anim/legoanim.h" -#include "islepathactor.h" #include "legoanimationmanager.h" #include "legoanimpresenter.h" #include "legobuildingmanager.h" @@ -701,7 +700,7 @@ void LegoWorld::Enable(MxBool p_enable) else if (!p_enable && m_set0xd0.empty()) { MxPresenter* presenter; LegoPathController* controller; - IslePathActor* actor = CurrentActor(); + LegoPathActor* actor = CurrentActor(); if (actor) { RemovePathActor(actor); diff --git a/LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp b/LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp index cb15b026..aa14a197 100644 --- a/LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp +++ b/LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp @@ -24,7 +24,7 @@ MxLong GasStationEntity::VTable0x50(MxParam& p_param) state->SetUnknown18(0); if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle); diff --git a/LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp b/LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp index 9b2f4eb0..b6c995d9 100644 --- a/LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp +++ b/LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp @@ -24,7 +24,7 @@ MxLong HospitalEntity::VTable0x50(MxParam& p_param) act1State->SetUnknown18(0); if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle); diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp index 4c89044e..1928f1c7 100644 --- a/LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp @@ -26,7 +26,7 @@ MxLong InfoCenterEntity::VTable0x50(MxParam& p_param) switch (GameState()->GetCurrentAct()) { case LegoGameState::Act::e_act1: { if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle); diff --git a/LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp b/LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp index 5e11a4bd..1e7167dd 100644 --- a/LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp +++ b/LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp @@ -22,7 +22,7 @@ MxLong BeachHouseEntity::VTable0x50(MxParam& p_param) state->SetUnknown18(0); if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle); diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp index c26aec13..661c3e95 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp @@ -1,5 +1,6 @@ #include "legopathactor.h" +#include "define.h" #include "geom/legounkown100db7f4.h" #include "legocachesoundmanager.h" #include "legocameracontroller.h" @@ -11,6 +12,7 @@ #include "misc.h" #include "mxmisc.h" #include "mxtimer.h" +#include "mxutilities.h" #include "mxvariabletable.h" #include @@ -44,7 +46,7 @@ LegoPathActor::LegoPathActor() m_state = 0; m_grec = NULL; m_controller = NULL; - m_unk0xe8 = 0; + m_collideBox = FALSE; m_unk0x148 = 0; m_unk0x14c = 0; m_unk0x140 = 0.0099999999f; @@ -454,7 +456,7 @@ MxU32 LegoPathActor::VTable0x6c( LegoROI* roi = actor->GetROI(); if (roi != NULL && (roi->GetVisibility() || actor->GetCameraFlag())) { - if (roi->FUN_100a9410(p_v1, p_v2, p_f1, p_f2, p_v3, m_unk0xe8 != 0 && actor->m_unk0xe8 != 0)) { + if (roi->FUN_100a9410(p_v1, p_v2, p_f1, p_f2, p_v3, m_collideBox && actor->m_collideBox)) { VTable0x94(actor, TRUE); actor->VTable0x94(this, FALSE); return 2; @@ -540,10 +542,50 @@ inline MxU32 LegoPathActor::FUN_1002edd0( return result; } -// STUB: LEGO1 0x1002f020 +// FUNCTION: LEGO1 0x1002f020 +// FUNCTION: BETA10 0x100af54a void LegoPathActor::ParseAction(char* p_extra) { LegoActor::ParseAction(p_extra); + + char value[256]; + value[0] = '\0'; + + if (KeyValueStringParse(value, g_strPERMIT_NAVIGATE, p_extra)) { + SetUserNavFlag(TRUE); + NavController()->ResetLinearVel(m_worldSpeed); + SetCurrentActor(this); + } + + char* token; + if (KeyValueStringParse(value, g_strPATH, p_extra)) { + char name[12]; + + token = strtok(value, g_parseExtraTokens); + strcpy(name, token); + + token = strtok(NULL, g_parseExtraTokens); + MxS32 src = atoi(token); + + token = strtok(NULL, g_parseExtraTokens); + float srcScale = atof(token); + + token = strtok(NULL, g_parseExtraTokens); + MxS32 dest = atoi(token); + + token = strtok(NULL, g_parseExtraTokens); + float destScale = atof(token); + + LegoWorld* world = CurrentWorld(); + if (world != NULL) { + world->PlaceActor(this, name, src, srcScale, dest, destScale); + } + } + + if (KeyValueStringParse(value, g_strCOLLIDEBOX, p_extra)) { + token = strtok(value, g_parseExtraTokens); + m_collideBox = atoi(token); + } } // FUNCTION: LEGO1 0x1002f1b0 diff --git a/LEGO1/lego/legoomni/src/police/policeentity.cpp b/LEGO1/lego/legoomni/src/police/policeentity.cpp index 936d3859..a9090b61 100644 --- a/LEGO1/lego/legoomni/src/police/policeentity.cpp +++ b/LEGO1/lego/legoomni/src/police/policeentity.cpp @@ -24,7 +24,7 @@ MxLong PoliceEntity::VTable0x50(MxParam& p_param) state->SetUnknown18(0); if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle); diff --git a/LEGO1/lego/legoomni/src/race/racestandsentity.cpp b/LEGO1/lego/legoomni/src/race/racestandsentity.cpp index 91d9a07f..8cceb324 100644 --- a/LEGO1/lego/legoomni/src/race/racestandsentity.cpp +++ b/LEGO1/lego/legoomni/src/race/racestandsentity.cpp @@ -22,7 +22,7 @@ MxLong RaceStandsEntity::VTable0x50(MxParam& p_param) state->SetUnknown18(0); if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { - CurrentActor()->VTable0xe4(); + ((IslePathActor*) CurrentActor())->VTable0xe4(); } Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle); diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 9d787a8d..a1bbe9aa 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -503,7 +503,7 @@ void Isle::Enable(MxBool p_enable) } if (CurrentActor() != NULL && CurrentActor()->IsA("Jetski")) { - IslePathActor* actor = CurrentActor(); + IslePathActor* actor = (IslePathActor*) CurrentActor(); actor->SpawnPlayer( LegoGameState::e_unk45, FALSE, @@ -657,11 +657,12 @@ void Isle::Enable(MxBool p_enable) } break; case 5: { - CurrentActor()->SpawnPlayer( - LegoGameState::e_jetrace2, - FALSE, - IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 - ); + ((IslePathActor*) CurrentActor()) + ->SpawnPlayer( + LegoGameState::e_jetrace2, + FALSE, + IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 + ); JetskiRaceState* raceState = (JetskiRaceState*) GameState()->GetState("JetskiRaceState"); if (raceState->GetUnknown0x28() == 2) { @@ -689,11 +690,12 @@ void Isle::Enable(MxBool p_enable) } case 6: { GameState()->m_currentArea = LegoGameState::e_carraceExterior; - CurrentActor()->SpawnPlayer( - LegoGameState::e_unk21, - FALSE, - IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 - ); + ((IslePathActor*) CurrentActor()) + ->SpawnPlayer( + LegoGameState::e_unk21, + FALSE, + IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 + ); CarRaceState* raceState = (CarRaceState*) GameState()->GetState("CarRaceState"); if (raceState->GetUnknown0x28() == 2) { @@ -738,11 +740,12 @@ void Isle::Enable(MxBool p_enable) break; case 11: m_act1state->m_unk0x018 = 0; - CurrentActor()->SpawnPlayer( - LegoGameState::e_unk54, - TRUE, - IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 - ); + ((IslePathActor*) CurrentActor()) + ->SpawnPlayer( + LegoGameState::e_unk54, + TRUE, + IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 + ); GameState()->m_currentArea = LegoGameState::e_unk66; FUN_1003ef00(TRUE); m_jukebox->StartAction(); @@ -789,7 +792,7 @@ void Isle::FUN_10032620() case LegoGameState::e_unk66: { MxMatrix mat(CurrentActor()->GetROI()->GetLocal2World()); LegoPathBoundary* boundary = CurrentActor()->GetBoundary(); - CurrentActor()->VTable0xec(mat, boundary, TRUE); + ((IslePathActor*) CurrentActor())->VTable0xec(mat, boundary, TRUE); break; } case LegoGameState::e_unk4: @@ -802,11 +805,12 @@ void Isle::FUN_10032620() case LegoGameState::e_hospitalExterior: case LegoGameState::e_unk31: case LegoGameState::e_policeExterior: - CurrentActor()->SpawnPlayer( - GameState()->m_currentArea, - TRUE, - IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 - ); + ((IslePathActor*) CurrentActor()) + ->SpawnPlayer( + GameState()->m_currentArea, + TRUE, + IslePathActor::c_spawnBit1 | IslePathActor::c_playMusic | IslePathActor::c_spawnBit3 + ); GameState()->m_currentArea = LegoGameState::e_unk66; break; } @@ -1065,7 +1069,7 @@ void Isle::Add(MxCore* p_object) } // FUNCTION: LEGO1 0x10033050 -void Isle::VTable0x6c(IslePathActor* p_actor) +void Isle::VTable0x6c(LegoPathActor* p_actor) { LegoWorld::Remove(p_actor); From 1633118f68f6bd321d10acbe9d267007a95dde69 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 24 May 2024 13:16:04 -0400 Subject: [PATCH 02/28] Implement/match Isle::UpdateGlobe (#947) * Implement/match Isle::UpdateGlobe * Change function access --- LEGO1/lego/legoomni/include/isle.h | 17 +++++++++-------- LEGO1/lego/legoomni/src/worlds/isle.cpp | 20 ++++++++++++++------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index ae7e1af7..8d98d423 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -61,15 +61,22 @@ class Isle : public LegoWorld { void Enable(MxBool p_enable) override; // vtable+68 virtual void VTable0x6c(LegoPathActor* p_actor); // vtable+6c + inline void SetDestLocation(LegoGameState::Area p_destLocation) { m_destLocation = p_destLocation; } + + void FUN_10033350(); + + // SYNTHETIC: LEGO1 0x10030a30 + // Isle::`scalar deleting destructor' + +protected: MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleClick(LegoControlManagerEvent& p_param); MxLong HandleType19Notification(MxParam& p_param); MxLong HandleTransitionEnd(); void HandleElevatorEndAction(); - void FUN_10031590(); + void UpdateGlobe(); void FUN_10032620(); void FUN_100330e0(); - void FUN_10033350(); void FUN_10032d30( IsleScript::Script p_script, JukeboxScript::Script p_music, @@ -77,12 +84,6 @@ class Isle : public LegoWorld { MxBool p_und ); - inline void SetDestLocation(LegoGameState::Area p_destLocation) { m_destLocation = p_destLocation; } - - // SYNTHETIC: LEGO1 0x10030a30 - // Isle::`scalar deleting destructor' - -protected: Act1State* m_act1state; // 0xf8 Pizza* m_pizza; // 0xfc Pizzeria* m_pizzeria; // 0x100 diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index a1bbe9aa..21aeb3dd 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -399,15 +399,15 @@ MxLong Isle::HandleClick(LegoControlManagerEvent& p_param) Start(&action); break; case IsleScript::c_Observe_RCab_Ctl: - FUN_10031590(); + UpdateGlobe(); break; case IsleScript::c_Observe_GlobeLArrow_Ctl: UpdateLightPosition(-1); - FUN_10031590(); + UpdateGlobe(); break; case IsleScript::c_Observe_GlobeRArrow_Ctl: UpdateLightPosition(1); - FUN_10031590(); + UpdateGlobe(); break; case IsleScript::c_Observe_Draw1_Ctl: case IsleScript::c_Observe_Draw2_Ctl: @@ -443,10 +443,18 @@ MxLong Isle::HandleClick(LegoControlManagerEvent& p_param) return 0; } -// STUB: LEGO1 0x10031590 -void Isle::FUN_10031590() +// FUNCTION: LEGO1 0x10031590 +void Isle::UpdateGlobe() { - // TODO + MxS32 lightPosition = atoi(VariableTable()->GetVariable("lightposition")); + + for (MxS32 i = 0; i < 6; i++) { + MxStillPresenter* presenter = (MxStillPresenter*) Find(*g_isleScript, IsleScript::c_Observe_Globe1_Bitmap + i); + + if (presenter != NULL) { + presenter->Enable(i == lightPosition); + } + } } // STUB: LEGO1 0x100315f0 From 63719ef68981edbb37ee71e20e382a735f7e01ce Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 24 May 2024 14:07:36 -0400 Subject: [PATCH 03/28] Implement/match Isle::CreateState and related (#948) --- LEGO1/lego/legoomni/include/ambulance.h | 1 + LEGO1/lego/legoomni/include/helicopter.h | 5 ++- LEGO1/lego/legoomni/include/isle.h | 2 +- LEGO1/lego/legoomni/include/pizza.h | 19 +++++----- LEGO1/lego/legoomni/include/pizzeria.h | 4 +-- LEGO1/lego/legoomni/include/radio.h | 3 +- LEGO1/lego/legoomni/include/towtrack.h | 24 +++++++------ LEGO1/lego/legoomni/src/actors/ambulance.cpp | 36 ++++++++++++------- LEGO1/lego/legoomni/src/actors/helicopter.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/pizza.cpp | 22 ++++++++++-- LEGO1/lego/legoomni/src/actors/pizzeria.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/radio.cpp | 6 ++-- LEGO1/lego/legoomni/src/actors/towtrack.cpp | 31 +++++++++++----- LEGO1/lego/legoomni/src/worlds/isle.cpp | 23 +++++++++--- 14 files changed, 123 insertions(+), 61 deletions(-) diff --git a/LEGO1/lego/legoomni/include/ambulance.h b/LEGO1/lego/legoomni/include/ambulance.h index 1aff83a0..f5d8d04c 100644 --- a/LEGO1/lego/legoomni/include/ambulance.h +++ b/LEGO1/lego/legoomni/include/ambulance.h @@ -36,6 +36,7 @@ class Ambulance : public IslePathActor { MxU32 VTable0xdc(MxType19NotificationParam&) override; // vtable+0xdc void VTable0xe4() override; // vtable+0xe4 + void CreateState(); void FUN_10036e60(); void FUN_10037060(); diff --git a/LEGO1/lego/legoomni/include/helicopter.h b/LEGO1/lego/legoomni/include/helicopter.h index b568390a..867763be 100644 --- a/LEGO1/lego/legoomni/include/helicopter.h +++ b/LEGO1/lego/legoomni/include/helicopter.h @@ -37,6 +37,8 @@ class Helicopter : public IslePathActor { // SYNTHETIC: LEGO1 0x10003210 // Helicopter::`scalar deleting destructor' + void CreateState(); + protected: MxMatrix m_unk0x160; // 0x160 MxMatrix m_unk0x1a8; // 0x1a8 @@ -44,9 +46,6 @@ class Helicopter : public IslePathActor { UnknownMx4DPointFloat m_unk0x1f4; // 0x1f4 HelicopterState* m_state; // 0x228 MxAtomId m_script; // 0x22c - -private: - void GetState(); }; #endif // HELICOPTER_H diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 8d98d423..6242a828 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -76,7 +76,7 @@ class Isle : public LegoWorld { void HandleElevatorEndAction(); void UpdateGlobe(); void FUN_10032620(); - void FUN_100330e0(); + void CreateState(); void FUN_10032d30( IsleScript::Script p_script, JukeboxScript::Script p_music, diff --git a/LEGO1/lego/legoomni/include/pizza.h b/LEGO1/lego/legoomni/include/pizza.h index bb8c18f7..f845868f 100644 --- a/LEGO1/lego/legoomni/include/pizza.h +++ b/LEGO1/lego/legoomni/include/pizza.h @@ -4,6 +4,8 @@ #include "decomp.h" #include "isleactor.h" +class Act1State; +class PizzaMissionState; class SkateBoard; // VTABLE: LEGO1 0x100d7380 @@ -33,6 +35,7 @@ class Pizza : public IsleActor { undefined4 HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74 undefined4 VTable0x80(MxParam&) override; // vtable+0x80 + void CreateState(); void FUN_100382b0(); void FUN_10038380(); @@ -42,14 +45,14 @@ class Pizza : public IsleActor { // Pizza::`scalar deleting destructor' private: - undefined4 m_unk0x7c; // 0x7c - undefined4 m_unk0x80; // 0x80 - SkateBoard* m_skateboard; // 0x84 - undefined4 m_unk0x88; // 0x88 - undefined4 m_unk0x8c; // 0x8c - undefined4 m_unk0x90; // 0x90 - undefined4 m_unk0x94; // 0x94 - undefined m_unk0x98; // 0x98 + PizzaMissionState* m_state; // 0x7c + undefined4 m_unk0x80; // 0x80 + SkateBoard* m_skateboard; // 0x84 + Act1State* m_act1state; // 0x88 + undefined4 m_unk0x8c; // 0x8c + undefined4 m_unk0x90; // 0x90 + undefined4 m_unk0x94; // 0x94 + undefined m_unk0x98; // 0x98 }; #endif // PIZZA_H diff --git a/LEGO1/lego/legoomni/include/pizzeria.h b/LEGO1/lego/legoomni/include/pizzeria.h index 0f36dbdf..0991d00a 100644 --- a/LEGO1/lego/legoomni/include/pizzeria.h +++ b/LEGO1/lego/legoomni/include/pizzeria.h @@ -29,12 +29,12 @@ class Pizzeria : public IsleActor { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 undefined4 VTable0x68() override; // vtable+0x68 + void CreateState(); + // SYNTHETIC: LEGO1 0x1000e8d0 // Pizzeria::`scalar deleting destructor' private: - void Init(); - PizzeriaState* m_pizzeriaState; // 0x7c PizzaMissionState* m_pizzaMissionState; // 0x80 }; diff --git a/LEGO1/lego/legoomni/include/radio.h b/LEGO1/lego/legoomni/include/radio.h index 3c35a300..50b4de6f 100644 --- a/LEGO1/lego/legoomni/include/radio.h +++ b/LEGO1/lego/legoomni/include/radio.h @@ -30,6 +30,7 @@ class Radio : public MxCore { } void Initialize(MxBool p_und); + void CreateState(); void Play(); void Stop(); @@ -39,8 +40,6 @@ class Radio : public MxCore { // Radio::`scalar deleting destructor' private: - void CreateRadioState(); - RadioState* m_state; // 0x08 MxBool m_unk0x0c; // 0x0c MxBool m_audioEnabled; // 0x0d diff --git a/LEGO1/lego/legoomni/include/towtrack.h b/LEGO1/lego/legoomni/include/towtrack.h index 056f0793..0c91e8a7 100644 --- a/LEGO1/lego/legoomni/include/towtrack.h +++ b/LEGO1/lego/legoomni/include/towtrack.h @@ -4,6 +4,8 @@ #include "decomp.h" #include "islepathactor.h" +class TowTrackMissionState; + // VTABLE: LEGO1 0x100d7ee0 // SIZE 0x180 class TowTrack : public IslePathActor { @@ -32,6 +34,7 @@ class TowTrack : public IslePathActor { MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc void VTable0xe4() override; // vtable+0xe4 + void CreateState(); void FUN_1004dab0(); void FUN_1004dad0(); @@ -39,17 +42,16 @@ class TowTrack : public IslePathActor { // TowTrack::`scalar deleting destructor' private: - // TODO: TowTrack field types - undefined m_unk0x154[4]; - MxS32 m_unk0x164; - MxS16 m_unk0x168; - MxS16 m_unk0x16a; - MxS16 m_unk0x16c; - MxS16 m_unk0x16e; - MxS32 m_unk0x170; - MxS32 m_unk0x174; - MxFloat m_unk0x178; - undefined4 m_unk0x17c; + undefined4 m_unk0x160; // 0x160 + TowTrackMissionState* m_state; // 0x164 + MxS16 m_unk0x168; // 0x168 + MxS16 m_unk0x16a; // 0x16a + MxS16 m_unk0x16c; // 0x16c + MxS16 m_unk0x16e; // 0x16e + MxS32 m_unk0x170; // 0x170 + MxS32 m_unk0x174; // 0x174 + MxFloat m_unk0x178; // 0x178 + undefined4 m_unk0x17c; // 0x17c }; #endif // TOWTRACK_H diff --git a/LEGO1/lego/legoomni/src/actors/ambulance.cpp b/LEGO1/lego/legoomni/src/actors/ambulance.cpp index d793503b..d7f7ebb4 100644 --- a/LEGO1/lego/legoomni/src/actors/ambulance.cpp +++ b/LEGO1/lego/legoomni/src/actors/ambulance.cpp @@ -18,17 +18,17 @@ DECOMP_SIZE_ASSERT(Ambulance, 0x184) // FUNCTION: LEGO1 0x10035ee0 Ambulance::Ambulance() { - this->m_unk0x168 = 0; - this->m_unk0x16a = -1; - this->m_state = NULL; - this->m_unk0x16c = 0; - this->m_unk0x174 = -1; - this->m_unk0x16e = 0; - this->m_unk0x178 = -1; - this->m_unk0x170 = 0; - this->m_unk0x172 = 0; - this->m_unk0x13c = 40.0; - this->m_unk0x17c = 1.0; + m_unk0x168 = 0; + m_unk0x16a = -1; + m_state = NULL; + m_unk0x16c = 0; + m_unk0x174 = -1; + m_unk0x16e = 0; + m_unk0x178 = -1; + m_unk0x170 = 0; + m_unk0x172 = 0; + m_unk0x13c = 40.0; + m_unk0x17c = 1.0; } // FUNCTION: LEGO1 0x10035f90 @@ -66,7 +66,6 @@ MxResult Ambulance::Create(MxDSAction& p_dsAction) VariableTable()->SetVariable(g_varAMBULFUEL, "1.0"); m_unk0x17c = 1.0; m_time = Timer()->GetTime(); - return result; } @@ -76,6 +75,19 @@ void Ambulance::VTable0x70(float p_float) // TODO } +// FUNCTION: LEGO1 0x100363f0 +void Ambulance::CreateState() +{ + LegoGameState* gameState = GameState(); + AmbulanceMissionState* state = (AmbulanceMissionState*) gameState->GetState("AmbulanceMissionState"); + + if (state == NULL) { + state = (AmbulanceMissionState*) gameState->CreateState("AmbulanceMissionState"); + } + + m_state = state; +} + // STUB: LEGO1 0x10036420 MxLong Ambulance::Notify(MxParam& p_param) { diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index 078cb6c1..8307e07a 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -49,12 +49,12 @@ MxResult Helicopter::Create(MxDSAction& p_dsAction) if (world) { world->Add(this); } - GetState(); + CreateState(); return result; } // FUNCTION: LEGO1 0x10003320 -void Helicopter::GetState() +void Helicopter::CreateState() { m_state = (HelicopterState*) GameState()->GetState("HelicopterState"); if (!m_state) { diff --git a/LEGO1/lego/legoomni/src/actors/pizza.cpp b/LEGO1/lego/legoomni/src/actors/pizza.cpp index 57ab17df..236536b0 100644 --- a/LEGO1/lego/legoomni/src/actors/pizza.cpp +++ b/LEGO1/lego/legoomni/src/actors/pizza.cpp @@ -1,17 +1,21 @@ #include "pizza.h" +#include "act1state.h" +#include "legogamestate.h" +#include "misc.h" #include "mxmisc.h" #include "mxticklemanager.h" +#include "pizzamissionstate.h" DECOMP_SIZE_ASSERT(Pizza, 0x9c) // FUNCTION: LEGO1 0x10037ef0 Pizza::Pizza() { - m_unk0x7c = 0; + m_state = NULL; m_unk0x80 = 0; m_skateboard = NULL; - m_unk0x88 = 0; + m_act1state = NULL; m_unk0x8c = -1; m_unk0x98 = 0; m_unk0x90 = 0x80000000; @@ -30,6 +34,20 @@ MxResult Pizza::Create(MxDSAction& p_dsAction) return SUCCESS; } +// FUNCTION: LEGO1 0x100381b0 +void Pizza::CreateState() +{ + m_state = (PizzaMissionState*) GameState()->GetState("PizzaMissionState"); + if (m_state == NULL) { + m_state = (PizzaMissionState*) GameState()->CreateState("PizzaMissionState"); + } + + m_act1state = (Act1State*) GameState()->GetState("Act1State"); + if (m_act1state == NULL) { + m_act1state = (Act1State*) GameState()->CreateState("Act1State"); + } +} + // STUB: LEGO1 0x100382b0 void Pizza::FUN_100382b0() { diff --git a/LEGO1/lego/legoomni/src/actors/pizzeria.cpp b/LEGO1/lego/legoomni/src/actors/pizzeria.cpp index 2346914b..2d72fd56 100644 --- a/LEGO1/lego/legoomni/src/actors/pizzeria.cpp +++ b/LEGO1/lego/legoomni/src/actors/pizzeria.cpp @@ -11,14 +11,14 @@ MxResult Pizzeria::Create(MxDSAction& p_dsAction) MxResult result = IsleActor::Create(p_dsAction); if (result == SUCCESS) { - Init(); + CreateState(); } return result; } // FUNCTION: LEGO1 0x100179f0 -void Pizzeria::Init() +void Pizzeria::CreateState() { LegoGameState* gameState = GameState(); PizzeriaState* pizzeriaState = (PizzeriaState*) gameState->GetState("PizzeriaState"); diff --git a/LEGO1/lego/legoomni/src/actors/radio.cpp b/LEGO1/lego/legoomni/src/actors/radio.cpp index a04523b1..537bf080 100644 --- a/LEGO1/lego/legoomni/src/actors/radio.cpp +++ b/LEGO1/lego/legoomni/src/actors/radio.cpp @@ -22,7 +22,7 @@ Radio::Radio() ControlManager()->Register(this); m_unk0x0c = TRUE; - CreateRadioState(); + CreateState(); } // FUNCTION: LEGO1 0x1002c990 @@ -147,12 +147,12 @@ void Radio::Initialize(MxBool p_und) { if (m_unk0x0c != p_und) { m_unk0x0c = p_und; - CreateRadioState(); + CreateState(); } } // FUNCTION: LEGO1 0x1002cde0 -void Radio::CreateRadioState() +void Radio::CreateState() { LegoGameState* gameState = GameState(); RadioState* state = (RadioState*) gameState->GetState("RadioState"); diff --git a/LEGO1/lego/legoomni/src/actors/towtrack.cpp b/LEGO1/lego/legoomni/src/actors/towtrack.cpp index 2b087966..25b939e0 100644 --- a/LEGO1/lego/legoomni/src/actors/towtrack.cpp +++ b/LEGO1/lego/legoomni/src/actors/towtrack.cpp @@ -1,19 +1,23 @@ #include "towtrack.h" +#include "legogamestate.h" +#include "misc.h" +#include "towtrackmissionstate.h" + DECOMP_SIZE_ASSERT(TowTrack, 0x180) // FUNCTION: LEGO1 0x1004c720 TowTrack::TowTrack() { - this->m_unk0x168 = 0; - this->m_unk0x16a = -1; - this->m_unk0x164 = 0; - this->m_unk0x16c = 0; - this->m_unk0x170 = -1; - this->m_unk0x16e = 0; - this->m_unk0x174 = -1; - this->m_unk0x13c = 40.0; - this->m_unk0x178 = 1.0; + m_unk0x168 = 0; + m_unk0x16a = -1; + m_state = NULL; + m_unk0x16c = 0; + m_unk0x170 = -1; + m_unk0x16e = 0; + m_unk0x174 = -1; + m_unk0x13c = 40.0; + m_unk0x178 = 1.0; } // STUB: LEGO1 0x1004c9e0 @@ -29,6 +33,15 @@ void TowTrack::VTable0x70(float p_float) // TODO } +// FUNCTION: LEGO1 0x1004cc40 +void TowTrack::CreateState() +{ + m_state = (TowTrackMissionState*) GameState()->GetState("TowTrackMissionState"); + if (m_state == NULL) { + m_state = (TowTrackMissionState*) GameState()->CreateState("TowTrackMissionState"); + } +} + // STUB: LEGO1 0x1004cc80 MxLong TowTrack::Notify(MxParam& p_param) { diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 21aeb3dd..38e0fa5a 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -31,6 +31,7 @@ #include "mxtransitionmanager.h" #include "mxvariabletable.h" #include "pizza.h" +#include "pizzeria.h" #include "scripts.h" #include "skateboard.h" #include "towtrack.h" @@ -474,7 +475,7 @@ void Isle::Enable(MxBool p_enable) m_radio.Initialize(p_enable); if (p_enable) { - FUN_100330e0(); + CreateState(); VideoManager()->ResetPalette(FALSE); m_act1state->FUN_10034d00(); @@ -1095,10 +1096,24 @@ void Isle::VTable0x6c(LegoPathActor* p_actor) } } -// STUB: LEGO1 0x100330e0 -void Isle::FUN_100330e0() +// FUNCTION: LEGO1 0x100330e0 +void Isle::CreateState() { - // TODO + m_act1state = (Act1State*) GameState()->GetState("Act1State"); + if (!m_act1state) { + m_act1state = (Act1State*) GameState()->CreateState("Act1State"); + m_act1state->m_unk0x018 = 0; + } + + m_radio.CreateState(); + m_pizzeria->CreateState(); + m_pizza->CreateState(); + m_towtrack->CreateState(); + m_ambulance->CreateState(); + + if (m_helicopter != NULL) { + m_helicopter->CreateState(); + } } // STUB: LEGO1 0x10033180 From e59d684f37078d508e56462e0b976705ca008bcb Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 24 May 2024 14:44:09 -0400 Subject: [PATCH 04/28] Implement/match actor Create functions (#949) --- .../legoomni/include/ambulancemissionstate.h | 3 -- LEGO1/lego/legoomni/include/isleactor.h | 2 +- LEGO1/lego/legoomni/include/islepathactor.h | 3 -- LEGO1/lego/legoomni/include/legovariables.h | 1 + LEGO1/lego/legoomni/include/towtrack.h | 2 +- .../legoomni/include/towtrackmissionstate.h | 1 - LEGO1/lego/legoomni/src/actors/ambulance.cpp | 2 +- LEGO1/lego/legoomni/src/actors/helicopter.cpp | 15 ++++----- LEGO1/lego/legoomni/src/actors/pizza.cpp | 14 +++++++-- LEGO1/lego/legoomni/src/actors/towtrack.cpp | 31 +++++++++++++++++-- .../legoomni/src/common/legovariables.cpp | 4 +++ 11 files changed, 55 insertions(+), 23 deletions(-) diff --git a/LEGO1/lego/legoomni/include/ambulancemissionstate.h b/LEGO1/lego/legoomni/include/ambulancemissionstate.h index 88bcf4b8..002d2803 100644 --- a/LEGO1/lego/legoomni/include/ambulancemissionstate.h +++ b/LEGO1/lego/legoomni/include/ambulancemissionstate.h @@ -24,8 +24,6 @@ class AmbulanceMissionState : public LegoState { MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c - inline void SetUnknown0x08(undefined4 p_unk0x08) { m_unk0x08 = p_unk0x08; } - inline MxU16 GetScore(MxU8 p_id) { switch (p_id) { @@ -47,7 +45,6 @@ class AmbulanceMissionState : public LegoState { // SYNTHETIC: LEGO1 0x100376c0 // AmbulanceMissionState::`scalar deleting destructor' -protected: undefined4 m_unk0x08; // 0x08 undefined4 m_unk0x0c; // 0x0c MxU16 m_unk0x10; // 0x10 diff --git a/LEGO1/lego/legoomni/include/isleactor.h b/LEGO1/lego/legoomni/include/isleactor.h index 1affab4a..ad2e985d 100644 --- a/LEGO1/lego/legoomni/include/isleactor.h +++ b/LEGO1/lego/legoomni/include/isleactor.h @@ -49,7 +49,7 @@ class IsleActor : public LegoActor { // FUNCTION: LEGO1 0x1000e650 virtual undefined4 VTable0x80(MxParam&) { return 0; } // vtable+0x80 -private: +protected: LegoWorld* m_world; // 0x78 }; diff --git a/LEGO1/lego/legoomni/include/islepathactor.h b/LEGO1/lego/legoomni/include/islepathactor.h index 1b795be0..43d301cf 100644 --- a/LEGO1/lego/legoomni/include/islepathactor.h +++ b/LEGO1/lego/legoomni/include/islepathactor.h @@ -128,9 +128,6 @@ class IslePathActor : public LegoPathActor { // SYNTHETIC: LEGO1 0x10002ff0 // IslePathActor::`scalar deleting destructor' - inline void SetWorld(LegoWorld* p_world) { m_world = p_world; } - inline LegoWorld* GetWorld() { return m_world; } - void FUN_1001b660(); static void RegisterSpawnLocations(); diff --git a/LEGO1/lego/legoomni/include/legovariables.h b/LEGO1/lego/legoomni/include/legovariables.h index ec02c530..9ef1a197 100644 --- a/LEGO1/lego/legoomni/include/legovariables.h +++ b/LEGO1/lego/legoomni/include/legovariables.h @@ -4,6 +4,7 @@ #include "mxvariable.h" extern const char* g_varAMBULFUEL; +extern const char* g_varTOWFUEL; extern const char* g_varVISIBILITY; extern const char* g_varCAMERALOCATION; extern const char* g_varCURSOR; diff --git a/LEGO1/lego/legoomni/include/towtrack.h b/LEGO1/lego/legoomni/include/towtrack.h index 0c91e8a7..8e5ecfc0 100644 --- a/LEGO1/lego/legoomni/include/towtrack.h +++ b/LEGO1/lego/legoomni/include/towtrack.h @@ -51,7 +51,7 @@ class TowTrack : public IslePathActor { MxS32 m_unk0x170; // 0x170 MxS32 m_unk0x174; // 0x174 MxFloat m_unk0x178; // 0x178 - undefined4 m_unk0x17c; // 0x17c + MxFloat m_time; // 0x17c }; #endif // TOWTRACK_H diff --git a/LEGO1/lego/legoomni/include/towtrackmissionstate.h b/LEGO1/lego/legoomni/include/towtrackmissionstate.h index da9361f2..5a684011 100644 --- a/LEGO1/lego/legoomni/include/towtrackmissionstate.h +++ b/LEGO1/lego/legoomni/include/towtrackmissionstate.h @@ -45,7 +45,6 @@ class TowTrackMissionState : public LegoState { // SYNTHETIC: LEGO1 0x1004e060 // TowTrackMissionState::`scalar deleting destructor' -protected: undefined4 m_unk0x08; // 0x08 undefined4 m_unk0x0c; // 0x0c MxU8 m_unk0x10; // 0x10 diff --git a/LEGO1/lego/legoomni/src/actors/ambulance.cpp b/LEGO1/lego/legoomni/src/actors/ambulance.cpp index d7f7ebb4..8f7f05d1 100644 --- a/LEGO1/lego/legoomni/src/actors/ambulance.cpp +++ b/LEGO1/lego/legoomni/src/actors/ambulance.cpp @@ -58,7 +58,7 @@ MxResult Ambulance::Create(MxDSAction& p_dsAction) m_state = (AmbulanceMissionState*) GameState()->GetState("AmbulanceMissionState"); if (!m_state) { m_state = new AmbulanceMissionState(); - m_state->SetUnknown0x08(0); + m_state->m_unk0x08 = 0; GameState()->RegisterState(m_state); } } diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index 8307e07a..06eba4e0 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -40,15 +40,16 @@ Helicopter::~Helicopter() MxResult Helicopter::Create(MxDSAction& p_dsAction) { MxResult result = IslePathActor::Create(p_dsAction); - LegoWorld* world = CurrentWorld(); - SetWorld(world); - if (world->IsA("Act3")) { - ((Act3*) GetWorld())->SetUnknown420c(this); + + m_world = CurrentWorld(); + if (m_world->IsA("Act3")) { + ((Act3*) m_world)->SetUnknown420c(this); } - world = GetWorld(); - if (world) { - world->Add(this); + + if (m_world != NULL) { + m_world->Add(this); } + CreateState(); return result; } diff --git a/LEGO1/lego/legoomni/src/actors/pizza.cpp b/LEGO1/lego/legoomni/src/actors/pizza.cpp index 236536b0..d3779d40 100644 --- a/LEGO1/lego/legoomni/src/actors/pizza.cpp +++ b/LEGO1/lego/legoomni/src/actors/pizza.cpp @@ -1,7 +1,9 @@ #include "pizza.h" #include "act1state.h" +#include "isle_actions.h" #include "legogamestate.h" +#include "legoworld.h" #include "misc.h" #include "mxmisc.h" #include "mxticklemanager.h" @@ -27,11 +29,17 @@ Pizza::~Pizza() TickleManager()->UnregisterClient(this); } -// STUB: LEGO1 0x10038170 +// FUNCTION: LEGO1 0x10038170 MxResult Pizza::Create(MxDSAction& p_dsAction) { - // TODO - return SUCCESS; + MxResult result = IsleActor::Create(p_dsAction); + + if (result == SUCCESS) { + CreateState(); + m_skateboard = (SkateBoard*) m_world->Find(m_atom, IsleScript::c_SkateBoard_Actor); + } + + return result; } // FUNCTION: LEGO1 0x100381b0 diff --git a/LEGO1/lego/legoomni/src/actors/towtrack.cpp b/LEGO1/lego/legoomni/src/actors/towtrack.cpp index 25b939e0..2337fa4b 100644 --- a/LEGO1/lego/legoomni/src/actors/towtrack.cpp +++ b/LEGO1/lego/legoomni/src/actors/towtrack.cpp @@ -1,7 +1,12 @@ #include "towtrack.h" #include "legogamestate.h" +#include "legovariables.h" +#include "legoworld.h" #include "misc.h" +#include "mxmisc.h" +#include "mxtimer.h" +#include "mxvariabletable.h" #include "towtrackmissionstate.h" DECOMP_SIZE_ASSERT(TowTrack, 0x180) @@ -20,11 +25,31 @@ TowTrack::TowTrack() m_unk0x178 = 1.0; } -// STUB: LEGO1 0x1004c9e0 +// FUNCTION: LEGO1 0x1004c9e0 +// FUNCTION: BETA10 0x100f6bf1 MxResult TowTrack::Create(MxDSAction& p_dsAction) { - // TODO - return SUCCESS; + MxResult result = IslePathActor::Create(p_dsAction); + + if (result == SUCCESS) { + m_world = CurrentWorld(); + + if (m_world) { + m_world->Add(this); + } + + m_state = (TowTrackMissionState*) GameState()->GetState("TowTrackMissionState"); + if (!m_state) { + m_state = new TowTrackMissionState(); + m_state->m_unk0x08 = 0; + GameState()->RegisterState(m_state); + } + } + + VariableTable()->SetVariable(g_varTOWFUEL, "1.0"); + m_unk0x178 = 1.0; + m_time = Timer()->GetTime(); + return result; } // STUB: LEGO1 0x1004cb10 diff --git a/LEGO1/lego/legoomni/src/common/legovariables.cpp b/LEGO1/lego/legoomni/src/common/legovariables.cpp index 7dc427b8..38b5b5e8 100644 --- a/LEGO1/lego/legoomni/src/common/legovariables.cpp +++ b/LEGO1/lego/legoomni/src/common/legovariables.cpp @@ -20,6 +20,10 @@ DECOMP_SIZE_ASSERT(CustomizeAnimFileVariable, 0x24) // STRING: LEGO1 0x100f39a0 const char* g_varAMBULFUEL = "ambulFUEL"; +// GLOBAL: LEGO1 0x100f43b4 +// STRING: LEGO1 0x100f439c +const char* g_varTOWFUEL = "towFUEL"; + // GLOBAL: LEGO1 0x100f3a40 // STRING: LEGO1 0x100f3808 const char* g_varVISIBILITY = "VISIBILITY"; From b759390060f6a31e7333ffc664729b0d19c757c4 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 24 May 2024 20:41:57 -0400 Subject: [PATCH 05/28] Implement/match Isle::Escape (#950) --- LEGO1/lego/legoomni/include/act3.h | 2 +- LEGO1/lego/legoomni/include/ambulance.h | 2 + LEGO1/lego/legoomni/include/carrace.h | 2 +- LEGO1/lego/legoomni/include/elevatorbottom.h | 2 +- LEGO1/lego/legoomni/include/gasstation.h | 2 +- LEGO1/lego/legoomni/include/historybook.h | 2 +- LEGO1/lego/legoomni/include/hospital.h | 2 +- LEGO1/lego/legoomni/include/infocenter.h | 2 +- LEGO1/lego/legoomni/include/infocenterdoor.h | 2 +- LEGO1/lego/legoomni/include/isle.h | 2 +- LEGO1/lego/legoomni/include/jetskirace.h | 2 +- LEGO1/lego/legoomni/include/jukebox.h | 2 +- LEGO1/lego/legoomni/include/legoact2.h | 2 +- LEGO1/lego/legoomni/include/legocarbuild.h | 2 +- LEGO1/lego/legoomni/include/legorace.h | 2 +- LEGO1/lego/legoomni/include/legoworld.h | 2 +- LEGO1/lego/legoomni/include/police.h | 2 +- .../lego/legoomni/include/registrationbook.h | 2 +- LEGO1/lego/legoomni/include/score.h | 2 +- LEGO1/lego/legoomni/include/skateboard.h | 2 + LEGO1/lego/legoomni/include/towtrack.h | 2 + LEGO1/lego/legoomni/src/actors/ambulance.cpp | 12 ++++ LEGO1/lego/legoomni/src/actors/towtrack.cpp | 12 ++++ .../lego/legoomni/src/build/legocarbuild.cpp | 2 +- .../legoomni/src/entity/legonavcontroller.cpp | 2 +- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 2 +- LEGO1/lego/legoomni/src/race/carrace.cpp | 2 +- LEGO1/lego/legoomni/src/race/jetskirace.cpp | 2 +- LEGO1/lego/legoomni/src/race/legorace.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/act3.cpp | 2 +- .../legoomni/src/worlds/elevatorbottom.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/gasstation.cpp | 2 +- .../lego/legoomni/src/worlds/historybook.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/hospital.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/infocenter.cpp | 2 +- .../legoomni/src/worlds/infocenterdoor.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/isle.cpp | 58 +++++++++++++++++-- LEGO1/lego/legoomni/src/worlds/jukebox.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/legoact2.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/police.cpp | 2 +- .../legoomni/src/worlds/registrationbook.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/score.cpp | 2 +- 42 files changed, 120 insertions(+), 40 deletions(-) diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index 2883ff9d..b476dcc0 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -32,7 +32,7 @@ class Act3 : public LegoWorld { void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c void VTable0x60() override; // vtable+0x60 - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 inline void SetUnknown420c(MxEntity* p_entity) { m_unk0x420c = p_entity; } diff --git a/LEGO1/lego/legoomni/include/ambulance.h b/LEGO1/lego/legoomni/include/ambulance.h index f5d8d04c..9e4b95b7 100644 --- a/LEGO1/lego/legoomni/include/ambulance.h +++ b/LEGO1/lego/legoomni/include/ambulance.h @@ -39,6 +39,8 @@ class Ambulance : public IslePathActor { void CreateState(); void FUN_10036e60(); void FUN_10037060(); + void FUN_10037240(); + void FUN_10037250(); // SYNTHETIC: LEGO1 0x10036130 // Ambulance::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/carrace.h b/LEGO1/lego/legoomni/include/carrace.h index c5af66e8..bb9d6324 100644 --- a/LEGO1/lego/legoomni/include/carrace.h +++ b/LEGO1/lego/legoomni/include/carrace.h @@ -25,7 +25,7 @@ class CarRace : public LegoRace { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 undefined4 VTable0x6c(undefined4) override; // vtable+0x6c undefined4 VTable0x70(undefined4) override; // vtable+0x70 undefined4 VTable0x74(undefined4) override; // vtable+0x74 diff --git a/LEGO1/lego/legoomni/include/elevatorbottom.h b/LEGO1/lego/legoomni/include/elevatorbottom.h index e2886f5c..81db82d6 100644 --- a/LEGO1/lego/legoomni/include/elevatorbottom.h +++ b/LEGO1/lego/legoomni/include/elevatorbottom.h @@ -35,7 +35,7 @@ class ElevatorBottom : public LegoWorld { // FUNCTION: LEGO1 0x10017f10 MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 // SYNTHETIC: LEGO1 0x10018040 diff --git a/LEGO1/lego/legoomni/include/gasstation.h b/LEGO1/lego/legoomni/include/gasstation.h index c6dd28d5..51e7a3da 100644 --- a/LEGO1/lego/legoomni/include/gasstation.h +++ b/LEGO1/lego/legoomni/include/gasstation.h @@ -35,7 +35,7 @@ class GasStation : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 virtual MxLong HandleClick(LegoControlManagerEvent& p_param); // vtable+0x6c diff --git a/LEGO1/lego/legoomni/include/historybook.h b/LEGO1/lego/legoomni/include/historybook.h index af3b9be2..28870fc9 100644 --- a/LEGO1/lego/legoomni/include/historybook.h +++ b/LEGO1/lego/legoomni/include/historybook.h @@ -31,7 +31,7 @@ class HistoryBook : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 // SYNTHETIC: LEGO1 0x100824b0 // HistoryBook::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/hospital.h b/LEGO1/lego/legoomni/include/hospital.h index 40f4f947..9f9c8e4c 100644 --- a/LEGO1/lego/legoomni/include/hospital.h +++ b/LEGO1/lego/legoomni/include/hospital.h @@ -37,7 +37,7 @@ class Hospital : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 inline void PlayAction(MxU32 p_objectId); diff --git a/LEGO1/lego/legoomni/include/infocenter.h b/LEGO1/lego/legoomni/include/infocenter.h index 04b56757..f0ed8697 100644 --- a/LEGO1/lego/legoomni/include/infocenter.h +++ b/LEGO1/lego/legoomni/include/infocenter.h @@ -67,7 +67,7 @@ class Infocenter : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 // SYNTHETIC: LEGO1 0x1006ec60 diff --git a/LEGO1/lego/legoomni/include/infocenterdoor.h b/LEGO1/lego/legoomni/include/infocenterdoor.h index 84854072..9cb0c49d 100644 --- a/LEGO1/lego/legoomni/include/infocenterdoor.h +++ b/LEGO1/lego/legoomni/include/infocenterdoor.h @@ -34,7 +34,7 @@ class InfocenterDoor : public LegoWorld { // FUNCTION: LEGO1 0x100377a0 MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 // SYNTHETIC: LEGO1 0x100378d0 diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 6242a828..372c20ab 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -57,7 +57,7 @@ class Isle : public LegoWorld { // FUNCTION: LEGO1 0x10033170 void VTable0x60() override {} // vtable+60 - MxBool VTable0x64() override; // vtable+64 + MxBool Escape() override; // vtable+64 void Enable(MxBool p_enable) override; // vtable+68 virtual void VTable0x6c(LegoPathActor* p_actor); // vtable+6c diff --git a/LEGO1/lego/legoomni/include/jetskirace.h b/LEGO1/lego/legoomni/include/jetskirace.h index 4d039f70..bb612ec7 100644 --- a/LEGO1/lego/legoomni/include/jetskirace.h +++ b/LEGO1/lego/legoomni/include/jetskirace.h @@ -22,7 +22,7 @@ class JetskiRace : public LegoRace { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 undefined4 VTable0x6c(undefined4) override; // vtable+0x6c undefined4 VTable0x70(undefined4) override; // vtable+0x70 undefined4 VTable0x74(undefined4) override; // vtable+0x74 diff --git a/LEGO1/lego/legoomni/include/jukebox.h b/LEGO1/lego/legoomni/include/jukebox.h index 260fb9a5..05618523 100644 --- a/LEGO1/lego/legoomni/include/jukebox.h +++ b/LEGO1/lego/legoomni/include/jukebox.h @@ -34,7 +34,7 @@ class JukeBox : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 // SYNTHETIC: LEGO1 0x1005d810 diff --git a/LEGO1/lego/legoomni/include/legoact2.h b/LEGO1/lego/legoomni/include/legoact2.h index c7dd6a35..b84fada3 100644 --- a/LEGO1/lego/legoomni/include/legoact2.h +++ b/LEGO1/lego/legoomni/include/legoact2.h @@ -14,7 +14,7 @@ class LegoAct2 : public LegoWorld { void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c void VTable0x60() override; // vtable+0x60 - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 inline void SetUnknown0x1150(undefined4 p_unk0x1150) { m_unk0x1150 = p_unk0x1150; } diff --git a/LEGO1/lego/legoomni/include/legocarbuild.h b/LEGO1/lego/legoomni/include/legocarbuild.h index 0d2eccc1..bd86964e 100644 --- a/LEGO1/lego/legoomni/include/legocarbuild.h +++ b/LEGO1/lego/legoomni/include/legocarbuild.h @@ -29,7 +29,7 @@ class LegoCarBuild : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 // SYNTHETIC: LEGO1 0x10022a60 diff --git a/LEGO1/lego/legoomni/include/legorace.h b/LEGO1/lego/legoomni/include/legorace.h index c8b02f2e..29e46cab 100644 --- a/LEGO1/lego/legoomni/include/legorace.h +++ b/LEGO1/lego/legoomni/include/legorace.h @@ -30,7 +30,7 @@ class LegoRace : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 virtual undefined4 VTable0x6c(undefined4) = 0; // vtable+0x6c virtual undefined4 VTable0x70(undefined4); // vtable+0x70 diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 15f103a8..2dd7321a 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -59,7 +59,7 @@ class LegoWorld : public LegoEntity { // FUNCTION: LEGO1 0x100010a0 virtual void VTable0x60() {} // vtable+0x60 - virtual MxBool VTable0x64(); // vtable+0x64 + virtual MxBool Escape(); // vtable+0x64 virtual void Enable(MxBool p_enable); // vtable+0x68 MxBool PresentersPending(); diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h index 4ba7ac20..3760f22a 100644 --- a/LEGO1/lego/legoomni/include/police.h +++ b/LEGO1/lego/legoomni/include/police.h @@ -36,7 +36,7 @@ class Police : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 // SYNTHETIC: LEGO1 0x1005e300 diff --git a/LEGO1/lego/legoomni/include/registrationbook.h b/LEGO1/lego/legoomni/include/registrationbook.h index 1266d29b..ee4e55f8 100644 --- a/LEGO1/lego/legoomni/include/registrationbook.h +++ b/LEGO1/lego/legoomni/include/registrationbook.h @@ -34,7 +34,7 @@ class RegistrationBook : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 inline void PlayAction(MxU32 p_objectId); diff --git a/LEGO1/lego/legoomni/include/score.h b/LEGO1/lego/legoomni/include/score.h index 71efd0f4..979fa33d 100644 --- a/LEGO1/lego/legoomni/include/score.h +++ b/LEGO1/lego/legoomni/include/score.h @@ -35,7 +35,7 @@ class Score : public LegoWorld { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 MxBool VTable0x5c() override; // vtable+0x5c - MxBool VTable0x64() override; // vtable+0x64 + MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 void Paint(); diff --git a/LEGO1/lego/legoomni/include/skateboard.h b/LEGO1/lego/legoomni/include/skateboard.h index c42d3fe0..60cadaa2 100644 --- a/LEGO1/lego/legoomni/include/skateboard.h +++ b/LEGO1/lego/legoomni/include/skateboard.h @@ -32,6 +32,8 @@ class SkateBoard : public IslePathActor { MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 void VTable0xe4() override; // vtable+0xe4 + inline void SetUnknown0x160(MxBool p_unk0x160) { m_unk0x160 = p_unk0x160; } + void ActivateSceneActions(); // SYNTHETIC: LEGO1 0x1000ff60 diff --git a/LEGO1/lego/legoomni/include/towtrack.h b/LEGO1/lego/legoomni/include/towtrack.h index 8e5ecfc0..add3a9f6 100644 --- a/LEGO1/lego/legoomni/include/towtrack.h +++ b/LEGO1/lego/legoomni/include/towtrack.h @@ -37,6 +37,8 @@ class TowTrack : public IslePathActor { void CreateState(); void FUN_1004dab0(); void FUN_1004dad0(); + void FUN_1004db10(); + void FUN_1004dbe0(); // SYNTHETIC: LEGO1 0x1004c950 // TowTrack::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/src/actors/ambulance.cpp b/LEGO1/lego/legoomni/src/actors/ambulance.cpp index 8f7f05d1..b6bc7584 100644 --- a/LEGO1/lego/legoomni/src/actors/ambulance.cpp +++ b/LEGO1/lego/legoomni/src/actors/ambulance.cpp @@ -140,3 +140,15 @@ MxResult Ambulance::Tickle() // TODO return SUCCESS; } + +// STUB: LEGO1 0x10037240 +void Ambulance::FUN_10037240() +{ + // TODO +} + +// STUB: LEGO1 0x10037250 +void Ambulance::FUN_10037250() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/actors/towtrack.cpp b/LEGO1/lego/legoomni/src/actors/towtrack.cpp index 2337fa4b..7cd6ee1b 100644 --- a/LEGO1/lego/legoomni/src/actors/towtrack.cpp +++ b/LEGO1/lego/legoomni/src/actors/towtrack.cpp @@ -119,3 +119,15 @@ void TowTrack::FUN_1004dad0() { // TODO } + +// STUB: LEGO1 0x1004db10 +void TowTrack::FUN_1004db10() +{ + // TODO +} + +// STUB: LEGO1 0x1004dbe0 +void TowTrack::FUN_1004dbe0() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp index 90d06155..f844aa08 100644 --- a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp +++ b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp @@ -56,7 +56,7 @@ void LegoCarBuild::Enable(MxBool p_enable) } // STUB: LEGO1 0x10025e70 -MxBool LegoCarBuild::VTable0x64() +MxBool LegoCarBuild::Escape() { // TODO return FALSE; diff --git a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp index d3d940d3..63377d72 100644 --- a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp +++ b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp @@ -619,7 +619,7 @@ MxLong LegoNavController::Notify(MxParam& p_param) if (currentWorld) { InfocenterState* infocenterState = (InfocenterState*) GameState()->GetState("InfocenterState"); - if (infocenterState && infocenterState->GetUnknown0x74() != 8 && currentWorld->VTable0x64()) { + if (infocenterState && infocenterState->GetUnknown0x74() != 8 && currentWorld->Escape()) { BackgroundAudioManager()->Stop(); TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); infocenterState->SetUnknown0x74(8); diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 2eb76ed2..b0cb72dd 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -53,7 +53,7 @@ MxBool LegoWorld::VTable0x5c() } // FUNCTION: LEGO1 0x1001d680 -MxBool LegoWorld::VTable0x64() +MxBool LegoWorld::Escape() { return FALSE; } diff --git a/LEGO1/lego/legoomni/src/race/carrace.cpp b/LEGO1/lego/legoomni/src/race/carrace.cpp index b45ff7ea..418a74c5 100644 --- a/LEGO1/lego/legoomni/src/race/carrace.cpp +++ b/LEGO1/lego/legoomni/src/race/carrace.cpp @@ -51,7 +51,7 @@ undefined4 CarRace::VTable0x78(undefined4) } // STUB: LEGO1 0x10017900 -MxBool CarRace::VTable0x64() +MxBool CarRace::Escape() { // TODO return FALSE; diff --git a/LEGO1/lego/legoomni/src/race/jetskirace.cpp b/LEGO1/lego/legoomni/src/race/jetskirace.cpp index a976724d..37fc198d 100644 --- a/LEGO1/lego/legoomni/src/race/jetskirace.cpp +++ b/LEGO1/lego/legoomni/src/race/jetskirace.cpp @@ -32,7 +32,7 @@ undefined4 JetskiRace::VTable0x70(undefined4) } // STUB: LEGO1 0x10016a10 -MxBool JetskiRace::VTable0x64() +MxBool JetskiRace::Escape() { return TRUE; } diff --git a/LEGO1/lego/legoomni/src/race/legorace.cpp b/LEGO1/lego/legoomni/src/race/legorace.cpp index 034d3af8..c7959fc7 100644 --- a/LEGO1/lego/legoomni/src/race/legorace.cpp +++ b/LEGO1/lego/legoomni/src/race/legorace.cpp @@ -57,7 +57,7 @@ undefined4 LegoRace::VTable0x74(undefined4) } // FUNCTION: LEGO1 0x10015b90 -MxBool LegoRace::VTable0x64() +MxBool LegoRace::Escape() { return FALSE; } diff --git a/LEGO1/lego/legoomni/src/worlds/act3.cpp b/LEGO1/lego/legoomni/src/worlds/act3.cpp index 8195e6c7..98f789da 100644 --- a/LEGO1/lego/legoomni/src/worlds/act3.cpp +++ b/LEGO1/lego/legoomni/src/worlds/act3.cpp @@ -88,7 +88,7 @@ void Act3::VTable0x60() } // STUB: LEGO1 0x10073e50 -MxBool Act3::VTable0x64() +MxBool Act3::Escape() { // TODO return FALSE; diff --git a/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp b/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp index b3184aff..32c9265a 100644 --- a/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp +++ b/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp @@ -133,7 +133,7 @@ void ElevatorBottom::Enable(MxBool p_enable) } // FUNCTION: LEGO1 0x10018310 -MxBool ElevatorBottom::VTable0x64() +MxBool ElevatorBottom::Escape() { DeleteObjects(&m_atom, 500, 999); m_destLocation = LegoGameState::e_infomain; diff --git a/LEGO1/lego/legoomni/src/worlds/gasstation.cpp b/LEGO1/lego/legoomni/src/worlds/gasstation.cpp index d32b32ab..e8a4d813 100644 --- a/LEGO1/lego/legoomni/src/worlds/gasstation.cpp +++ b/LEGO1/lego/legoomni/src/worlds/gasstation.cpp @@ -411,7 +411,7 @@ MxResult GasStation::Tickle() } // FUNCTION: LEGO1 0x10005e70 -MxBool GasStation::VTable0x64() +MxBool GasStation::Escape() { m_radio.Stop(); m_state->FUN_10006490(); diff --git a/LEGO1/lego/legoomni/src/worlds/historybook.cpp b/LEGO1/lego/legoomni/src/worlds/historybook.cpp index 56e09bed..bf01d00a 100644 --- a/LEGO1/lego/legoomni/src/worlds/historybook.cpp +++ b/LEGO1/lego/legoomni/src/worlds/historybook.cpp @@ -149,7 +149,7 @@ void HistoryBook::ReadyWorld() } // FUNCTION: LEGO1 0x10082a10 -MxBool HistoryBook::VTable0x64() +MxBool HistoryBook::Escape() { m_destLocation = LegoGameState::Area::e_infomain; return TRUE; diff --git a/LEGO1/lego/legoomni/src/worlds/hospital.cpp b/LEGO1/lego/legoomni/src/worlds/hospital.cpp index cbc86643..bc6b0386 100644 --- a/LEGO1/lego/legoomni/src/worlds/hospital.cpp +++ b/LEGO1/lego/legoomni/src/worlds/hospital.cpp @@ -662,7 +662,7 @@ MxResult Hospital::Tickle() } // FUNCTION: LEGO1 0x10076330 -MxBool Hospital::VTable0x64() +MxBool Hospital::Escape() { DeleteObjects(&m_atom, HospitalScript::c_hho002cl_RunAnim, 999); m_hospitalState->m_unk0x08.m_unk0x00 = 0; diff --git a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp index d5d68518..b88db8b5 100644 --- a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp @@ -1327,7 +1327,7 @@ void Infocenter::Reset() } // FUNCTION: LEGO1 0x10070f60 -MxBool Infocenter::VTable0x64() +MxBool Infocenter::Escape() { if (m_infocenterState != NULL) { MxU32 val = m_infocenterState->GetUnknown0x74(); diff --git a/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp b/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp index bc961368..7d205ce1 100644 --- a/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp +++ b/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp @@ -165,7 +165,7 @@ void InfocenterDoor::Enable(MxBool p_enable) } // FUNCTION: LEGO1 0x10037cd0 -MxBool InfocenterDoor::VTable0x64() +MxBool InfocenterDoor::Escape() { DeleteObjects(&m_atom, 500, 510); m_destLocation = LegoGameState::e_infomain; diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 38e0fa5a..37a00ede 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -1116,11 +1116,61 @@ void Isle::CreateState() } } -// STUB: LEGO1 0x10033180 -MxBool Isle::VTable0x64() +// FUNCTION: LEGO1 0x10033180 +MxBool Isle::Escape() { - // TODO - return FALSE; + m_radio.Stop(); + BackgroundAudioManager()->Stop(); + + switch (m_act1state->m_unk0x018) { + case 3: + if (CurrentActor() != NULL) { + m_pizza->FUN_10038380(); + m_pizza->FUN_100382b0(); + } + break; + case 8: + if (CurrentActor() != NULL && !CurrentActor()->IsA("TowTrack")) { + m_towtrack->FUN_1004db10(); + m_towtrack->FUN_1004dbe0(); + } + break; + case 10: + if (CurrentActor() != NULL && !CurrentActor()->IsA("Ambulance")) { + m_ambulance->FUN_10037240(); + m_ambulance->FUN_10037250(); + } + break; + } + + if (m_act1state->m_unk0x01e == TRUE) { + InvokeAction(Extra::e_stop, *g_isleScript, IsleScript::c_Floor2, NULL); + m_act1state->m_unk0x01e = FALSE; + } + + m_act1state->m_elevFloor = Act1State::c_floor1; + + AnimationManager()->FUN_10061010(FALSE); + DeleteObjects(&m_atom, IsleScript::c_sba001bu_RunAnim, IsleScript::c_FNS018EN_Wav_518); + + if (CurrentActor()) { + if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { + ((IslePathActor*) CurrentActor())->VTable0xe4(); + m_skateboard->SetUnknown0x160(FALSE); + } + } + + if (GameState()->m_currentArea == LegoGameState::e_polidoor) { + VariableTable()->SetVariable("VISIBILITY", "Show Policsta"); + } + + if (GameState()->m_currentArea == LegoGameState::e_garadoor) { + VariableTable()->SetVariable("VISIBILITY", "Show Gas"); + } + + m_act1state->m_unk0x018 = 0; + m_destLocation = LegoGameState::e_infomain; + return TRUE; } // STUB: LEGO1 0x10033350 diff --git a/LEGO1/lego/legoomni/src/worlds/jukebox.cpp b/LEGO1/lego/legoomni/src/worlds/jukebox.cpp index 257db67b..ac284815 100644 --- a/LEGO1/lego/legoomni/src/worlds/jukebox.cpp +++ b/LEGO1/lego/legoomni/src/worlds/jukebox.cpp @@ -255,7 +255,7 @@ MxResult JukeBox::Tickle() } // FUNCTION: LEGO1 0x1005de70 -MxBool JukeBox::VTable0x64() +MxBool JukeBox::Escape() { m_destLocation = LegoGameState::e_infomain; return TRUE; diff --git a/LEGO1/lego/legoomni/src/worlds/legoact2.cpp b/LEGO1/lego/legoomni/src/worlds/legoact2.cpp index 43c05750..cc108d10 100644 --- a/LEGO1/lego/legoomni/src/worlds/legoact2.cpp +++ b/LEGO1/lego/legoomni/src/worlds/legoact2.cpp @@ -48,7 +48,7 @@ void LegoAct2::VTable0x60() } // STUB: LEGO1 0x100519d0 -MxBool LegoAct2::VTable0x64() +MxBool LegoAct2::Escape() { // TODO return FALSE; diff --git a/LEGO1/lego/legoomni/src/worlds/police.cpp b/LEGO1/lego/legoomni/src/worlds/police.cpp index 1cf8f879..cf1396b8 100644 --- a/LEGO1/lego/legoomni/src/worlds/police.cpp +++ b/LEGO1/lego/legoomni/src/worlds/police.cpp @@ -190,7 +190,7 @@ void Police::Enable(MxBool p_enable) } // FUNCTION: LEGO1 0x1005e790 -MxBool Police::VTable0x64() +MxBool Police::Escape() { DeleteObjects(&m_atom, PoliceScript::c_nps001ni_RunAnim, 510); m_destLocation = LegoGameState::e_infomain; diff --git a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp index 29802f23..bb325a8f 100644 --- a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp +++ b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp @@ -493,7 +493,7 @@ MxBool RegistrationBook::CreateSurface() } // FUNCTION: LEGO1 0x100783e0 -MxBool RegistrationBook::VTable0x64() +MxBool RegistrationBook::Escape() { DeleteObjects(&m_atom, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav); return TRUE; diff --git a/LEGO1/lego/legoomni/src/worlds/score.cpp b/LEGO1/lego/legoomni/src/worlds/score.cpp index 0bb40ea7..f8bea176 100644 --- a/LEGO1/lego/legoomni/src/worlds/score.cpp +++ b/LEGO1/lego/legoomni/src/worlds/score.cpp @@ -312,7 +312,7 @@ void Score::FillArea(MxU32 i_activity, MxU32 i_actor, MxS16 score) } // FUNCTION: LEGO1 0x10001e40 -MxBool Score::VTable0x64() +MxBool Score::Escape() { DeleteScript(); m_destLocation = LegoGameState::e_infomain; From 715acd657d30d120182ca65fd9670b7ebfb0e3d7 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 24 May 2024 21:14:45 -0400 Subject: [PATCH 06/28] Implement/match Isle::FUN_10033350 (#951) --- LEGO1/lego/legoomni/src/worlds/isle.cpp | 42 +++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 37a00ede..8c2bc113 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -1173,8 +1173,46 @@ MxBool Isle::Escape() return TRUE; } -// STUB: LEGO1 0x10033350 +// FUNCTION: LEGO1 0x10033350 void Isle::FUN_10033350() { - // TODO + if (m_act1state->m_unk0x018 == 10) { + if (CurrentActor() != NULL && !CurrentActor()->IsA("Ambulance")) { + m_ambulance->FUN_10037240(); + m_ambulance->FUN_10037250(); + } + } + + if (m_act1state->m_unk0x018 == 8) { + if (CurrentActor() != NULL && !CurrentActor()->IsA("TowTrack")) { + m_towtrack->FUN_1004db10(); + m_towtrack->FUN_1004dbe0(); + } + } + + if (m_act1state->m_unk0x018 == 3) { + if (CurrentActor() != NULL) { + m_pizza->FUN_10038380(); + m_pizza->FUN_100382b0(); + } + } + + AnimationManager()->FUN_10061010(FALSE); + + if (CurrentActor()) { + if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { + ((IslePathActor*) CurrentActor())->VTable0xe4(); + m_skateboard->SetUnknown0x160(FALSE); + } + } + + if (GameState()->m_currentArea == LegoGameState::e_polidoor) { + VariableTable()->SetVariable("VISIBILITY", "Show Policsta"); + } + + if (GameState()->m_currentArea == LegoGameState::e_garadoor) { + VariableTable()->SetVariable("VISIBILITY", "Show Gas"); + } + + m_destLocation = LegoGameState::e_infomain; } From 7c9fdd255effb8f8de6c1ff79cf9eb8409594da1 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 24 May 2024 21:23:41 -0400 Subject: [PATCH 07/28] Implement/match Isle::HandleType19Notification (#952) * Implement/match Isle::HandleType19Notification * Fix --- LEGO1/lego/legoomni/include/isle.h | 21 ++++--- .../legoomni/include/legoanimationmanager.h | 1 + .../src/common/legoanimationmanager.cpp | 19 ++++++ LEGO1/lego/legoomni/src/worlds/isle.cpp | 63 +++++++++++++++++-- .../omni/include/mxtype19notificationparam.h | 6 +- 5 files changed, 94 insertions(+), 16 deletions(-) diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 372c20ab..878cef90 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -6,19 +6,20 @@ #include "legoworld.h" #include "radio.h" -class Pizza; -class Pizzeria; -class TowTrack; +class Act1State; class Ambulance; -class JukeBoxEntity; -class Helicopter; class Bike; class DuneBuggy; -class Motocycle; -class SkateBoard; -class RaceCar; +class Helicopter; class Jetski; -class Act1State; +class JukeBoxEntity; +class Motocycle; +class MxType19NotificationParam; +class Pizza; +class Pizzeria; +class RaceCar; +class SkateBoard; +class TowTrack; // VTABLE: LEGO1 0x100d6fb8 // SIZE 0x140 @@ -71,7 +72,7 @@ class Isle : public LegoWorld { protected: MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleClick(LegoControlManagerEvent& p_param); - MxLong HandleType19Notification(MxParam& p_param); + MxLong HandleType19Notification(MxType19NotificationParam& p_param); MxLong HandleTransitionEnd(); void HandleElevatorEndAction(); void UpdateGlobe(); diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index 52aeb7c6..88f304e8 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -112,6 +112,7 @@ class LegoAnimationManager : public MxCore { void FUN_10063780(LegoROIList* p_list); MxResult FUN_10064670(Vector3* p_position); MxResult FUN_10064740(Vector3* p_position); + MxResult FUN_10064880(const char* p_name, MxS32 p_unk0x0c, MxS32 p_unk0x10); static void configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig); diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp index 95df6202..04c86576 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp @@ -2411,6 +2411,25 @@ MxResult LegoAnimationManager::FUN_10064740(Vector3* p_position) return FAILURE; } +// FUNCTION: LEGO1 0x10064880 +// FUNCTION: BETA10 0x10045d02 +MxResult LegoAnimationManager::FUN_10064880(const char* p_name, MxS32 p_unk0x0c, MxS32 p_unk0x10) +{ + for (MxS32 i = 0; i < (MxS32) sizeOfArray(m_extras); i++) { + LegoROI* roi = m_extras[i].m_roi; + + if (roi != NULL) { + if (!strcmpi(roi->GetName(), p_name)) { + g_characters[m_extras[i].m_characterId].m_unk0x0c = p_unk0x0c; + g_characters[m_extras[i].m_characterId].m_unk0x10 = p_unk0x10; + return SUCCESS; + } + } + } + + return FAILURE; +} + // STUB: LEGO1 0x100648f0 // FUNCTION: BETA10 0x10045daf void LegoAnimationManager::FUN_100648f0(LegoTranInfo*, MxLong) diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 8c2bc113..9e692616 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -29,6 +29,7 @@ #include "mxnotificationmanager.h" #include "mxstillpresenter.h" #include "mxtransitionmanager.h" +#include "mxtype19notificationparam.h" #include "mxvariabletable.h" #include "pizza.h" #include "pizzeria.h" @@ -158,7 +159,7 @@ MxLong Isle::Notify(MxParam& p_param) } break; case c_notificationType19: - result = HandleType19Notification(p_param); + result = HandleType19Notification((MxType19NotificationParam&) p_param); break; case c_notificationType20: Enable(TRUE); @@ -458,10 +459,64 @@ void Isle::UpdateGlobe() } } -// STUB: LEGO1 0x100315f0 -MxLong Isle::HandleType19Notification(MxParam& p_param) +// FUNCTION: LEGO1 0x100315f0 +MxLong Isle::HandleType19Notification(MxType19NotificationParam& p_param) { - return 0; + MxLong result = 0; + + if (CurrentActor() != NULL) { + if (CurrentActor() == m_dunebuggy) { + result = m_dunebuggy->Notify(p_param); + } + else if (CurrentActor() == m_motocycle) { + result = m_motocycle->Notify(p_param); + } + } + + switch (m_act1state->m_unk0x018) { + case 3: + result = m_pizza->Notify(p_param); + break; + case 8: + result = m_towtrack->Notify(p_param); + break; + case 10: + result = m_ambulance->Notify(p_param); + break; + } + + if (result == 0) { + switch (p_param.GetUnknown0x0c()) { + case 0x12c: + AnimationManager()->FUN_10064670(NULL); + result = 1; + break; + case 0x12d: + AnimationManager()->FUN_10064880("brickstr", 0, 20000); + result = 1; + break; + case 0x131: + if (m_act1state->m_unk0x018 != 10) { + AnimationManager()->FUN_10064740(FALSE); + } + result = 1; + break; + case 0x132: + AnimationManager()->FUN_10064880("mama", 0, 20000); + AnimationManager()->FUN_10064880("papa", 0, 20000); + result = 1; + break; + case 0x136: + LegoEntity* bouy = (LegoEntity*) Find("MxEntity", "bouybump"); + if (bouy != NULL) { + NotificationManager()->Send(bouy, LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + } + result = 1; + break; + } + } + + return result; } // FUNCTION: LEGO1 0x10031820 diff --git a/LEGO1/omni/include/mxtype19notificationparam.h b/LEGO1/omni/include/mxtype19notificationparam.h index 0833f299..2a44e2ac 100644 --- a/LEGO1/omni/include/mxtype19notificationparam.h +++ b/LEGO1/omni/include/mxtype19notificationparam.h @@ -8,7 +8,7 @@ // SIZE 0x10 class MxType19NotificationParam : public MxNotificationParam { public: - MxType19NotificationParam(NotificationId p_type, MxCore* p_sender, MxU8 p_unk0x0e, MxU16 p_unk0x0c) + MxType19NotificationParam(NotificationId p_type, MxCore* p_sender, MxU8 p_unk0x0e, MxS16 p_unk0x0c) : MxNotificationParam() { m_type = p_type; @@ -23,8 +23,10 @@ class MxType19NotificationParam : public MxNotificationParam { return new MxType19NotificationParam(m_type, m_sender, m_unk0x0e, m_unk0x0c); } // vtable+0x04 + inline MxS16 GetUnknown0x0c() { return m_unk0x0c; } + protected: - MxU16 m_unk0x0c; // 0x0c + MxS16 m_unk0x0c; // 0x0c MxU8 m_unk0x0e; // 0x0e }; From 857c15ca119b97f973d4f8838d57b0d92868f721 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 25 May 2024 10:40:10 -0400 Subject: [PATCH 08/28] Implement/match LegoAnimationManager::FUN_10063b90 (#953) --- .../legoomni/include/legoanimationmanager.h | 2 +- .../legoomni/include/legocharactermanager.h | 2 +- LEGO1/lego/legoomni/include/legocharacters.h | 2 +- .../src/common/legoanimationmanager.cpp | 78 +++++++++++++++---- .../src/common/legocharactermanager.cpp | 12 +-- 5 files changed, 73 insertions(+), 23 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index 88f304e8..087e3f86 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -152,7 +152,7 @@ class LegoAnimationManager : public MxCore { MxBool FUN_10062650(Vector3& p_position, float p_und, LegoROI* p_roi); MxBool FUN_10062710(AnimInfo& p_info); void FUN_10063aa0(); - MxBool FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_actor, MxU8 p_unk0x14, MxU32 p_characterId); + MxBool FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_actor, MxU8 p_mood, MxU32 p_characterId); void FUN_10063d10(); MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world); MxBool FUN_10064010(LegoPathBoundary* p_boundary, LegoUnknown100db7f4* p_edge, float p_destScale); diff --git a/LEGO1/lego/legoomni/include/legocharactermanager.h b/LEGO1/lego/legoomni/include/legocharactermanager.h index aaeb584d..f92bdd76 100644 --- a/LEGO1/lego/legoomni/include/legocharactermanager.h +++ b/LEGO1/lego/legoomni/include/legocharactermanager.h @@ -71,7 +71,7 @@ class LegoCharacterManager { LegoCharacterInfo* GetInfo(LegoROI* p_roi); MxBool SwitchHat(LegoROI* p_roi); MxU32 FUN_10085140(LegoROI* p_roi, MxBool p_und); - MxU8 FUN_10085180(LegoROI* p_roi); + MxU8 GetMood(LegoROI* p_roi); LegoROI* FUN_10085210(const char* p_name, const char* p_lodName, MxBool p_createEntity); LegoROI* FUN_10085a80(const char* p_name, const char* p_lodName, MxBool p_createEntity); diff --git a/LEGO1/lego/legoomni/include/legocharacters.h b/LEGO1/lego/legoomni/include/legocharacters.h index 313a49e4..c21d81c7 100644 --- a/LEGO1/lego/legoomni/include/legocharacters.h +++ b/LEGO1/lego/legoomni/include/legocharacters.h @@ -24,7 +24,7 @@ struct LegoCharacterInfo { LegoExtraActor* m_actor; // 0x08 MxS32 m_unk0x0c; // 0x0c MxS32 m_unk0x10; // 0x10 - MxU8 m_unk0x14; // 0x14 + MxU8 m_mood; // 0x14 Part m_parts[10]; // 0x18 }; diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp index 04c86576..c3a939fe 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp @@ -51,7 +51,7 @@ LegoAnimationManager::Vehicle g_vehicles[] = { }; // GLOBAL: LEGO1 0x100f6d58 -const char* g_unk0x100f6d58[11][17] = { +const char* g_cycles[11][17] = { {"CNs001xx", "CNs002xx", "CNs003xx", @@ -1973,7 +1973,7 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und) if (FUN_10063b90( world, actor, - CharacterManager()->FUN_10085180(m_extras[i].m_roi), + CharacterManager()->GetMood(m_extras[i].m_roi), m_lastExtraCharacterId )) { m_extras[i].m_unk0x14 = TRUE; @@ -2064,17 +2064,67 @@ void LegoAnimationManager::FUN_10063aa0() } } -// STUB: LEGO1 0x10063b90 +// FUNCTION: LEGO1 0x10063b90 // FUNCTION: BETA10 0x10044d46 -MxBool LegoAnimationManager::FUN_10063b90( - LegoWorld* p_world, - LegoExtraActor* p_actor, - MxU8 p_unk0x14, - MxU32 p_characterId -) +MxBool LegoAnimationManager::FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_actor, MxU8 p_mood, MxU32 p_characterId) { - // TODO - return TRUE; + const char** cycles = g_cycles[g_characters[p_characterId].m_unk0x16]; + const char* vehicleWC; + + if (g_characters[p_characterId].m_vehicleId >= 0 && g_vehicles[g_characters[p_characterId].m_vehicleId].m_unk0x04 && + (vehicleWC = cycles[10]) != NULL) { + LegoLocomotionAnimPresenter* presenter = + (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC); + + if (presenter != NULL) { + presenter->FUN_1006d680(p_actor, 1.7f); + } + + g_vehicles[g_characters[p_characterId].m_vehicleId].m_unk0x04 = FALSE; + g_vehicles[g_characters[p_characterId].m_vehicleId].m_unk0x05 = TRUE; + return TRUE; + } + else { + vehicleWC = cycles[p_mood]; + if (vehicleWC != NULL) { + LegoLocomotionAnimPresenter* presenter = + (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC); + + if (presenter != NULL) { + presenter->FUN_1006d680(p_actor, 0.7f); + } + } + + if (p_mood >= 2) { + p_mood--; + } + + vehicleWC = cycles[p_mood + 4]; + if (vehicleWC != NULL) { + LegoLocomotionAnimPresenter* presenter = + (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC); + + if (presenter != NULL) { + presenter->FUN_1006d680(p_actor, 4.0f); + } + } + + if (p_mood >= 1) { + p_mood--; + } + + vehicleWC = cycles[p_mood + 7]; + if (vehicleWC != NULL) { + LegoLocomotionAnimPresenter* presenter = + (LegoLocomotionAnimPresenter*) p_world->Find("LegoAnimPresenter", vehicleWC); + + if (presenter != NULL) { + presenter->FUN_1006d680(p_actor, 0.0f); + } + } + + return FALSE; + } } // FUNCTION: LEGO1 0x10063d10 @@ -2329,15 +2379,15 @@ MxResult LegoAnimationManager::FUN_10064380( } MxS32 characterId = m_extras[i].m_characterId; - const char** unk0x100f6d58 = g_unk0x100f6d58[g_characters[characterId].m_unk0x16]; + const char** cycles = g_cycles[g_characters[characterId].m_unk0x16]; LegoLocomotionAnimPresenter* presenter = - (LegoLocomotionAnimPresenter*) world->Find("LegoAnimPresenter", unk0x100f6d58[p_undIdx1]); + (LegoLocomotionAnimPresenter*) world->Find("LegoAnimPresenter", cycles[p_undIdx1]); if (presenter != NULL) { presenter->FUN_1006d680(actor, 0.0f); } - presenter = (LegoLocomotionAnimPresenter*) world->Find("LegoAnimPresenter", unk0x100f6d58[p_undIdx2]); + presenter = (LegoLocomotionAnimPresenter*) world->Find("LegoAnimPresenter", cycles[p_undIdx2]); if (presenter != NULL) { presenter->FUN_1006d680(actor, 4.0f); } diff --git a/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp b/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp index 856ff777..9f409bfb 100644 --- a/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legocharactermanager.cpp @@ -116,7 +116,7 @@ MxResult LegoCharacterManager::Write(LegoStorage* p_storage) if (p_storage->Write(&info->m_unk0x10, sizeof(info->m_unk0x10)) != SUCCESS) { goto done; } - if (p_storage->Write(&info->m_unk0x14, sizeof(info->m_unk0x14)) != SUCCESS) { + if (p_storage->Write(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { goto done; } if (p_storage->Write(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(info->m_parts[c_infohatPart].m_unk0x08)) != @@ -171,7 +171,7 @@ MxResult LegoCharacterManager::Read(LegoStorage* p_storage) if (p_storage->Read(&info->m_unk0x10, sizeof(info->m_unk0x10)) != SUCCESS) { goto done; } - if (p_storage->Read(&info->m_unk0x14, sizeof(info->m_unk0x14)) != SUCCESS) { + if (p_storage->Read(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) { goto done; } if (p_storage->Read(&info->m_parts[c_infohatPart].m_unk0x08, sizeof(info->m_parts[c_infohatPart].m_unk0x08)) != @@ -449,7 +449,7 @@ LegoROI* LegoCharacterManager::CreateROI(const char* p_key) info->m_unk0x0c = pepper->m_unk0x0c; info->m_unk0x10 = pepper->m_unk0x10; - info->m_unk0x14 = pepper->m_unk0x14; + info->m_mood = pepper->m_mood; for (i = 0; i < sizeOfArray(info->m_parts); i++) { info->m_parts[i] = pepper->m_parts[i]; @@ -760,7 +760,7 @@ MxU32 LegoCharacterManager::FUN_10085140(LegoROI* p_roi, MxBool p_und) LegoCharacterInfo* info = GetInfo(p_roi); if (p_und) { - return info->m_unk0x14 + g_unk0x100fc4dc; + return info->m_mood + g_unk0x100fc4dc; } if (info != NULL) { @@ -772,12 +772,12 @@ MxU32 LegoCharacterManager::FUN_10085140(LegoROI* p_roi, MxBool p_und) // FUNCTION: LEGO1 0x10085180 // FUNCTION: BETA10 0x100768c5 -MxU8 LegoCharacterManager::FUN_10085180(LegoROI* p_roi) +MxU8 LegoCharacterManager::GetMood(LegoROI* p_roi) { LegoCharacterInfo* info = GetInfo(p_roi); if (info != NULL) { - return info->m_unk0x14; + return info->m_mood; } return 0; From f380fa3b84287bd030a039d9bc83cd6e5604080e Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 25 May 2024 11:18:24 -0400 Subject: [PATCH 09/28] Implement/match LegoAnimationManager::FUN_100648f0 (#954) --- .../legoomni/include/legoanimationmanager.h | 2 +- LEGO1/lego/legoomni/src/actors/helicopter.cpp | 6 +- .../src/common/legoanimationmanager.cpp | 40 +++++++++++-- LEGO1/lego/sources/anim/legoanim.cpp | 6 +- LEGO1/mxgeometry/mxgeometry3d.h | 56 +++++++++++++++++-- 5 files changed, 92 insertions(+), 18 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index 087e3f86..b25b2510 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -170,7 +170,7 @@ class LegoAnimationManager : public MxCore { MxS32 p_unk0x10, float p_speed ); - void FUN_100648f0(LegoTranInfo*, MxLong); + void FUN_100648f0(LegoTranInfo* p_tranInfo, MxLong p_unk0x404); void FUN_10064b50(MxLong p_time); MxS32 m_scriptIndex; // 0x08 diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index 06eba4e0..d3b3ef51 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -378,11 +378,7 @@ void Helicopter::VTable0x70(float p_float) Vector3 v2(m_unk0x1a8[3]); float* loc = m_unk0x1a8[3]; mat.SetIdentity(); - float fa[4]; - Vector4 v3(fa); - if (m_unk0x1f4.FUN_100040a0(v3, f2) == SUCCESS) { - mat.FromQuaternion(v3); - } + m_unk0x1f4.Unknown6(mat, f2); v2.SetVector(loc); v2.Sub(&v); v2.Mul(f2); diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp index c3a939fe..2d780d0a 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp @@ -25,6 +25,7 @@ #include "mxticklemanager.h" #include "mxtimer.h" #include "mxutilities.h" +#include "realtime/realtime.h" #include "viewmanager/viewmanager.h" #include @@ -2480,11 +2481,42 @@ MxResult LegoAnimationManager::FUN_10064880(const char* p_name, MxS32 p_unk0x0c, return FAILURE; } -// STUB: LEGO1 0x100648f0 +// FUNCTION: LEGO1 0x100648f0 // FUNCTION: BETA10 0x10045daf -void LegoAnimationManager::FUN_100648f0(LegoTranInfo*, MxLong) +void LegoAnimationManager::FUN_100648f0(LegoTranInfo* p_tranInfo, MxLong p_unk0x404) { - // TODO + if (m_unk0x402 && p_tranInfo->m_unk0x14) { + p_tranInfo->m_flags |= LegoTranInfo::c_bit1; + m_unk0x430 = TRUE; + m_unk0x42c = p_tranInfo; + m_unk0x434 = p_unk0x404; + m_unk0x438 = p_unk0x404 + 1000; + + ViewROI* viewROI = VideoManager()->GetViewROI(); + m_unk0x43c = viewROI->GetLocal2World(); + p_tranInfo->m_unk0x2c = m_unk0x43c; + + LegoPathActor* actor = CurrentActor(); + if (actor != NULL) { + actor->SetState(4); + actor->SetWorldSpeed(0.0f); + } + + LegoLocation* location = NavController()->GetLocation(p_tranInfo->m_location); + if (location != NULL) { + CalcLocalTransform(location->m_position, location->m_direction, location->m_up, m_unk0x484); + m_unk0x4cc.Unknown1(m_unk0x43c, m_unk0x484); + m_unk0x4cc.Unknown7(); + } + else { + p_tranInfo->m_flags &= ~LegoTranInfo::c_bit1; + m_unk0x430 = FALSE; + } + + Mx3DPointFloat vec; + vec.Clear(); + viewROI->FUN_100a5a30(vec); + } } // FUNCTION: LEGO1 0x10064b50 @@ -2508,7 +2540,7 @@ void LegoAnimationManager::FUN_10064b50(MxLong p_time) sub[1] = (m_unk0x484[3][1] - m_unk0x43c[3][1]) * und; sub[2] = (m_unk0x484[3][2] - m_unk0x43c[3][2]) * und; - m_unk0x4cc.Unknown_100040a0(mat, (float) (p_time - m_unk0x434) / 1000.0f); + m_unk0x4cc.Unknown6(mat, (float) (p_time - m_unk0x434) / 1000.0f); VPV3(mat[3], m_unk0x43c[3], sub); mat[3][4] = 1.0f; diff --git a/LEGO1/lego/sources/anim/legoanim.cpp b/LEGO1/lego/sources/anim/legoanim.cpp index 92de53ae..4be46ae4 100644 --- a/LEGO1/lego/sources/anim/legoanim.cpp +++ b/LEGO1/lego/sources/anim/legoanim.cpp @@ -572,9 +572,9 @@ inline void LegoAnimNodeData::GetTranslation( c[3] = p_rotationKeys[i + 1].GetAngle(); } - b.Unknown1(a); - b.Unknown2(c); - b.Unknown_100040a0( + b.Unknown4(a); + b.Unknown5(c); + b.Unknown6( p_matrix, (p_time - p_rotationKeys[i].GetTime()) / (p_rotationKeys[i + 1].GetTime() - p_rotationKeys[i].GetTime()) ); diff --git a/LEGO1/mxgeometry/mxgeometry3d.h b/LEGO1/mxgeometry/mxgeometry3d.h index bd4cc24a..970695bb 100644 --- a/LEGO1/mxgeometry/mxgeometry3d.h +++ b/LEGO1/mxgeometry/mxgeometry3d.h @@ -65,6 +65,9 @@ class Mx4DPointFloat : public Vector4 { inline float& operator[](int idx) { return m_data[idx]; } inline const float& operator[](int idx) const { return m_data[idx]; } + // SYNTHETIC: LEGO1 0x10064b20 + // Mx4DPointFloat::operator= + private: float m_elements[4]; // 0x08 }; @@ -79,29 +82,54 @@ class UnknownMx4DPointFloat { UnknownMx4DPointFloat() : m_unk0x30(0) {} - inline void Unknown1(Vector4& p_v) + // FUNCTION: BETA10 0x1004a9b0 + inline void Unknown1(Matrix4& p_m1, Matrix4& p_m2) + { + Unknown2(p_m1); + Unknown3(p_m2); + } + + // FUNCTION: BETA10 0x1004a9f0 + inline void Unknown2(Matrix4& p_m) + { + p_m.ToQuaternion(m_unk0x00); + m_unk0x30 |= c_bit1; + } + + // FUNCTION: BETA10 0x1004aa30 + inline void Unknown3(Matrix4& p_m) + { + p_m.ToQuaternion(m_unk0x18); + m_unk0x30 |= c_bit2; + } + + // FUNCTION: BETA10 0x10180b80 + inline void Unknown4(Vector4& p_v) { m_unk0x00 = p_v; m_unk0x30 |= c_bit1; } - inline void Unknown2(Vector4& p_v) + // FUNCTION: BETA10 0x10180bc0 + inline void Unknown5(Vector4& p_v) { m_unk0x18 = p_v; m_unk0x30 |= c_bit2; } - inline int Unknown_100040a0(Matrix4& p_matrix, float p_f); - inline int FUN_100040a0(Vector4& p_v, float p_f); + inline int Unknown6(Matrix4& p_matrix, float p_f); + inline void Unknown7(); private: + inline int FUN_100040a0(Vector4& p_v, float p_f); + Mx4DPointFloat m_unk0x00; // 0x00 Mx4DPointFloat m_unk0x18; // 0x18 undefined4 m_unk0x30; // 0x30 }; // FUNCTION: BETA10 0x1004aaa0 -int UnknownMx4DPointFloat::Unknown_100040a0(Matrix4& p_matrix, float p_f) +int UnknownMx4DPointFloat::Unknown6(Matrix4& p_matrix, float p_f) { float data[4]; Vector4 v(data); @@ -114,6 +142,24 @@ int UnknownMx4DPointFloat::Unknown_100040a0(Matrix4& p_matrix, float p_f) } } +inline void UnknownMx4DPointFloat::Unknown7() +{ + if (m_unk0x30) { + Mx4DPointFloat v1; + Mx4DPointFloat v2; + + v1 = m_unk0x00; + ((Vector4&) v1).Add(&m_unk0x18); + + v2 = m_unk0x00; + ((Vector4&) v2).Sub(&m_unk0x18); + + if (v1.Dot(&v1, &v1) < v2.Dot(&v2, &v2)) { + ((Vector4&) m_unk0x18).Mul(-1.0f); + } + } +} + // FUNCTION: LEGO1 0x100040a0 // FUNCTION: BETA10 0x1004ab10 inline int UnknownMx4DPointFloat::FUN_100040a0(Vector4& p_v, float p_f) From 535f1b973a56fbe88ef10c958c420b512765db3e Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 25 May 2024 16:21:05 -0400 Subject: [PATCH 10/28] Implement LegoROI::FUN_100a9410 (#955) * WIP * WIP * Remove space * Fix --- .../legoomni/src/video/legoanimpresenter.cpp | 3 +- LEGO1/lego/sources/roi/legoroi.cpp | 140 +++++++++++++++++- LEGO1/lego/sources/roi/legoroi.h | 2 +- 3 files changed, 140 insertions(+), 5 deletions(-) diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index 747cbf4e..b463240c 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -1129,7 +1129,8 @@ MxU32 LegoAnimPresenter::VTable0x94(Vector3& p_vec1, Vector3& p_vec2, float p_f1 return TRUE; } - if (m_unk0xa4 + p_f2 >= sqrt(len) && m_roiMapSize != 0 && m_roiMap != NULL) { + len = sqrt(len); + if (len <= m_unk0xa4 + p_f2 && m_roiMapSize != 0 && m_roiMap != NULL) { for (MxU32 i = 1; i <= m_roiMapSize; i++) { if (m_roiMap[i]->GetLODCount() != 0 && m_roiMap[i]->FUN_100a9410(p_vec1, p_vec2, p_f1, p_f2, p_vec3, FALSE)) { diff --git a/LEGO1/lego/sources/roi/legoroi.cpp b/LEGO1/lego/sources/roi/legoroi.cpp index 33fbbb8e..35e0231a 100644 --- a/LEGO1/lego/sources/roi/legoroi.cpp +++ b/LEGO1/lego/sources/roi/legoroi.cpp @@ -551,9 +551,143 @@ LegoResult LegoROI::GetTexture(LegoTextureInfo*& p_textureInfo) return FAILURE; } -// STUB: LEGO1 0x100a9410 -LegoU32 LegoROI::FUN_100a9410(Vector3&, Vector3&, float, float, Vector3&, LegoBool) +// FUNCTION: LEGO1 0x100a9410 +// FUNCTION: BETA10 0x1018b324 +LegoU32 LegoROI::FUN_100a9410( + Vector3& p_v1, + Vector3& p_v2, + float p_f1, + float p_f2, + Vector3& p_v3, + LegoBool p_collideBox +) { + if (p_collideBox) { + Mx3DPointFloat v2(p_v1); + ((Vector3&) v2).Mul(p_f1); + ((Vector3&) v2).Add(&p_v1); + + Mx4DPointFloat localc0; + Mx4DPointFloat local9c; + Mx4DPointFloat local168; + Mx4DPointFloat local70; + Mx4DPointFloat local150[6]; + + Vector3 local58(&localc0[0]); + Vector3 locala8(&local9c[0]); + Vector3 local38(&local168[0]); + + Mx3DPointFloat local4c(p_v1); + + local58 = m_unk0x80.Min(); + locala8 = m_unk0x80.Max(); + + localc0[3] = local9c[3] = local168[3] = 1.0f; + + local38 = local58; + ((Vector3&) local38).Add(&locala8); + ((Vector3&) local38).Mul(0.5f); + + local70 = localc0; + localc0.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); + + local70 = local9c; + local9c.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); + + local70 = local168; + local168.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); + + p_v3 = m_local2world[3]; + + LegoS32 i; + for (i = 0; i < 6; i++) { + local150[i] = m_local2world[i % 3]; + + if (i > 2) { + local150[i][3] = -local58.Dot(&local58, &local150[i]); + } + else { + local150[i][3] = -locala8.Dot(&locala8, &local150[i]); + } + + if (local150[i][3] + local38.Dot(&local38, &local150[i]) < 0.0f) { + ((Vector4&) local150[i]).Mul(-1.0f); + } + } + + for (i = 0; i < 6; i++) { + float local50 = p_v2.Dot(&p_v2, &local150[i]); + + if (local50 >= 0.01 || local50 < -0.01) { + local50 = -((local150[i][3] + local4c.Dot(&local4c, &local150[i])) / local50); + + if (local50 >= 0.0f && local50 <= p_f1) { + Mx3DPointFloat local17c(p_v2); + ((Vector3&) local17c).Mul(local50); + ((Vector3&) local17c).Add(&local4c); + + LegoS32 j; + for (j = 0; j < 6; j++) { + if (i != j && i - j != 3 && j - i != 3) { + if (local150[j][3] + local17c.Dot(&local17c, &local150[j]) < 0.0f) { + break; + } + } + } + + if (j == 6) { + return 1; + } + } + } + } + } + else { + Mx3DPointFloat v1(p_v1); + ((Vector3&) v1).Sub(&GetWorldBoundingSphere().Center()); + + float local10 = GetWorldBoundingSphere().Radius(); + float local8 = p_v2.Dot(&p_v2, &p_v2); + float localc = p_v2.Dot(&p_v2, &v1) * 2.0f; + float local14 = v1.Dot(&v1, &v1) - (local10 * local10); + + if (local8 >= 0.001 || local8 <= -0.001) { + float local1c = -1.0f; + float local18 = (localc * localc) - (local14 * local8 * 4.0f); + + if (local18 >= -0.001) { + local8 *= 2.0f; + localc = -localc; + + if (local18 > 0.0f) { + local18 = sqrt(local18); + float local184 = (localc + local18) / local8; + float local188 = (localc - local18) / local8; + + if (local184 > 0.0f && local188 > local184) { + local1c = local184; + } + else if (local188 > 0.0f) { + local1c = local188; + } + else { + return 0; + } + } + else { + local1c = localc / local8; + } + + if (local1c >= 0.0f && p_f1 <= local1c) { + p_v3 = p_v2; + p_v3.Mul(local1c); + p_v3.Add(&p_v1); + return 1; + } + } + } + } + return 0; } @@ -609,7 +743,7 @@ LegoBool LegoROI::FUN_100a9bf0(const LegoChar* p_param, float& p_red, float& p_g // FUNCTION: LEGO1 0x100a9c50 LegoBool LegoROI::ColorAliasLookup(const LegoChar* p_param, float& p_red, float& p_green, float& p_blue, float& p_alpha) { - for (MxU32 i = 0; i < sizeOfArray(g_roiColorAliases); i++) { + for (LegoU32 i = 0; i < sizeOfArray(g_roiColorAliases); i++) { if (strcmpi(g_roiColorAliases[i].m_name, p_param) == 0) { p_red = g_roiColorAliases[i].m_red / 255.0; p_green = g_roiColorAliases[i].m_green / 255.0; diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h index 64002d30..f00bcf36 100644 --- a/LEGO1/lego/sources/roi/legoroi.h +++ b/LEGO1/lego/sources/roi/legoroi.h @@ -38,7 +38,7 @@ class LegoROI : public ViewROI { LegoResult FUN_100a9170(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha); LegoResult FUN_100a9210(LegoTextureInfo* p_textureInfo); LegoResult GetTexture(LegoTextureInfo*& p_textureInfo); - LegoU32 FUN_100a9410(Vector3&, Vector3&, float, float, Vector3&, LegoBool); + LegoU32 FUN_100a9410(Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3, LegoBool p_collideBox); void SetName(const LegoChar* p_name); float IntrinsicImportance() const override; // vtable+0x04 From 3cfb91855969f40c19bb996e3eb3eb4fc8eae9b3 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 25 May 2024 19:16:20 -0400 Subject: [PATCH 11/28] Implement/match LegoExtraActor::VTable0x6c (#956) --- .../lego/legoomni/include/legoanimpresenter.h | 30 +++--- LEGO1/lego/legoomni/include/legopathactor.h | 1 + .../legoomni/src/paths/legoextraactor.cpp | 99 ++++++++++++++++++- .../lego/legoomni/src/paths/legopathactor.cpp | 4 +- .../legoomni/src/video/legoanimpresenter.cpp | 9 +- 5 files changed, 116 insertions(+), 27 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index 09fd00a8..f4745c18 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -54,21 +54,21 @@ class LegoAnimPresenter : public MxVideoPresenter { return !strcmp(p_name, LegoAnimPresenter::ClassName()) || MxVideoPresenter::IsA(p_name); } - void ReadyTickle() override; // vtable+0x18 - void StartingTickle() override; // vtable+0x1c - void StreamingTickle() override; // vtable+0x20 - void DoneTickle() override; // vtable+0x2c - void ParseExtra() override; // vtable+0x30 - MxResult AddToManager() override; // vtable+0x34 - void Destroy() override; // vtable+0x38 - MxResult StartAction(MxStreamController* p_controller, MxDSAction* p_action) override; // vtable+0x3c - void EndAction() override; // vtable+0x40 - void PutFrame() override; // vtable+0x6c - virtual MxResult CreateAnim(MxStreamChunk* p_chunk); // vtable+0x88 - virtual void VTable0x8c(); // vtable+0x8c - virtual void VTable0x90(); // vtable+0x90 - virtual MxU32 VTable0x94(Vector3& p_vec1, Vector3& p_vec2, float p_f1, float p_f2, Vector3& p_vec3); // vtable+0x94 - virtual MxResult VTable0x98(LegoPathBoundary* p_boundary); // vtable+0x98 + void ReadyTickle() override; // vtable+0x18 + void StartingTickle() override; // vtable+0x1c + void StreamingTickle() override; // vtable+0x20 + void DoneTickle() override; // vtable+0x2c + void ParseExtra() override; // vtable+0x30 + MxResult AddToManager() override; // vtable+0x34 + void Destroy() override; // vtable+0x38 + MxResult StartAction(MxStreamController* p_controller, MxDSAction* p_action) override; // vtable+0x3c + void EndAction() override; // vtable+0x40 + void PutFrame() override; // vtable+0x6c + virtual MxResult CreateAnim(MxStreamChunk* p_chunk); // vtable+0x88 + virtual void VTable0x8c(); // vtable+0x8c + virtual void VTable0x90(); // vtable+0x90 + virtual MxU32 VTable0x94(Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3); // vtable+0x94 + virtual MxResult VTable0x98(LegoPathBoundary* p_boundary); // vtable+0x98 // FUNCTION: LEGO1 0x1000c990 virtual LegoROI** GetROIMap(MxU32& p_roiMapSize) diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 10f79b50..71e9f68e 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -126,6 +126,7 @@ class LegoPathActor : public LegoActor { inline LegoPathBoundary* GetBoundary() { return m_boundary; } inline MxU32 GetState() { return m_state; } inline LegoPathController* GetController() { return m_controller; } + inline MxBool GetCollideBox() { return m_collideBox; } inline void SetBoundary(LegoPathBoundary* p_boundary) { m_boundary = p_boundary; } inline void SetState(MxU32 p_state) { m_state = p_state; } diff --git a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp index 9b3a6304..e1eeedbe 100644 --- a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp @@ -287,9 +287,9 @@ MxResult LegoExtraActor::VTable0x9c() if (m_boundary != oldBoundary) { MxU32 b = FALSE; - LegoAnimPresenterSet& set = m_boundary->GetPresenters(); + LegoAnimPresenterSet& presenters = m_boundary->GetPresenters(); - for (LegoAnimPresenterSet::iterator it = set.begin(); it != set.end(); it++) { + for (LegoAnimPresenterSet::iterator it = presenters.begin(); it != presenters.end(); it++) { MxU32 roiMapSize; if ((*it)->GetROIMap(roiMapSize)) { b = TRUE; @@ -312,9 +312,9 @@ void LegoExtraActor::Restart() { if (m_unk0x0e != 0) { MxU32 b = FALSE; - LegoAnimPresenterSet& set = m_boundary->GetPresenters(); + LegoAnimPresenterSet& presenters = m_boundary->GetPresenters(); - for (LegoAnimPresenterSet::iterator it = set.begin(); it != set.end(); it++) { + for (LegoAnimPresenterSet::iterator it = presenters.begin(); it != presenters.end(); it++) { MxU32 roiMapSize; if ((*it)->GetROIMap(roiMapSize)) { b = TRUE; @@ -429,7 +429,7 @@ MxS32 LegoExtraActor::VTable0x68(Vector3& p_point1, Vector3& p_point2, Vector3& return LegoPathActor::VTable0x68(p_point1, p_point2, p_point3); } -// STUB: LEGO1 0x1002b980 +// FUNCTION: LEGO1 0x1002b980 MxU32 LegoExtraActor::VTable0x6c( LegoPathBoundary* p_boundary, Vector3& p_v1, @@ -439,5 +439,94 @@ MxU32 LegoExtraActor::VTable0x6c( Vector3& p_v3 ) { + LegoAnimPresenterSet& presenters = p_boundary->GetPresenters(); + + for (LegoAnimPresenterSet::iterator itap = presenters.begin(); itap != presenters.end(); itap++) { + if ((*itap)->VTable0x94(p_v1, p_v2, p_f1, p_f2, p_v3)) { + return 1; + } + } + + LegoPathActorSet& plpas = p_boundary->GetActors(); + LegoPathActorSet lpas(plpas); + + for (LegoPathActorSet::iterator itpa = lpas.begin(); itpa != lpas.end(); itpa++) { + if (plpas.find(*itpa) != plpas.end()) { + LegoPathActor* actor = *itpa; + + if (this != actor && !(actor->GetState() & 0x100)) { + LegoROI* roi = actor->GetROI(); + + if ((roi != NULL && roi->GetVisibility()) || actor->GetCameraFlag()) { + if (actor->GetUserNavFlag()) { + MxMatrix local2world = roi->GetLocal2World(); + Vector3 local60(local2world[3]); + Mx3DPointFloat local54(p_v1); + + ((Vector3&) local54).Sub(&local60); + float local1c = p_v2.Dot(&p_v2, &p_v2); + float local24 = p_v2.Dot(&p_v2, &local54) * 2.0f; + float local20 = local54.Dot(&local54, &local54); + + if (m_unk0x15 != 0 && local20 < 10.0f) { + return 0; + } + + local20 -= 1.0f; + + if (local1c >= 0.001 || local1c <= -0.001) { + float local40 = (local24 * local24) + (local20 * local1c * -4.0f); + + if (local40 >= -0.001) { + local1c *= 2.0f; + local24 = -local24; + + if (local40 < 0.0f) { + local40 = 0.0f; + } + + local40 = sqrt(local40); + float local20X = (local24 + local40) / local1c; + float local1cX = (local24 - local40) / local1c; + + if (local1cX < local20X) { + local40 = local20X; + local20X = local1cX; + local1cX = local40; + } + + if ((local20X >= 0.0f && local20X <= p_f1) || (local1cX >= 0.0f && local1cX <= p_f1) || + (local20X <= -0.01 && p_f1 + 0.01 <= local1cX)) { + p_v3 = p_v1; + + if (VTable0x94(actor, TRUE) < 0) { + return 0; + } + + actor->VTable0x94(this, FALSE); + return 2; + } + } + } + } + else { + if (roi->FUN_100a9410(p_v1, p_v2, p_f1, p_f2, p_v3, m_collideBox && actor->GetCollideBox())) { + if (VTable0x94(actor, TRUE) < 0) { + return 0; + } + + actor->VTable0x94(this, FALSE); + return 2; + } + } + } + } + } + } + + if (m_unk0x15 != 0) { + m_unk0x15--; + } + return 0; } diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp index 661c3e95..17d89e68 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp @@ -437,9 +437,9 @@ MxU32 LegoPathActor::VTable0x6c( Vector3& p_v3 ) { - LegoAnimPresenterSet& laps = p_boundary->GetPresenters(); + LegoAnimPresenterSet& presenters = p_boundary->GetPresenters(); - for (LegoAnimPresenterSet::iterator itap = laps.begin(); itap != laps.end(); itap++) { + for (LegoAnimPresenterSet::iterator itap = presenters.begin(); itap != presenters.end(); itap++) { if ((*itap)->VTable0x94(p_v1, p_v2, p_f1, p_f2, p_v3)) { return 1; } diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index b463240c..503c6282 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -1113,13 +1113,13 @@ void LegoAnimPresenter::FUN_1006c8a0(MxBool p_bool) // FUNCTION: LEGO1 0x1006c8f0 // FUNCTION: BETA10 0x1005206c -MxU32 LegoAnimPresenter::VTable0x94(Vector3& p_vec1, Vector3& p_vec2, float p_f1, float p_f2, Vector3& p_vec3) +MxU32 LegoAnimPresenter::VTable0x94(Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3) { Mx3DPointFloat a, b; - b = p_vec2; + b = p_v2; ((Vector3&) b).Mul(p_f1); - ((Vector3&) b).Add(&p_vec1); + ((Vector3&) b).Add(&p_v1); a = b; ((Vector3&) a).Sub(&m_unk0xa8); @@ -1132,8 +1132,7 @@ MxU32 LegoAnimPresenter::VTable0x94(Vector3& p_vec1, Vector3& p_vec2, float p_f1 len = sqrt(len); if (len <= m_unk0xa4 + p_f2 && m_roiMapSize != 0 && m_roiMap != NULL) { for (MxU32 i = 1; i <= m_roiMapSize; i++) { - if (m_roiMap[i]->GetLODCount() != 0 && - m_roiMap[i]->FUN_100a9410(p_vec1, p_vec2, p_f1, p_f2, p_vec3, FALSE)) { + if (m_roiMap[i]->GetLODCount() != 0 && m_roiMap[i]->FUN_100a9410(p_v1, p_v2, p_f1, p_f2, p_v3, FALSE)) { return TRUE; } } From 765c49fd4ee5f2e4939ce71f5f4c5d6ff021a0fe Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 26 May 2024 11:12:37 -0400 Subject: [PATCH 12/28] Match LegoUnknown::FUN_1009a1e0 (#957) --- LEGO1/lego/sources/misc/legounknown.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/LEGO1/lego/sources/misc/legounknown.cpp b/LEGO1/lego/sources/misc/legounknown.cpp index 6b4a710e..117a50af 100644 --- a/LEGO1/lego/sources/misc/legounknown.cpp +++ b/LEGO1/lego/sources/misc/legounknown.cpp @@ -42,9 +42,9 @@ LegoResult LegoUnknown::FUN_1009a1e0(float p_f1, Matrix4& p_mat, Vector3& p_v, L } else if (p_f1 >= 0.999) { v1 = m_unk0x00[0]; - ((Vector3&) v2).Add(&m_unk0x00[1]); - ((Vector3&) v3).Add(&m_unk0x00[2]); - ((Vector3&) v4).Add(&m_unk0x00[3]); + ((Vector3&) v1).Add(&m_unk0x00[1]); + ((Vector3&) v1).Add(&m_unk0x00[2]); + ((Vector3&) v1).Add(&m_unk0x00[3]); for (LegoS32 i = 0; i < 3; i++) { v4[i] = m_unk0x00[1][i] + m_unk0x00[2][i] * 2.0f + m_unk0x00[3][i] * 3.0f; From 3c45022864c96271dc54c0fbba9f79fc3c98322b Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 26 May 2024 13:13:56 -0400 Subject: [PATCH 13/28] Fix extra actor collisions (#958) --- LEGO1/lego/sources/roi/legoroi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LEGO1/lego/sources/roi/legoroi.cpp b/LEGO1/lego/sources/roi/legoroi.cpp index 35e0231a..c978b6ce 100644 --- a/LEGO1/lego/sources/roi/legoroi.cpp +++ b/LEGO1/lego/sources/roi/legoroi.cpp @@ -563,7 +563,7 @@ LegoU32 LegoROI::FUN_100a9410( ) { if (p_collideBox) { - Mx3DPointFloat v2(p_v1); + Mx3DPointFloat v2(p_v2); ((Vector3&) v2).Mul(p_f1); ((Vector3&) v2).Add(&p_v1); @@ -678,7 +678,7 @@ LegoU32 LegoROI::FUN_100a9410( local1c = localc / local8; } - if (local1c >= 0.0f && p_f1 <= local1c) { + if (local1c >= 0.0f && p_f1 >= local1c) { p_v3 = p_v2; p_v3.Mul(local1c); p_v3.Add(&p_v1); From b8ea5bf9babe6f55fa92537f2f583b44cfa503f2 Mon Sep 17 00:00:00 2001 From: MS Date: Mon, 27 May 2024 03:22:10 -0400 Subject: [PATCH 14/28] Fix missing float constants (#959) --- tools/isledecomp/isledecomp/compare/core.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/isledecomp/isledecomp/compare/core.py b/tools/isledecomp/isledecomp/compare/core.py index b49600d0..8e93a828 100644 --- a/tools/isledecomp/isledecomp/compare/core.py +++ b/tools/isledecomp/isledecomp/compare/core.py @@ -103,6 +103,11 @@ def _load_cvdump(self): res = CvdumpAnalysis(cv) for sym in res.nodes: + # Skip nodes where we have almost no information. + # These probably came from SECTION CONTRIBUTIONS. + if sym.name() is None and sym.node_type is None: + continue + # The PDB might contain sections that do not line up with the # actual binary. The symbol "__except_list" is one example. # In these cases, just skip this symbol and move on because From 219b65f5adba6289ca34670f8f089b6354816fd5 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Mon, 27 May 2024 15:49:41 -0400 Subject: [PATCH 15/28] Implement/match IslePathActor::FUN_1001b660 (#960) --- LEGO1/lego/legoomni/src/actors/islepathactor.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp index be2bbc4b..edaaa314 100644 --- a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp +++ b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp @@ -579,8 +579,17 @@ void IslePathActor::VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundar } } -// STUB: LEGO1 0x1001b660 +// FUNCTION: LEGO1 0x1001b660 +// FUNCTION: BETA10 0x10036ea2 void IslePathActor::FUN_1001b660() { - // TODO + MxMatrix transform(m_roi->GetLocal2World()); + Vector3 position(transform[0]); + Vector3 direction(transform[1]); + Vector3 up(transform[2]); + + ((Vector3&) up).Mul(-1.0f); + position.EqualsCross(&direction, &up); + m_roi->FUN_100a58f0(transform); + m_roi->VTable0x14(); } From a88546baad9eabb7fc34d361e7abd416362fa465 Mon Sep 17 00:00:00 2001 From: MS Date: Tue, 28 May 2024 03:32:51 -0400 Subject: [PATCH 16/28] Refactor MxBitmap (again) (#961) * Remove this * Starting list of beta addrs * Static for height-specific abs, fix StrechBits * MxBitmap refactor --- LEGO1/omni/include/mxbitmap.h | 48 +++-- LEGO1/omni/src/video/mxbitmap.cpp | 299 +++++++++++++++++------------- 2 files changed, 209 insertions(+), 138 deletions(-) diff --git a/LEGO1/omni/include/mxbitmap.h b/LEGO1/omni/include/mxbitmap.h index a11853e4..c9c949be 100644 --- a/LEGO1/omni/include/mxbitmap.h +++ b/LEGO1/omni/include/mxbitmap.h @@ -34,6 +34,7 @@ struct MxBITMAPINFO { // SIZE 0x20 // VTABLE: LEGO1 0x100dc7b0 +// VTABLE: BETA10 0x101c21f8 class MxBitmap : public MxCore { public: MxBitmap(); @@ -46,6 +47,7 @@ class MxBitmap : public MxCore { virtual MxLong Read(const char* p_filename); // vtable+24 // FUNCTION: LEGO1 0x1004e0d0 + // FUNCTION: BETA10 0x10060fc0 virtual int VTable0x28(int) { return -1; } // vtable+28 virtual void BitBlt( @@ -82,26 +84,35 @@ class MxBitmap : public MxCore { // Bit mask trick to round up to the nearest multiple of four. // Pixel data may be stored with padding. // https://learn.microsoft.com/en-us/windows/win32/medfound/image-stride + // FUNCTION: BETA10 0x1002c510 inline MxLong AlignToFourByte(MxLong p_value) const { return (p_value + 3) & -4; } - // Same as the one from legoutils.h, but flipped the other way - // TODO: While it's not outside the realm of possibility that they - // reimplemented Abs for only this file, that seems odd, right? - inline MxLong AbsFlipped(MxLong p_value) const { return p_value > 0 ? p_value : -p_value; } + // DECOMP: This could be a free function. It is static here because it has no + // reference to "this". In the beta it is called in two places: + // 1. GetBmiHeightAbs + // 2. at 0x101523b9, in reference to BITMAPINFOHEADER.biHeight + // FUNCTION: BETA10 0x1002c690 + static MxLong HeightAbs(MxLong p_value) { return p_value > 0 ? p_value : -p_value; } inline BITMAPINFOHEADER* GetBmiHeader() const { return m_bmiHeader; } + + // FUNCTION: BETA10 0x1002c440 inline MxLong GetBmiWidth() const { return m_bmiHeader->biWidth; } inline MxLong GetBmiStride() const { return ((m_bmiHeader->biWidth + 3) & -4); } inline MxLong GetBmiHeight() const { return m_bmiHeader->biHeight; } - inline MxLong GetBmiHeightAbs() const { return AbsFlipped(m_bmiHeader->biHeight); } + + // FUNCTION: BETA10 0x1002c470 + inline MxLong GetBmiHeightAbs() const { return HeightAbs(m_bmiHeader->biHeight); } + + // FUNCTION: BETA10 0x10083900 inline MxU8* GetImage() const { return m_data; } + + // FUNCTION: BETA10 0x100838d0 inline MxBITMAPINFO* GetBitmapInfo() const { return m_info; } - inline MxLong GetDataSize() const - { - MxLong absHeight = GetBmiHeightAbs(); - MxLong alignedWidth = AlignToFourByte(m_bmiHeader->biWidth); - return alignedWidth * absHeight; - } + + // FUNCTION: BETA10 0x100982b0 + inline MxLong GetDataSize() const { return AlignToFourByte(m_bmiHeader->biWidth) * GetBmiHeightAbs(); } + inline MxLong GetAdjustedStride() { if (m_bmiHeader->biCompression == BI_RGB_TOPDOWN || m_bmiHeader->biHeight < 0) { @@ -138,9 +149,24 @@ class MxBitmap : public MxCore { } // SYNTHETIC: LEGO1 0x100bc9f0 + // SYNTHETIC: BETA10 0x1013dcd0 // MxBitmap::`scalar deleting destructor' private: + // FUNCTION: BETA10 0x1013dd10 + inline MxLong MxBitmapInfoSize() const { return sizeof(MxBITMAPINFO); } + + // FUNCTION: BETA10 0x1013dd30 + inline MxBool IsBottomUp() + { + if (m_bmiHeader->biCompression == BI_RGB_TOPDOWN) { + return FALSE; + } + else { + return m_bmiHeader->biHeight > 0; + } + } + MxResult ImportColorsToPalette(RGBQUAD*, MxPalette*); MxBITMAPINFO* m_info; // 0x08 diff --git a/LEGO1/omni/src/video/mxbitmap.cpp b/LEGO1/omni/src/video/mxbitmap.cpp index 29733d5f..88295b21 100644 --- a/LEGO1/omni/src/video/mxbitmap.cpp +++ b/LEGO1/omni/src/video/mxbitmap.cpp @@ -8,66 +8,79 @@ DECOMP_SIZE_ASSERT(MxBitmap, 0x20); DECOMP_SIZE_ASSERT(MxBITMAPINFO, 0x428); // GLOBAL: LEGO1 0x10102184 +// GLOBAL: BETA10 0x10203030 MxU16 g_bitmapSignature = TWOCC('B', 'M'); // FUNCTION: LEGO1 0x100bc980 +// FUNCTION: BETA10 0x1013cab0 MxBitmap::MxBitmap() { - this->m_info = NULL; - this->m_bmiHeader = NULL; - this->m_paletteData = NULL; - this->m_data = NULL; - this->m_isHighColor = FALSE; - this->m_palette = NULL; + m_info = NULL; + m_bmiHeader = NULL; + m_paletteData = NULL; + m_data = NULL; + m_isHighColor = FALSE; + m_palette = NULL; } // FUNCTION: LEGO1 0x100bca10 +// FUNCTION: BETA10 0x1013cb58 MxBitmap::~MxBitmap() { - if (this->m_info) { + if (m_info) { delete m_info; } - if (this->m_data) { + if (m_data) { delete m_data; } - if (this->m_palette) { + if (m_palette) { delete m_palette; } } // FUNCTION: LEGO1 0x100bcaa0 +// FUNCTION: BETA10 0x1013cc47 MxResult MxBitmap::SetSize(MxS32 p_width, MxS32 p_height, MxPalette* p_palette, MxBool p_isHighColor) { MxResult ret = FAILURE; MxLong size = AlignToFourByte(p_width) * p_height; - m_info = new MxBITMAPINFO; - if (m_info) { - m_data = new MxU8[size]; - if (m_data) { - m_bmiHeader = &m_info->m_bmiHeader; - m_paletteData = m_info->m_bmiColors; - memset(&m_info->m_bmiHeader, 0, sizeof(m_info->m_bmiHeader)); - - m_bmiHeader->biSize = sizeof(*m_bmiHeader); // should be 40 bytes - m_bmiHeader->biWidth = p_width; - m_bmiHeader->biHeight = p_height; - m_bmiHeader->biPlanes = 1; - m_bmiHeader->biBitCount = 8; - m_bmiHeader->biCompression = 0; - m_bmiHeader->biSizeImage = size; - - if (!ImportColorsToPalette(m_paletteData, p_palette)) { - if (!SetBitDepth(p_isHighColor)) { - ret = SUCCESS; - } - } - } + m_info = (MxBITMAPINFO*) new MxU8[MxBitmapInfoSize()]; + if (!m_info) { + goto done; } + m_data = new MxU8[size]; + if (!m_data) { + goto done; + } + + m_bmiHeader = &m_info->m_bmiHeader; + m_paletteData = m_info->m_bmiColors; + memset(m_bmiHeader, 0, sizeof(m_info->m_bmiHeader)); + + m_bmiHeader->biSize = sizeof(*m_bmiHeader); // should be 40 bytes + m_bmiHeader->biWidth = p_width; + m_bmiHeader->biHeight = p_height; + m_bmiHeader->biPlanes = 1; + m_bmiHeader->biBitCount = 8; + m_bmiHeader->biCompression = 0; + m_bmiHeader->biSizeImage = size; + + if (ImportColorsToPalette(m_paletteData, p_palette)) { + goto done; + } + + if (SetBitDepth(p_isHighColor)) { + goto done; + } + + ret = SUCCESS; + +done: if (ret) { if (m_info) { - delete m_info; + delete[] m_info; m_info = NULL; } @@ -81,33 +94,37 @@ MxResult MxBitmap::SetSize(MxS32 p_width, MxS32 p_height, MxPalette* p_palette, } // FUNCTION: LEGO1 0x100bcba0 +// FUNCTION: BETA10 0x1013ce25 MxResult MxBitmap::ImportBitmapInfo(MxBITMAPINFO* p_info) { MxResult result = FAILURE; - MxLong width = p_info->m_bmiHeader.biWidth; - MxLong height = p_info->m_bmiHeader.biHeight; - MxLong size = AlignToFourByte(width) * height; + MxLong size = AlignToFourByte(p_info->m_bmiHeader.biWidth) * p_info->m_bmiHeader.biHeight; - this->m_info = new MxBITMAPINFO; - if (this->m_info) { - this->m_data = new MxU8[size]; - if (this->m_data) { - memcpy(this->m_info, p_info, sizeof(*this->m_info)); - this->m_bmiHeader = &this->m_info->m_bmiHeader; - this->m_paletteData = this->m_info->m_bmiColors; - result = SUCCESS; - } + m_info = (MxBITMAPINFO*) new MxU8[MxBitmapInfoSize()]; + if (!m_info) { + goto done; } + m_data = new MxU8[size]; + if (!m_data) { + goto done; + } + + memcpy(m_info, p_info, MxBitmapInfoSize()); + m_bmiHeader = &m_info->m_bmiHeader; + m_paletteData = m_info->m_bmiColors; + result = SUCCESS; + +done: if (result != SUCCESS) { - if (this->m_info) { - delete this->m_info; - this->m_info = NULL; + if (m_info) { + delete[] m_info; + m_info = NULL; } - if (this->m_data) { - delete[] this->m_data; - this->m_data = NULL; + if (m_data) { + delete[] m_data; + m_data = NULL; } } @@ -115,32 +132,38 @@ MxResult MxBitmap::ImportBitmapInfo(MxBITMAPINFO* p_info) } // FUNCTION: LEGO1 0x100bcc40 +// FUNCTION: BETA10 0x1013cf6d MxResult MxBitmap::ImportBitmap(MxBitmap* p_bitmap) { MxResult result = FAILURE; - this->m_info = new MxBITMAPINFO; - if (this->m_info) { - this->m_data = new MxU8[p_bitmap->GetDataSize()]; - if (this->m_data) { - memcpy(this->m_info, p_bitmap->GetBitmapInfo(), MxBITMAPINFO::Size()); - memcpy(this->m_data, p_bitmap->GetImage(), p_bitmap->GetDataSize()); - - this->m_bmiHeader = &this->m_info->m_bmiHeader; - this->m_paletteData = this->m_info->m_bmiColors; - result = SUCCESS; - } + m_info = (MxBITMAPINFO*) new MxU8[p_bitmap->MxBitmapInfoSize()]; + if (!m_info) { + goto done; } + m_data = new MxU8[p_bitmap->GetDataSize()]; + if (!m_data) { + goto done; + } + + memcpy(m_info, p_bitmap->GetBitmapInfo(), p_bitmap->MxBitmapInfoSize()); + memcpy(m_data, p_bitmap->GetImage(), p_bitmap->GetDataSize()); + + m_bmiHeader = &m_info->m_bmiHeader; + m_paletteData = m_info->m_bmiColors; + result = SUCCESS; + +done: if (result != SUCCESS) { - if (this->m_info) { - delete this->m_info; - this->m_info = NULL; + if (m_info) { + delete[] m_info; + m_info = NULL; } - if (this->m_data) { - delete this->m_data; - this->m_data = NULL; + if (m_data) { + delete[] m_data; + m_data = NULL; } } @@ -148,16 +171,25 @@ MxResult MxBitmap::ImportBitmap(MxBitmap* p_bitmap) } // FUNCTION: LEGO1 0x100bcd10 +// FUNCTION: BETA10 0x1013d0c7 MxLong MxBitmap::Read(const char* p_filename) { MxResult result = FAILURE; - HANDLE handle = - CreateFileA(p_filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE handle = 0; - if (handle != INVALID_HANDLE_VALUE && !LoadFile(handle)) { - result = SUCCESS; + handle = CreateFileA(p_filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if (handle == INVALID_HANDLE_VALUE) { + goto done; } + if (LoadFile(handle)) { + goto done; + } + + result = SUCCESS; + +done: if (handle) { CloseHandle(handle); } @@ -166,46 +198,64 @@ MxLong MxBitmap::Read(const char* p_filename) } // FUNCTION: LEGO1 0x100bcd60 +// FUNCTION: BETA10 0x1013d169 MxResult MxBitmap::LoadFile(HANDLE p_handle) { MxResult result = FAILURE; + MxLong unused = 0; + + MxLong size; DWORD bytesRead; BITMAPFILEHEADER hdr; - - BOOL ret = ReadFile(p_handle, &hdr, sizeof(hdr), &bytesRead, NULL); - if (ret && (hdr.bfType == g_bitmapSignature)) { - this->m_info = new MxBITMAPINFO; - if (this->m_info) { - ret = ReadFile(p_handle, this->m_info, sizeof(*this->m_info), &bytesRead, NULL); - if (ret && (this->m_info->m_bmiHeader.biBitCount == 8)) { - MxLong size = hdr.bfSize - (sizeof(MxBITMAPINFO) + sizeof(BITMAPFILEHEADER)); - this->m_data = new MxU8[size]; - if (this->m_data) { - ret = ReadFile(p_handle, this->m_data, size, &bytesRead, NULL); - if (ret) { - this->m_bmiHeader = &this->m_info->m_bmiHeader; - this->m_paletteData = this->m_info->m_bmiColors; - if (this->m_info->m_bmiHeader.biSizeImage == 0) { - MxLong height = AbsFlipped(this->m_info->m_bmiHeader.biHeight); - this->m_info->m_bmiHeader.biSizeImage = - AlignToFourByte(this->m_info->m_bmiHeader.biWidth) * height; - } - result = SUCCESS; - } - } - } - } + if (!ReadFile(p_handle, &hdr, sizeof(hdr), &bytesRead, NULL)) { + goto done; } + if (hdr.bfType != g_bitmapSignature) { + goto done; + } + + m_info = (MxBITMAPINFO*) new MxU8[MxBitmapInfoSize()]; + if (!m_info) { + goto done; + } + + if (!ReadFile(p_handle, m_info, MxBitmapInfoSize(), &bytesRead, NULL)) { + goto done; + } + + if (m_info->m_bmiHeader.biBitCount != 8) { + goto done; + } + + size = hdr.bfSize - sizeof(BITMAPFILEHEADER) - MxBitmapInfoSize(); + m_data = new MxU8[size]; + if (!m_data) { + goto done; + } + + if (!ReadFile(p_handle, m_data, size, &bytesRead, NULL)) { + goto done; + } + + m_bmiHeader = &m_info->m_bmiHeader; + m_paletteData = m_info->m_bmiColors; + if (m_info->m_bmiHeader.biSizeImage == 0) { + m_info->m_bmiHeader.biSizeImage = GetDataSize(); + } + + result = SUCCESS; + +done: if (result != SUCCESS) { - if (this->m_info) { - delete this->m_info; - this->m_info = NULL; + if (m_info) { + delete[] m_info; + m_info = NULL; } - if (this->m_data) { - delete this->m_data; - this->m_data = NULL; + if (m_data) { + delete[] m_data; + m_data = NULL; } } @@ -213,6 +263,7 @@ MxResult MxBitmap::LoadFile(HANDLE p_handle) } // FUNCTION: LEGO1 0x100bce70 +// FUNCTION: BETA10 0x1013d399 void MxBitmap::BitBlt( MxBitmap* p_src, MxS32 p_srcLeft, @@ -252,6 +303,7 @@ void MxBitmap::BitBlt( } // FUNCTION: LEGO1 0x100bd020 +// FUNCTION: BETA10 0x1013d4ea void MxBitmap::BitBltTransparent( MxBitmap* p_src, MxS32 p_srcLeft, @@ -298,24 +350,21 @@ void MxBitmap::BitBltTransparent( } // FUNCTION: LEGO1 0x100bd1c0 +// FUNCTION: BETA10 0x1013d684 MxPalette* MxBitmap::CreatePalette() { MxBool success = FALSE; MxPalette* palette = NULL; - switch (this->m_isHighColor) { + switch (m_isHighColor) { case FALSE: - palette = new MxPalette(this->m_paletteData); - - if (!palette) { + if (!(palette = new MxPalette(m_paletteData))) { goto done; } break; case TRUE: - palette = this->m_palette->Clone(); - - if (!palette) { + if (!(palette = m_palette->Clone())) { goto done; } @@ -336,24 +385,24 @@ MxPalette* MxBitmap::CreatePalette() } // FUNCTION: LEGO1 0x100bd280 +// FUNCTION: BETA10 0x1013d80e void MxBitmap::ImportPalette(MxPalette* p_palette) { // Odd to use a switch on a boolean, but it matches. - switch (this->m_isHighColor) { + switch (m_isHighColor) { case FALSE: - ImportColorsToPalette(this->m_paletteData, p_palette); + ImportColorsToPalette(m_paletteData, p_palette); break; case TRUE: - if (this->m_palette) { - delete this->m_palette; - } - this->m_palette = p_palette->Clone(); + delete m_palette; + m_palette = p_palette->Clone(); break; } } // FUNCTION: LEGO1 0x100bd2d0 +// FUNCTION: BETA10 0x1013d8a9 MxResult MxBitmap::SetBitDepth(MxBool p_isHighColor) { MxResult ret = FAILURE; @@ -368,17 +417,11 @@ MxResult MxBitmap::SetBitDepth(MxBool p_isHighColor) switch (p_isHighColor) { case FALSE: ImportColorsToPalette(m_paletteData, m_palette); - if (m_palette) { - delete m_palette; - } - + delete m_palette; m_palette = NULL; break; case TRUE: { - pal = NULL; - pal = new MxPalette(m_paletteData); - - if (!pal) { + if (!(pal = new MxPalette(m_paletteData))) { goto done; } @@ -409,6 +452,7 @@ MxResult MxBitmap::SetBitDepth(MxBool p_isHighColor) } // FUNCTION: LEGO1 0x100bd3e0 +// FUNCTION: BETA10 0x1013dad2 MxResult MxBitmap::StretchBits( HDC p_hdc, MxS32 p_xSrc, @@ -420,8 +464,8 @@ MxResult MxBitmap::StretchBits( ) { // Compression fix? - if ((this->m_bmiHeader->biCompression != BI_RGB_TOPDOWN) && (0 < this->m_bmiHeader->biHeight)) { - p_ySrc = (this->m_bmiHeader->biHeight - p_destHeight) - p_ySrc; + if (IsBottomUp()) { + p_ySrc = GetBmiHeightAbs() - p_ySrc - p_destHeight; } return StretchDIBits( @@ -434,14 +478,15 @@ MxResult MxBitmap::StretchBits( p_ySrc, p_destWidth, p_destHeight, - this->m_data, - (BITMAPINFO*) this->m_info, - this->m_isHighColor, + m_data, + (BITMAPINFO*) m_info, + m_isHighColor, SRCCOPY ); } // FUNCTION: LEGO1 0x100bd450 +// FUNCTION: BETA10 0x1013db55 MxResult MxBitmap::ImportColorsToPalette(RGBQUAD* p_rgbquad, MxPalette* p_palette) { MxResult ret = FAILURE; From 60b747d7b2687b6df498634c6bc05b5d218c4e26 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Tue, 28 May 2024 11:20:23 -0400 Subject: [PATCH 17/28] Implement/match LegoPathBoundary::FUN_100586e0 and FUN_10057fe0 (#962) --- .../lego/legoomni/include/legoanimpresenter.h | 4 ++ .../lego/legoomni/include/legopathboundary.h | 33 +++++++++++++++ .../legoomni/src/paths/legopathboundary.cpp | 40 ++++++++++++++++--- LEGO1/lego/sources/geom/legowegedge.h | 2 +- 4 files changed, 73 insertions(+), 6 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index f4745c18..d9d97bb5 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -83,8 +83,12 @@ class LegoAnimPresenter : public MxVideoPresenter { MxResult FUN_1006b140(LegoROI* p_roi); const char* GetActionObjectName(); + inline void SetCurrentWorld(LegoWorld* p_currentWorld) { m_currentWorld = p_currentWorld; } + inline LegoAnim* GetAnimation() { return m_anim; } + friend class LegoPathBoundary; + protected: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legopathboundary.h b/LEGO1/lego/legoomni/include/legopathboundary.h index f46633d7..570b2ea2 100644 --- a/LEGO1/lego/legoomni/include/legopathboundary.h +++ b/LEGO1/lego/legoomni/include/legopathboundary.h @@ -131,6 +131,39 @@ class LegoPathBoundary : public LegoWEGEdge { // TEMPLATE: LEGO1 0x100573e0 // _Tree >::_Kfn,LegoPathActorSetCompare,allocator >::begin +// TEMPLATE: LEGO1 0x100580c0 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::insert + +// TEMPLATE: LEGO1 0x10058330 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::iterator::_Dec + +// TEMPLATE: LEGO1 0x10058380 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::_Buynode + +// TEMPLATE: LEGO1 0x100583a0 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::_Insert + +// TEMPLATE: LEGO1 0x10058620 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::_Lrotate + +// TEMPLATE: LEGO1 0x10058680 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::_Rrotate + +// TEMPLATE: LEGO1 0x10058820 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::erase + +// TEMPLATE: LEGO1 0x100588e0 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::equal_range + +// TEMPLATE: LEGO1 0x10058950 +// _Tree >::_Kfn,LegoAnimPresenterSetCompare,allocator >::_Lbound + +// TEMPLATE: LEGO1 0x10058980 +// _Construct + +// TEMPLATE: LEGO1 0x100589a0 +// _Distance + // GLOBAL: LEGO1 0x100f11a4 // _Tree >::_Kfn,LegoPathActorSetCompare,allocator >::_Nil diff --git a/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp b/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp index 057143ec..81108d61 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathboundary.cpp @@ -2,6 +2,7 @@ #include "decomp.h" #include "geom/legounkown100db7f4.h" +#include "legolocomotionanimpresenter.h" #include "legopathactor.h" #include "legopathstruct.h" @@ -337,18 +338,47 @@ MxU32 LegoPathBoundary::Intersect( return 0; } -// STUB: LEGO1 0x10057fe0 +// FUNCTION: LEGO1 0x10057fe0 // FUNCTION: BETA10 0x100b2220 MxU32 LegoPathBoundary::FUN_10057fe0(LegoAnimPresenter* p_presenter) { - // TODO - return 0; + Mx3DPointFloat unk0x30; + + unk0x30 = m_unk0x30; + ((Vector3&) unk0x30).Sub(&p_presenter->m_unk0xa8); + + float len = unk0x30.LenSquared(); + float local20 = p_presenter->m_unk0xa4 + m_unk0x44; + + if (len > 0.001 && len > local20 * local20) { + return 0; + } + + // TODO: This only seems to match if the type is not the same as the type of the + // key value of the set. Figure out which type the set (or parameter) actually uses. + // Also see call to .find in LegoPathController::FUN_10046050 + m_presenters.insert(static_cast(p_presenter)); + return 1; } -// STUB: LEGO1 0x100586e0 +// FUNCTION: LEGO1 0x100586e0 // FUNCTION: BETA10 0x100b22d1 MxU32 LegoPathBoundary::FUN_100586e0(LegoAnimPresenter* p_presenter) { - // TODO + if (p_presenter != NULL) { + // TODO: This only seems to match if the type is not the same as the type of the + // key value of the set. Figure out which type the set (or parameter) actually uses. + // Also see call to .find in LegoPathController::FUN_10046050 + if (m_presenters.find(static_cast(p_presenter)) != m_presenters.end()) { + m_presenters.erase(static_cast(p_presenter)); + return 1; + } + } + else { + for (LegoAnimPresenterSet::iterator it = m_presenters.begin(); it != m_presenters.end(); it++) { + (*it)->SetCurrentWorld(NULL); + } + } + return 0; } diff --git a/LEGO1/lego/sources/geom/legowegedge.h b/LEGO1/lego/sources/geom/legowegedge.h index aff336e6..efce4662 100644 --- a/LEGO1/lego/sources/geom/legowegedge.h +++ b/LEGO1/lego/sources/geom/legowegedge.h @@ -69,7 +69,7 @@ class LegoWEGEdge : public LegoWEEdge { Mx4DPointFloat m_unk0x14; // 0x14 Mx4DPointFloat* m_edgeNormals; // 0x2c Mx3DPointFloat m_unk0x30; // 0x30 - LegoU32 m_unk0x44; // 0x44 + float m_unk0x44; // 0x44 LegoU8 m_unk0x48; // 0x48 PathWithTrigger* m_pathTrigger; // 0x4c Mx3DPointFloat* m_unk0x50; // 0x50 From da48dfb40dfc553eaca5bed9436d1a8846a3a519 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Tue, 28 May 2024 15:23:23 -0400 Subject: [PATCH 18/28] Implement/match LegoAnimPresenter::FUN_1006b140 (#963) --- .../lego/legoomni/include/legoanimpresenter.h | 12 +-- .../legoomni/src/video/legoanimpresenter.cpp | 52 +++++++++++- LEGO1/realtime/matrix.h | 82 ++++++++++++++++++- 3 files changed, 136 insertions(+), 10 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index d9d97bb5..d7cc4cb2 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -84,11 +84,11 @@ class LegoAnimPresenter : public MxVideoPresenter { const char* GetActionObjectName(); inline void SetCurrentWorld(LegoWorld* p_currentWorld) { m_currentWorld = p_currentWorld; } + inline void SetUnknown0x0cTo1() { m_unk0x9c = 1; } + inline void SetUnknown0xa0(MxMatrix* p_unk0xa0) { m_unk0xa0 = p_unk0xa0; } inline LegoAnim* GetAnimation() { return m_anim; } - friend class LegoPathBoundary; - protected: void Init(); void Destroy(MxBool p_fromDestructor); @@ -128,9 +128,11 @@ class LegoAnimPresenter : public MxVideoPresenter { undefined m_unk0x97; // 0x97 LegoAnimSubstMap* m_substMap; // 0x98 MxS16 m_unk0x9c; // 0x9c - undefined4* m_unk0xa0; // 0xa0 - float m_unk0xa4; // 0xa4 - Mx3DPointFloat m_unk0xa8; // 0xa8 + MxMatrix* m_unk0xa0; // 0xa0 + +public: + float m_unk0xa4; // 0xa4 + Mx3DPointFloat m_unk0xa8; // 0xa8 }; // clang-format off diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index 503c6282..11aa7f40 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -121,7 +121,7 @@ void LegoAnimPresenter::Destroy(MxBool p_fromDestructor) } if (m_unk0xa0 != NULL) { - delete m_unk0xa0; // TODO + delete m_unk0xa0; } Init(); @@ -699,11 +699,57 @@ MxResult LegoAnimPresenter::FUN_1006afc0(MxMatrix*& p_matrix, float p_und) return SUCCESS; } -// STUB: LEGO1 0x1006b140 +// FUNCTION: LEGO1 0x1006b140 // FUNCTION: BETA10 0x100507e0 MxResult LegoAnimPresenter::FUN_1006b140(LegoROI* p_roi) { - // TODO + if (p_roi == NULL) { + return FAILURE; + } + + MxMatrix* mn = new MxMatrix(); + MxMatrix local58; + const Matrix4& local2world = p_roi->GetLocal2World(); + MxMatrix* local5c; + MxU32 i; + + if (FUN_1006afc0(local5c, 0.0f) != SUCCESS) { + goto done; + } + + for (i = 1; i <= m_roiMapSize; i++) { + if (m_roiMap[i] == p_roi) { + if (local5c[i].Unknown(local58) != SUCCESS) { + goto done; + } + + break; + } + } + + { + ((Matrix4*) mn)->Product(local58, local2world); + SetUnknown0xa0(mn); + delete[] local5c; + SetUnknown0x0cTo1(); + + MxMatrix local140(*m_unk0x78); + MxMatrix localf8; + + localf8.Product(local140, *m_unk0xa0); + ((Matrix4&) *m_unk0x78) = localf8; + return SUCCESS; + } + +done: + if (mn != NULL) { + delete mn; + } + + if (local5c != NULL) { + delete[] local5c; + } + return FAILURE; } diff --git a/LEGO1/realtime/matrix.h b/LEGO1/realtime/matrix.h index 82c3166a..df2260ea 100644 --- a/LEGO1/realtime/matrix.h +++ b/LEGO1/realtime/matrix.h @@ -16,6 +16,7 @@ struct UnknownMatrixType { // SIZE 0x08 class Matrix4 { public: + // FUNCTION: LEGO1 0x10004500 inline Matrix4(float (*p_data)[4]) { SetData(p_data); } // Note: virtual function overloads appear in the virtual table @@ -107,6 +108,9 @@ class Matrix4 { // FUNCTION: LEGO1 0x10002530 virtual void Product(const Matrix4& p_a, const Matrix4& p_b) { Product(p_a.m_data, p_b.m_data); } // vtable+0x38 + inline virtual void ToQuaternion(Vector4& p_resultQuat); // vtable+0x40 + inline virtual int FromQuaternion(const Vector4& p_vec); // vtable+0x44 + // FUNCTION: LEGO1 0x100a0ff0 inline void Scale(const float& p_x, const float& p_y, const float& p_z) { @@ -141,8 +145,17 @@ class Matrix4 { } } - inline virtual void ToQuaternion(Vector4& p_resultQuat); // vtable+0x40 - inline virtual int FromQuaternion(const Vector4& p_vec); // vtable+0x44 + inline int Unknown(Matrix4& p_mat); + + // FUNCTION: LEGO1 0x1006b500 + inline void Swap(int p_d1, int p_d2) + { + for (int i = 0; i < 4; i++) { + float e = m_data[p_d1][i]; + m_data[p_d1][i] = m_data[p_d2][i]; + m_data[p_d2][i] = e; + } + } float* operator[](int idx) { return m_data[idx]; } const float* operator[](int idx) const { return m_data[idx]; } @@ -241,4 +254,69 @@ inline int Matrix4::FromQuaternion(const Vector4& p_vec) return -1; } +// FUNCTION: BETA10 0x1005a590 +inline int Matrix4::Unknown(Matrix4& p_mat) +{ + float local5c[4][4]; + Matrix4 localc(local5c); + + ((Matrix4&) localc) = *this; + p_mat.SetIdentity(); + + for (int i = 0; i < 4; i++) { + int local1c = i; + int local10; + + for (local10 = i + 1; local10 < 4; local10++) { + if (fabs(localc[local1c][i]) < fabs(localc[local10][i])) { + local1c = local10; + } + } + + if (local1c != i) { + localc.Swap(local1c, i); + p_mat.Swap(local1c, i); + } + + if (localc[i][i] < 0.001f && localc[i][i] > -0.001f) { + return -1; + } + + float local60 = localc[i][i]; + int local18; + + for (local18 = 0; local18 < 4; local18++) { + p_mat[i][local18] /= local60; + } + + for (local18 = 0; local18 < 4; local18++) { + localc[i][local18] /= local60; + } + + for (local10 = 0; local10 < 4; local10++) { + if (i != local10) { + float afStack70[4]; + + for (local18 = 0; local18 < 4; local18++) { + afStack70[local18] = p_mat[i][local18] * localc[local10][i]; + } + + for (local18 = 0; local18 < 4; local18++) { + p_mat[local10][local18] -= afStack70[local18]; + } + + for (local18 = 0; local18 < 4; local18++) { + afStack70[local18] = localc[i][local18] * localc[local10][i]; + } + + for (local18 = 0; local18 < 4; local18++) { + localc[local10][local18] -= afStack70[local18]; + } + } + } + } + + return 0; +} + #endif // MATRIX_H From 5f00634b9c617fb4fff414759c82cd6fc264fdc2 Mon Sep 17 00:00:00 2001 From: MS Date: Wed, 29 May 2024 10:47:25 -0400 Subject: [PATCH 19/28] Implement LegoMeterPresenter::DrawMeter (#964) * Implement LegoMeterPresenter::DrawMeter * New MxRect16 header, offsets and size annotations * Missing mxtypes include --- .../legoomni/include/legometerpresenter.h | 32 ++++-- .../src/control/legometerpresenter.cpp | 104 ++++++++++++++---- LEGO1/omni/include/mxbitmap.h | 29 ++--- LEGO1/omni/include/mxrect16.h | 47 ++++++++ 4 files changed, 167 insertions(+), 45 deletions(-) create mode 100644 LEGO1/omni/include/mxrect16.h diff --git a/LEGO1/lego/legoomni/include/legometerpresenter.h b/LEGO1/lego/legoomni/include/legometerpresenter.h index ad43944d..9a8b7acd 100644 --- a/LEGO1/lego/legoomni/include/legometerpresenter.h +++ b/LEGO1/lego/legoomni/include/legometerpresenter.h @@ -1,10 +1,18 @@ #ifndef LEGOMETERPRESENTER_H #define LEGOMETERPRESENTER_H +#include "mxrect16.h" #include "mxstillpresenter.h" #include "mxstring.h" +// SIZE 0x08 +struct MeterRect : public MxRect16 { + // FUNCTION: BETA10 0x10097eb0 + MeterRect() {} +}; + // VTABLE: LEGO1 0x100d7ac8 +// VTABLE: BETA10 0x101bca68 // SIZE 0x94 class LegoMeterPresenter : public MxStillPresenter { public: @@ -18,17 +26,21 @@ class LegoMeterPresenter : public MxStillPresenter { void ParseExtra() override; // vtable+0x30 private: - void FUN_10043a50(); + enum MeterLayout { + e_leftToRight = 0, + e_rightToLeft, + e_bottomToTop, + e_topToBottom + }; - MxU8* m_unk0x6c; // 0x6c - MxU16 m_type; // 0x70 - MxString m_variable; // 0x74 - MxFloat m_unk0x84; // 0x84 - MxU16 m_unk0x88; // 0x88 - MxU16 m_unk0x8a; // 0x8a - MxU16 m_unk0x8c; // 0x8c - MxU16 m_unk0x8e; // 0x8e - MxU16 m_layout; // 0x90 + void DrawMeter(); + + MxU8* m_meterPixels; // 0x6c + MxU16 m_fillColor; // 0x70 + MxString m_variable; // 0x74 + MxFloat m_curPercent; // 0x84 + MeterRect m_meterRect; // 0x88 + MxS16 m_layout; // 0x90 }; // SYNTHETIC: LEGO1 0x10043760 diff --git a/LEGO1/lego/legoomni/src/control/legometerpresenter.cpp b/LEGO1/lego/legoomni/src/control/legometerpresenter.cpp index d6dd5dd8..c6c8352a 100644 --- a/LEGO1/lego/legoomni/src/control/legometerpresenter.cpp +++ b/LEGO1/lego/legoomni/src/control/legometerpresenter.cpp @@ -4,27 +4,34 @@ #include "define.h" #include "mxbitmap.h" #include "mxdsaction.h" +#include "mxmisc.h" #include "mxutilities.h" +#include "mxvariabletable.h" + +#include DECOMP_SIZE_ASSERT(LegoMeterPresenter, 0x94) // FUNCTION: LEGO1 0x10043430 +// FUNCTION: BETA10 0x10097570 LegoMeterPresenter::LegoMeterPresenter() { - m_layout = 0; - m_unk0x6c = 0; - m_unk0x84 = 0; - m_type = 1; - SetBit1(FALSE); + m_meterPixels = NULL; + m_fillColor = 1; + m_curPercent = 0; + m_layout = e_leftToRight; + m_flags.m_bit1 = FALSE; } // FUNCTION: LEGO1 0x10043780 +// FUNCTION: BETA10 0x1009764a LegoMeterPresenter::~LegoMeterPresenter() { - delete m_unk0x6c; + delete m_meterPixels; } // FUNCTION: LEGO1 0x10043800 +// FUNCTION: BETA10 0x100976ec void LegoMeterPresenter::ParseExtra() { MxStillPresenter::ParseExtra(); @@ -41,27 +48,28 @@ void LegoMeterPresenter::ParseExtra() char output[256]; if (KeyValueStringParse(extraCopy, g_strTYPE, output)) { if (!strcmpi(output, g_strLEFT_TO_RIGHT)) { - m_layout = 0; + m_layout = e_leftToRight; } else if (!strcmpi(output, g_strRIGHT_TO_LEFT)) { - m_layout = 1; + m_layout = e_rightToLeft; } else if (!strcmpi(output, g_strBOTTOM_TO_TOP)) { - m_layout = 2; + m_layout = e_bottomToTop; } else if (!strcmpi(output, g_strTOP_TO_BOTTOM)) { - m_layout = 3; + m_layout = e_topToBottom; } } if (KeyValueStringParse(extraCopy, g_strFILLER_INDEX, output)) { - m_type = atoi(output); + m_fillColor = atoi(output); } if (KeyValueStringParse(extraCopy, g_strVARIABLE, output)) { m_variable = output; } else { + assert(0); EndAction(); } } @@ -71,30 +79,84 @@ void LegoMeterPresenter::ParseExtra() } // FUNCTION: LEGO1 0x10043990 +// FUNCTION: BETA10 0x10097917 void LegoMeterPresenter::StreamingTickle() { MxStillPresenter::StreamingTickle(); - m_unk0x6c = new MxU8[m_frameBitmap->GetBmiStride() * m_frameBitmap->GetBmiHeightAbs()]; - if (m_unk0x6c == NULL) { + m_meterPixels = new MxU8[m_frameBitmap->GetDataSize()]; + if (m_meterPixels == NULL) { + assert(0); EndAction(); } - memcpy(m_unk0x6c, m_frameBitmap->GetImage(), m_frameBitmap->GetBmiStride() * m_frameBitmap->GetBmiHeightAbs()); + memcpy(m_meterPixels, m_frameBitmap->GetImage(), m_frameBitmap->GetDataSize()); - m_unk0x88 = 0; - m_unk0x8a = 0; - m_unk0x8c = m_frameBitmap->GetBmiWidth() - 1; - m_unk0x8e = m_frameBitmap->GetBmiHeightAbs() - 1; + m_meterRect.SetLeft(0); + m_meterRect.SetTop(0); + m_meterRect.SetRight(m_frameBitmap->GetBmiWidth() - 1); + m_meterRect.SetBottom(m_frameBitmap->GetBmiHeightAbs() - 1); } // FUNCTION: LEGO1 0x10043a30 +// FUNCTION: BETA10 0x10097a1a void LegoMeterPresenter::RepeatingTickle() { - FUN_10043a50(); + DrawMeter(); MxStillPresenter::RepeatingTickle(); } -// STUB: LEGO1 0x10043a50 -void LegoMeterPresenter::FUN_10043a50() +// FUNCTION: LEGO1 0x10043a50 +// FUNCTION: BETA10 0x10097a40 +void LegoMeterPresenter::DrawMeter() { + const char* strval = VariableTable()->GetVariable(m_variable.GetData()); + MxFloat percent = atof(strval); + MxS16 row, leftRightCol, bottomTopCol, leftRightEnd, bottomTopEnd; + + if (strval != NULL && m_curPercent != percent) { + m_curPercent = percent; + + // DECOMP: This clamp is retail only + if (percent > 0.99) { + m_curPercent = 0.99f; + } + else if (percent < 0.0) { + m_curPercent = 0.0f; + } + + // Copy the previously drawn meter back into the bitmap + memcpy(m_frameBitmap->GetImage(), m_meterPixels, m_frameBitmap->GetDataSize()); + + switch (m_layout) { + case e_leftToRight: + leftRightEnd = m_meterRect.GetWidth() * m_curPercent; + + for (row = m_meterRect.GetTop(); row < m_meterRect.GetBottom(); row++) { + MxU8* line = m_frameBitmap->GetStart(m_meterRect.GetLeft(), row); + + for (leftRightCol = 0; leftRightCol < leftRightEnd; leftRightCol++, line++) { + if (*line) { + *line = m_fillColor; + } + } + } + break; + case e_bottomToTop: + bottomTopEnd = m_meterRect.GetBottom() - (MxS16) (m_meterRect.GetHeight() * m_curPercent); + + for (row = m_meterRect.GetBottom(); row < bottomTopEnd; row--) { + MxU8* line = m_frameBitmap->GetStart(m_meterRect.GetLeft(), row); + + for (bottomTopCol = 0; bottomTopCol < m_meterRect.GetWidth(); bottomTopCol++, line++) { + if (*line) { + *line = m_fillColor; + } + } + } + // break; + default: + // The other two fill options are not implemented. + break; + } + } } diff --git a/LEGO1/omni/include/mxbitmap.h b/LEGO1/omni/include/mxbitmap.h index c9c949be..e0056957 100644 --- a/LEGO1/omni/include/mxbitmap.h +++ b/LEGO1/omni/include/mxbitmap.h @@ -113,6 +113,17 @@ class MxBitmap : public MxCore { // FUNCTION: BETA10 0x100982b0 inline MxLong GetDataSize() const { return AlignToFourByte(m_bmiHeader->biWidth) * GetBmiHeightAbs(); } + // FUNCTION: BETA10 0x1002c4b0 + inline MxBool IsTopDown() + { + if (m_bmiHeader->biCompression == BI_RGB_TOPDOWN) { + return TRUE; + } + else { + return m_bmiHeader->biHeight < 0; + } + } + inline MxLong GetAdjustedStride() { if (m_bmiHeader->biCompression == BI_RGB_TOPDOWN || m_bmiHeader->biHeight < 0) { @@ -123,28 +134,18 @@ class MxBitmap : public MxCore { } } - inline MxLong GetLine(MxS32 p_top) - { - MxS32 height; - if (m_bmiHeader->biCompression == BI_RGB_TOPDOWN || m_bmiHeader->biHeight < 0) { - height = p_top; - } - else { - height = GetBmiHeightAbs() - p_top - 1; - } - return GetBmiStride() * height; - } - + // FUNCTION: BETA10 0x1002c320 inline MxU8* GetStart(MxS32 p_left, MxS32 p_top) { if (m_bmiHeader->biCompression == BI_RGB) { - return GetLine(p_top) + m_data + p_left; + return m_data + p_left + + AlignToFourByte(GetBmiWidth()) * (IsTopDown() ? p_top : (GetBmiHeightAbs() - 1) - p_top); } else if (m_bmiHeader->biCompression == BI_RGB_TOPDOWN) { return m_data; } else { - return GetLine(0) + m_data; + return m_data + AlignToFourByte(GetBmiWidth()) * (IsTopDown() ? 0 : (GetBmiHeightAbs() - 1)); } } diff --git a/LEGO1/omni/include/mxrect16.h b/LEGO1/omni/include/mxrect16.h new file mode 100644 index 00000000..1dd82dc5 --- /dev/null +++ b/LEGO1/omni/include/mxrect16.h @@ -0,0 +1,47 @@ +#ifndef MXRECT16_H +#define MXRECT16_H + +#include "mxtypes.h" + +// SIZE 0x08 +struct MxRect16 { + // FUNCTION: BETA10 0x10097ee0 + MxRect16() {} + + // FUNCTION: BETA10 0x100981f0 + inline void SetLeft(MxS16 p_left) { m_left = p_left; } + + // FUNCTION: BETA10 0x10098220 + inline void SetTop(MxS16 p_top) { m_top = p_top; } + + // FUNCTION: BETA10 0x10098250 + inline void SetRight(MxS16 p_right) { m_right = p_right; } + + // FUNCTION: BETA10 0x10098280 + inline void SetBottom(MxS16 p_bottom) { m_bottom = p_bottom; } + + // FUNCTION: BETA10 0x10098300 + inline MxS16 GetLeft() const { return m_left; } + + // FUNCTION: BETA10 0x10098330 + inline MxS16 GetTop() const { return m_top; } + + // There is no GetRight() + + // FUNCTION: BETA10 0x10098360 + inline MxS16 GetBottom() const { return m_bottom; } + + // FUNCTION: BETA10 0x10098390 + inline MxS16 GetWidth() const { return m_right - m_left + 1; } + + // FUNCTION: BETA10 0x100983c0 + inline MxS16 GetHeight() const { return m_bottom - m_top + 1; } + +private: + MxS16 m_left; // 0x00 + MxS16 m_top; // 0x02 + MxS16 m_right; // 0x04 + MxS16 m_bottom; // 0x06 +}; + +#endif // MXRECT16_H From 36ec252f7e6e0badb7093a7c5e55b5f92de1e407 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 29 May 2024 11:05:50 -0400 Subject: [PATCH 20/28] Implement/match LegoAnimationManager::FUN_10063270 (#965) --- .../legoomni/include/legoanimationmanager.h | 5 +- .../src/common/legoanimationmanager.cpp | 119 +++++++++++++++++- 2 files changed, 119 insertions(+), 5 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index b25b2510..1ad249ea 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -108,7 +108,7 @@ class LegoAnimationManager : public MxCore { void FUN_10062770(); void PurgeExtra(MxBool p_und); void AddExtra(MxS32 p_location, MxBool p_und); - void FUN_10063270(LegoROIList*, LegoAnimPresenter*); + void FUN_10063270(LegoROIList* p_list, LegoAnimPresenter* p_presenter); void FUN_10063780(LegoROIList* p_list); MxResult FUN_10064670(Vector3* p_position); MxResult FUN_10064740(Vector3* p_position); @@ -151,9 +151,12 @@ class LegoAnimationManager : public MxCore { void FUN_10062580(AnimInfo& p_info); MxBool FUN_10062650(Vector3& p_position, float p_und, LegoROI* p_roi); MxBool FUN_10062710(AnimInfo& p_info); + MxBool FUN_10062e20(LegoROI* p_roi, LegoAnimPresenter* p_presenter); + void FUN_10063950(LegoROI* p_roi); void FUN_10063aa0(); MxBool FUN_10063b90(LegoWorld* p_world, LegoExtraActor* p_actor, MxU8 p_mood, MxU32 p_characterId); void FUN_10063d10(); + void FUN_10063e40(LegoAnimPresenter* p_presenter); MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world); MxBool FUN_10064010(LegoPathBoundary* p_boundary, LegoUnknown100db7f4* p_edge, float p_destScale); MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2); diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp index 2d780d0a..60545c39 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp @@ -1396,7 +1396,6 @@ MxLong LegoAnimationManager::Notify(MxParam& p_param) if (roi != NULL) { LegoExtraActor* actor = CharacterManager()->GetActor(roi->GetName()); - if (actor != NULL) { actor->Restart(); } @@ -2030,10 +2029,92 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und) } } -// STUB: LEGO1 0x10063270 -void LegoAnimationManager::FUN_10063270(LegoROIList*, LegoAnimPresenter*) +// STUB: LEGO1 0x10062e20 +// FUNCTION: BETA10 0x100444cb +MxBool LegoAnimationManager::FUN_10062e20(LegoROI* p_roi, LegoAnimPresenter* p_presenter) { - // TODO + return FALSE; +} + +// FUNCTION: LEGO1 0x10063270 +// FUNCTION: BETA10 0x10044b9a +void LegoAnimationManager::FUN_10063270(LegoROIList* p_list, LegoAnimPresenter* p_presenter) +{ + if (p_list != NULL) { + LegoWorld* world = CurrentWorld(); + LegoROI* roi; + MxU32 i; + + for (i = 0; i < sizeOfArray(g_vehicles); i++) { + roi = Lego()->FindROI(g_vehicles[i].m_name); + + if (roi != NULL) { + if (!g_vehicles[i].m_unk0x05 && roi->GetVisibility()) { + g_vehicles[i].m_unk0x04 = TRUE; + } + else { + g_vehicles[i].m_unk0x04 = FALSE; + } + } + } + + LegoROIListCursor cursor(p_list); + + while (cursor.Next(roi)) { + if (roi->GetVisibility() && FUN_10062e20(roi, p_presenter)) { + cursor.Detach(); + FUN_10063950(roi); + } + else { + LegoExtraActor* actor = CharacterManager()->GetActor(roi->GetName()); + + if (actor != NULL) { + for (MxS32 i = 0; i < (MxS32) sizeOfArray(m_extras); i++) { + if (m_extras[i].m_roi == roi) { + if (actor->GetController() != NULL) { + actor->GetController()->RemoveActor(actor); + actor->SetController(NULL); + } + + if (m_extras[i].m_unk0x14) { + m_extras[i].m_unk0x14 = FALSE; + + MxS32 vehicleId = g_characters[m_extras[i].m_characterId].m_vehicleId; + if (vehicleId >= 0) { + g_vehicles[vehicleId].m_unk0x05 = FALSE; + + LegoROI* roi = Lego()->FindROI(g_vehicles[vehicleId].m_name); + if (roi != NULL) { + roi->SetVisibility(FALSE); + } + } + } + + m_extras[i].m_roi = NULL; + g_characters[m_extras[i].m_characterId].m_unk0x04 = FALSE; + g_characters[m_extras[i].m_characterId].m_unk0x07 = FALSE; + m_extras[i].m_characterId = -1; + m_extras[i].m_unk0x0d = FALSE; + m_unk0x414--; + break; + } + } + } + } + } + + FUN_10063e40(p_presenter); + + for (i = 0; i < sizeOfArray(g_vehicles); i++) { + if (!g_vehicles[i].m_unk0x05) { + roi = Lego()->FindROI(g_vehicles[i].m_name); + + if (roi != NULL) { + roi->SetVisibility(FALSE); + } + } + } + } } // FUNCTION: LEGO1 0x10063780 @@ -2054,6 +2135,19 @@ void LegoAnimationManager::FUN_10063780(LegoROIList* p_list) } } +// FUNCTION: LEGO1 0x10063950 +void LegoAnimationManager::FUN_10063950(LegoROI* p_roi) +{ + if (m_unk0x424 != NULL) { + LegoROIListCursor cursor(m_unk0x424); + + if (cursor.Find(p_roi)) { + CharacterManager()->FUN_10083db0(p_roi); + cursor.Detach(); + } + } +} + // FUNCTION: LEGO1 0x10063aa0 void LegoAnimationManager::FUN_10063aa0() { @@ -2171,6 +2265,23 @@ void LegoAnimationManager::FUN_10063d10() } } +// FUNCTION: LEGO1 0x10063e40 +void LegoAnimationManager::FUN_10063e40(LegoAnimPresenter* p_presenter) +{ + if (m_unk0x424 != NULL) { + LegoROIListCursor cursor(m_unk0x424); + LegoROI* roi; + + while (cursor.Next(roi)) { + if (!FUN_10062e20(roi, p_presenter)) { + CharacterManager()->FUN_10083db0(roi); + } + + cursor.Detach(); + } + } +} + // FUNCTION: LEGO1 0x10063fb0 // FUNCTION: BETA10 0x100452a7 MxBool LegoAnimationManager::FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world) From 2f1aa58153b6ef15eb4c360345b26c6fe012e217 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 29 May 2024 11:35:36 -0400 Subject: [PATCH 21/28] Implement/match LegoAnimMMPresenter::FUN_1004b840 (#966) --- .../lego/legoomni/include/legoanimpresenter.h | 1 + .../src/common/legoanimmmpresenter.cpp | 28 ++++++++++++++++--- .../legoomni/src/video/legoanimpresenter.cpp | 11 ++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index d7cc4cb2..44ed14aa 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -81,6 +81,7 @@ class LegoAnimPresenter : public MxVideoPresenter { MxResult FUN_1006afc0(MxMatrix*& p_matrix, float p_und); MxResult FUN_1006b140(LegoROI* p_roi); + void FUN_1006c7a0(); const char* GetActionObjectName(); inline void SetCurrentWorld(LegoWorld* p_currentWorld) { m_currentWorld = p_currentWorld; } diff --git a/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp b/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp index d2e37eba..6b778ad7 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp @@ -16,6 +16,7 @@ #include "mxmisc.h" #include "mxnotificationmanager.h" #include "mxobjectfactory.h" +#include "mxstreamer.h" #include "mxtimer.h" #include "mxutilities.h" @@ -465,10 +466,28 @@ MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time) return TRUE; } -// STUB: LEGO1 0x1004b840 +// FUNCTION: LEGO1 0x1004b840 +// FUNCTION: BETA10 0x1004d033 void LegoAnimMMPresenter::FUN_1004b840() { - // TODO + MxDSAction* action = m_action; + + if (m_presenter != NULL) { + m_presenter->FUN_1006c7a0(); + } + + for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) { + if (*it != m_presenter) { + (*it)->EndAction(); + } + } + + FUN_1004b6d0(0); + EndAction(); + + if (action != NULL) { + Streamer()->FUN_100b98f0(action); + } } // FUNCTION: LEGO1 0x1004b8b0 @@ -478,8 +497,9 @@ MxBool LegoAnimMMPresenter::FUN_1004b8b0() return m_tranInfo != NULL ? m_tranInfo->m_unk0x28 : TRUE; } -// STUB: LEGO1 0x1004b8c0 +// FUNCTION: LEGO1 0x1004b8c0 +// FUNCTION: BETA10 0x1004d13d void LegoAnimMMPresenter::FUN_1004b8c0() { - // TODO + FUN_1004b6d0(0); } diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index 11aa7f40..9d126327 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -1100,6 +1100,17 @@ void LegoAnimPresenter::EndAction() MxVideoPresenter::EndAction(); } +// FUNCTION: LEGO1 0x1006c7a0 +// FUNCTION: BETA10 0x10051da6 +void LegoAnimPresenter::FUN_1006c7a0() +{ + if (m_anim != NULL) { + FUN_1006b9a0(m_anim, m_anim->GetDuration(), m_unk0x78); + } + + m_unk0x95 = TRUE; +} + // FUNCTION: LEGO1 0x1006c7d0 // FUNCTION: BETA10 0x10051e07 void LegoAnimPresenter::VTable0x8c() From b978787f8f0333dd69a60ddd004d23b4d4fd7dc0 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 29 May 2024 13:24:08 -0400 Subject: [PATCH 22/28] Implement/match LegoAnimationManager::FUN_10062e20 (#967) --- .../legoomni/include/legoanimationmanager.h | 2 +- .../legoomni/include/legopathcontroller.h | 6 +- LEGO1/lego/legoomni/include/legoworld.h | 6 +- LEGO1/lego/legoomni/src/actors/helicopter.cpp | 4 +- .../legoomni/src/actors/islepathactor.cpp | 6 +- .../src/common/legoanimationmanager.cpp | 170 ++++++++++++++++-- .../src/common/legoanimmmpresenter.cpp | 6 +- .../legoomni/src/common/legogamestate.cpp | 8 +- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 16 +- .../legoomni/src/paths/legopathcontroller.cpp | 6 +- LEGO1/lego/legoomni/src/worlds/isle.cpp | 14 +- 11 files changed, 197 insertions(+), 47 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index 1ad249ea..e118cbf5 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -28,7 +28,7 @@ class LegoAnimationManager : public MxCore { // SIZE 0x18 struct Character { char* m_name; // 0x00 - MxBool m_unk0x04; // 0x04 + MxBool m_inExtras; // 0x04 MxS8 m_vehicleId; // 0x05 undefined m_unk0x06; // 0x06 (unused?) MxBool m_unk0x07; // 0x07 diff --git a/LEGO1/lego/legoomni/include/legopathcontroller.h b/LEGO1/lego/legoomni/include/legopathcontroller.h index a65a1f34..7bb38b61 100644 --- a/LEGO1/lego/legoomni/include/legopathcontroller.h +++ b/LEGO1/lego/legoomni/include/legopathcontroller.h @@ -81,7 +81,7 @@ class LegoPathController : public MxCore { virtual MxResult Create(MxU8* p_data, const Vector3& p_location, const MxAtomId& p_trigger); // vtable+0x14 virtual void Destroy(); // vtable+0x18 - MxResult FUN_10045c20( + MxResult PlaceActor( LegoPathActor* p_actor, const char* p_name, MxS32 p_src, @@ -89,13 +89,13 @@ class LegoPathController : public MxCore { MxS32 p_dest, float p_destScale ); - MxResult FUN_10046050( + MxResult PlaceActor( LegoPathActor* p_actor, LegoAnimPresenter* p_presenter, Vector3& p_position, Vector3& p_direction ); - MxResult AddActor(LegoPathActor* p_actor); + MxResult PlaceActor(LegoPathActor* p_actor); MxResult RemoveActor(LegoPathActor* p_actor); void FUN_100468f0(LegoAnimPresenter* p_presenter); void FUN_10046930(LegoAnimPresenter* p_presenter); diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 2dd7321a..79088500 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -72,14 +72,14 @@ class LegoWorld : public LegoEntity { MxS32 p_dest, float p_destScale ); - MxResult AddPathActor(LegoPathActor* p_actor); - MxResult FUN_1001fb70( + MxResult PlaceActor(LegoPathActor* p_actor); + MxResult PlaceActor( LegoPathActor* p_actor, LegoAnimPresenter* p_presenter, Vector3& p_position, Vector3& p_direction ); - void RemovePathActor(LegoPathActor* p_actor); + void RemoveActor(LegoPathActor* p_actor); void FUN_1001fda0(LegoAnimPresenter* p_presenter); void FUN_1001fe90(LegoAnimPresenter* p_presenter); LegoPathBoundary* FindPathBoundary(const char* p_name); diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index d3b3ef51..5c0a26b3 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -192,7 +192,7 @@ MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param) if (m_state->GetUnkown8() == 0) { state->SetUnknown18(4); m_state->SetUnknown8(1); - m_world->RemovePathActor(this); + m_world->RemoveActor(this); InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterTakeOff_Anim, NULL); SetState(0); } @@ -205,7 +205,7 @@ MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param) } if (m_state->GetUnkown8() == 2) { m_state->SetUnknown8(3); - m_world->RemovePathActor(this); + m_world->RemoveActor(this); InvokeAction(Extra::ActionType::e_start, script, IsleScript::c_HelicopterLand_Anim, NULL); SetState(4); } diff --git a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp index edaaa314..c3913942 100644 --- a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp +++ b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp @@ -471,7 +471,7 @@ void IslePathActor::SpawnPlayer(LegoGameState::Area p_area, MxBool p_und, MxU8 p assert(world); if (m_world != NULL) { - m_world->RemovePathActor(this); + m_world->RemoveActor(this); m_world->Remove(this); VideoManager()->Get3DManager()->Remove(*m_roi); } @@ -556,7 +556,7 @@ void IslePathActor::SpawnPlayer(LegoGameState::Area p_area, MxBool p_und, MxU8 p void IslePathActor::VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundary, MxBool p_reset) { if (m_world) { - m_world->RemovePathActor(this); + m_world->RemoveActor(this); m_world->Remove(this); VideoManager()->Get3DManager()->GetLego3DView()->Remove(*m_roi); } @@ -566,7 +566,7 @@ void IslePathActor::VTable0xec(MxMatrix p_transform, LegoPathBoundary* p_boundar VTable0xe0(); } - m_world->AddPathActor(this); + m_world->PlaceActor(this); p_boundary->AddActor(this); if (m_actorId != GameState()->GetActorId()) { m_world->Add(this); diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp index 60545c39..39de0c7a 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp @@ -347,7 +347,7 @@ LegoAnimationManager::~LegoAnimationManager() LegoPathActor* actor = CharacterManager()->GetActor(roi->GetName()); if (actor != NULL && actor->GetController() != NULL && CurrentWorld() != NULL) { - CurrentWorld()->RemovePathActor(actor); + CurrentWorld()->RemoveActor(actor); actor->SetController(NULL); } @@ -467,7 +467,7 @@ void LegoAnimationManager::Suspend() m_unk0x401 = FALSE; for (i = 0; i < (MxS32) sizeOfArray(g_characters); i++) { - g_characters[i].m_unk0x04 = FALSE; + g_characters[i].m_inExtras = FALSE; } } } @@ -531,7 +531,7 @@ void LegoAnimationManager::Init() for (i = 0; i < (MxS32) sizeOfArray(g_characters); i++) { g_characters[i].m_active = FALSE; - g_characters[i].m_unk0x04 = FALSE; + g_characters[i].m_inExtras = FALSE; } for (i = 0; i < (MxS32) sizeOfArray(g_vehicles); i++) { @@ -1468,7 +1468,7 @@ MxResult LegoAnimationManager::Tickle() } m_extras[i].m_roi = NULL; - g_characters[m_extras[i].m_characterId].m_unk0x04 = FALSE; + g_characters[m_extras[i].m_characterId].m_inExtras = FALSE; g_characters[m_extras[i].m_characterId].m_unk0x07 = FALSE; m_extras[i].m_characterId = -1; m_extras[i].m_unk0x0d = FALSE; @@ -1837,7 +1837,7 @@ void LegoAnimationManager::PurgeExtra(MxBool p_und) } m_extras[i].m_roi = NULL; - g_characters[m_extras[i].m_characterId].m_unk0x04 = FALSE; + g_characters[m_extras[i].m_characterId].m_inExtras = FALSE; g_characters[m_extras[i].m_characterId].m_unk0x07 = FALSE; m_extras[i].m_characterId = -1; } @@ -1928,7 +1928,7 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und) tryNextCharacter: if (g_characters[m_lastExtraCharacterId].m_unk0x09 && g_characters[m_lastExtraCharacterId].m_unk0x08 && - !g_characters[m_lastExtraCharacterId].m_unk0x04 && + !g_characters[m_lastExtraCharacterId].m_inExtras && g_characters[m_lastExtraCharacterId].m_active == active) { if (!CharacterManager()->FUN_10083b20(g_characters[m_lastExtraCharacterId].m_name )) { @@ -1994,7 +1994,7 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und) actor->SetWorldSpeed(speed); m_extras[i].m_characterId = m_lastExtraCharacterId; - g_characters[m_lastExtraCharacterId].m_unk0x04 = TRUE; + g_characters[m_lastExtraCharacterId].m_inExtras = TRUE; m_extras[i].m_unk0x08 = Timer()->GetTime(); m_extras[i].m_speed = -1; m_extras[i].m_unk0x0d = FALSE; @@ -2029,10 +2029,160 @@ void LegoAnimationManager::AddExtra(MxS32 p_location, MxBool p_und) } } -// STUB: LEGO1 0x10062e20 +// FUNCTION: LEGO1 0x10062e20 // FUNCTION: BETA10 0x100444cb MxBool LegoAnimationManager::FUN_10062e20(LegoROI* p_roi, LegoAnimPresenter* p_presenter) { + LegoWorld* world = CurrentWorld(); + + if (world == NULL || m_suspended || !m_unk0x400) { + return FALSE; + } + + MxBool inExtras = FALSE; + const char* name = p_roi->GetName(); + + LegoExtraActor* actor = CharacterManager()->GetActor(name); + if (actor != NULL) { + MxS32 characterId = -1; + MxS32 i; + + for (i = 0; i < (MxS32) sizeOfArray(g_characters); i++) { + if (!strcmpi(name, g_characters[i].m_name)) { + characterId = i; + break; + } + } + + if (characterId == -1) { + return FALSE; + } + + if (!g_characters[characterId].m_inExtras) { + for (i = 0; i < (MxS32) sizeOfArray(m_extras); i++) { + if (m_extras[i].m_roi == NULL) { + m_extras[i].m_roi = p_roi; + break; + } + } + + if (i == (MxS32) sizeOfArray(m_extras)) { + return FALSE; + } + } + else { + inExtras = TRUE; + + for (i = 0; i < (MxS32) sizeOfArray(m_extras); i++) { + if (m_extras[i].m_roi == p_roi) { + break; + } + } + + if (i == (MxS32) sizeOfArray(m_extras)) { + return FALSE; + } + } + + if (g_characters[characterId].m_unk0x07) { + m_unk0x414--; + + if (actor->GetBoundary() == NULL) { + g_characters[characterId].m_unk0x07 = FALSE; + + if (g_characters[characterId].m_unk0x0c < 0) { + g_characters[characterId].m_unk0x0c = 0; + } + + if (g_characters[characterId].m_unk0x10 < 0) { + g_characters[characterId].m_unk0x10 = 0; + } + + m_extras[i].m_roi = NULL; + g_characters[characterId].m_unk0x07 = FALSE; + g_characters[characterId].m_inExtras = FALSE; + return FALSE; + } + + CharacterManager()->FUN_10083db0(p_roi); + } + else { + if (inExtras) { + return FALSE; + } + } + + if (GameState()->GetCurrentAct() != LegoGameState::e_act1 && !strcmp(name, "brickstr")) { + return FALSE; + } + + MxBool local24 = inExtras && g_characters[characterId].m_unk0x07 && + (g_characters[characterId].m_unk0x0c < 0 || g_characters[characterId].m_unk0x10 < 0); + + MxResult result = 1; // Not a valid MxResult value + + if (!local24) { + MxU8 unk0x0c; + + switch (rand() % 3) { + case 0: + unk0x0c = 1; + break; + case 1: + unk0x0c = 2; + break; + case 2: + unk0x0c = 0; + break; + } + + actor->SetUnknown0x0c(unk0x0c); + + Mx3DPointFloat position; + Mx3DPointFloat direction; + + position = p_roi->GetWorldPosition(); + direction = p_roi->GetWorldDirection(); + + ((Vector3&) direction).Mul(-1.0f); + m_extras[i].m_speed = -1.0f; + + if (inExtras) { + actor->ClearMaps(); + } + + if (FUN_10063b90(world, actor, CharacterManager()->GetMood(p_roi), characterId)) { + m_extras[i].m_unk0x14 = TRUE; + } + else { + m_extras[i].m_unk0x14 = FALSE; + } + + result = world->PlaceActor(actor, p_presenter, position, direction); + } + + if (result != SUCCESS && g_characters[characterId].m_unk0x07) { + result = world->PlaceActor(actor); + } + + g_characters[characterId].m_unk0x07 = FALSE; + + if (result != SUCCESS) { + m_extras[i].m_roi = NULL; + g_characters[characterId].m_inExtras = FALSE; + } + else { + m_extras[i].m_characterId = characterId; + m_extras[i].m_unk0x08 = Timer()->GetTime(); + m_extras[i].m_unk0x0c = TRUE; + m_extras[i].m_unk0x0d = FALSE; + g_characters[characterId].m_inExtras = TRUE; + actor->SetWorldSpeed(0.0f); + m_unk0x414++; + return TRUE; + } + } + return FALSE; } @@ -2091,7 +2241,7 @@ void LegoAnimationManager::FUN_10063270(LegoROIList* p_list, LegoAnimPresenter* } m_extras[i].m_roi = NULL; - g_characters[m_extras[i].m_characterId].m_unk0x04 = FALSE; + g_characters[m_extras[i].m_characterId].m_inExtras = FALSE; g_characters[m_extras[i].m_characterId].m_unk0x07 = FALSE; m_extras[i].m_characterId = -1; m_extras[i].m_unk0x0d = FALSE; @@ -2510,7 +2660,7 @@ MxResult LegoAnimationManager::FUN_10064380( g_characters[characterId].m_unk0x0c = p_unk0x0c; g_characters[characterId].m_unk0x10 = p_unk0x10; - g_characters[characterId].m_unk0x04 = TRUE; + g_characters[characterId].m_inExtras = TRUE; return SUCCESS; } diff --git a/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp b/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp index 6b778ad7..b88392e5 100644 --- a/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp +++ b/LEGO1/lego/legoomni/src/common/legoanimmmpresenter.cpp @@ -433,7 +433,7 @@ MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time) undefined4 und = 1; if (m_presenter != NULL) { - m_unk0x64->RemovePathActor(actor); + m_unk0x64->RemoveActor(actor); if (m_tranInfo->m_unk0x29) { Mx3DPointFloat position, direction; @@ -442,7 +442,7 @@ MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time) direction = viewROI->GetWorldDirection(); position[1] -= 1.25; - und = m_unk0x64->FUN_1001fb70(actor, m_presenter, position, direction); + und = m_unk0x64->PlaceActor(actor, m_presenter, position, direction); } else { und = 0; @@ -452,7 +452,7 @@ MxBool LegoAnimMMPresenter::FUN_1004b6d0(MxLong p_time) if (und != 0) { viewROI->WrappedSetLocalTransform(m_tranInfo->m_unk0x2c); VideoManager()->Get3DManager()->Moved(*viewROI); - m_unk0x64->AddPathActor(actor); + m_unk0x64->PlaceActor(actor); } if (m_tranInfo->m_unk0x29) { diff --git a/LEGO1/lego/legoomni/src/common/legogamestate.cpp b/LEGO1/lego/legoomni/src/common/legogamestate.cpp index 79d6b1d4..64f4c494 100644 --- a/LEGO1/lego/legoomni/src/common/legogamestate.cpp +++ b/LEGO1/lego/legoomni/src/common/legogamestate.cpp @@ -1102,28 +1102,28 @@ void LegoGameState::Init() Helicopter* copter = (Helicopter*) isle->Find(*g_copterScript, CopterScript::c_Helicopter_Actor); if (copter) { - isle->RemovePathActor(copter); + isle->RemoveActor(copter); isle->VTable0x6c(copter); delete copter; } DuneBuggy* dunebuggy = (DuneBuggy*) isle->Find(*g_dunecarScript, DunecarScript::c_DuneBugy_Actor); if (dunebuggy) { - isle->RemovePathActor(dunebuggy); + isle->RemoveActor(dunebuggy); isle->VTable0x6c(dunebuggy); delete dunebuggy; } Jetski* jetski = (Jetski*) isle->Find(*g_jetskiScript, JetskiScript::c_Jetski_Actor); if (jetski) { - isle->RemovePathActor(jetski); + isle->RemoveActor(jetski); isle->VTable0x6c(jetski); delete jetski; } RaceCar* racecar = (RaceCar*) isle->Find(*g_racecarScript, RacecarScript::c_RaceCar_Actor); if (racecar) { - isle->RemovePathActor(racecar); + isle->RemoveActor(racecar); isle->VTable0x6c(racecar); delete racecar; } diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index b0cb72dd..5d4dcd00 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -286,7 +286,7 @@ MxResult LegoWorld::PlaceActor( LegoPathController* controller; while (cursor.Next(controller)) { - if (controller->FUN_10045c20(p_actor, p_name, p_src, p_srcScale, p_dest, p_destScale) == SUCCESS) { + if (controller->PlaceActor(p_actor, p_name, p_src, p_srcScale, p_dest, p_destScale) == SUCCESS) { return SUCCESS; } } @@ -295,13 +295,13 @@ MxResult LegoWorld::PlaceActor( } // FUNCTION: LEGO1 0x1001fa70 -MxResult LegoWorld::AddPathActor(LegoPathActor* p_actor) +MxResult LegoWorld::PlaceActor(LegoPathActor* p_actor) { LegoPathControllerListCursor cursor(&m_list0x68); LegoPathController* controller; while (cursor.Next(controller)) { - if (controller->AddActor(p_actor) == SUCCESS) { + if (controller->PlaceActor(p_actor) == SUCCESS) { return SUCCESS; } } @@ -310,7 +310,7 @@ MxResult LegoWorld::AddPathActor(LegoPathActor* p_actor) } // FUNCTION: LEGO1 0x1001fb70 -MxResult LegoWorld::FUN_1001fb70( +MxResult LegoWorld::PlaceActor( LegoPathActor* p_actor, LegoAnimPresenter* p_presenter, Vector3& p_position, @@ -321,7 +321,7 @@ MxResult LegoWorld::FUN_1001fb70( LegoPathController* controller; while (cursor.Next(controller)) { - if (controller->FUN_10046050(p_actor, p_presenter, p_position, p_direction) == SUCCESS) { + if (controller->PlaceActor(p_actor, p_presenter, p_position, p_direction) == SUCCESS) { return SUCCESS; } } @@ -330,7 +330,7 @@ MxResult LegoWorld::FUN_1001fb70( } // FUNCTION: LEGO1 0x1001fc80 -void LegoWorld::RemovePathActor(LegoPathActor* p_actor) +void LegoWorld::RemoveActor(LegoPathActor* p_actor) { LegoPathControllerListCursor cursor(&m_list0x68); LegoPathController* controller; @@ -502,7 +502,7 @@ void LegoWorld::Remove(MxCore* p_object) } else if (p_object->IsA("MxEntity")) { if (p_object->IsA("LegoPathActor")) { - RemovePathActor((LegoPathActor*) p_object); + RemoveActor((LegoPathActor*) p_object); } if (m_entityList) { @@ -703,7 +703,7 @@ void LegoWorld::Enable(MxBool p_enable) LegoPathActor* actor = CurrentActor(); if (actor) { - RemovePathActor(actor); + RemoveActor(actor); } AnimationManager()->Reset(FALSE); diff --git a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp index eeed3661..3a5a763b 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp @@ -198,7 +198,7 @@ MxResult LegoPathController::Tickle() // FUNCTION: LEGO1 0x10045c20 // FUNCTION: BETA10 0x100b6d80 -MxResult LegoPathController::FUN_10045c20( +MxResult LegoPathController::PlaceActor( LegoPathActor* p_actor, const char* p_name, MxS32 p_src, @@ -229,7 +229,7 @@ MxResult LegoPathController::FUN_10045c20( // FUNCTION: LEGO1 0x10046050 // FUNCTION: BETA10 0x100b6f35 -MxResult LegoPathController::FUN_10046050( +MxResult LegoPathController::PlaceActor( LegoPathActor* p_actor, LegoAnimPresenter* p_presenter, Vector3& p_position, @@ -303,7 +303,7 @@ MxResult LegoPathController::FUN_10046050( // FUNCTION: LEGO1 0x100466a0 // FUNCTION: BETA10 0x100b71fe -MxResult LegoPathController::AddActor(LegoPathActor* p_actor) +MxResult LegoPathController::PlaceActor(LegoPathActor* p_actor) { if (p_actor->GetController() != NULL) { p_actor->GetController()->RemoveActor(p_actor); diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 9e692616..8c061f99 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -590,7 +590,7 @@ void Isle::Enable(MxBool p_enable) m_act1state->m_unk0x018 = 5; } - AddPathActor(CurrentActor()); + PlaceActor(CurrentActor()); SetIsWorldActive(TRUE); #ifdef COMPAT_MODE @@ -613,7 +613,7 @@ void Isle::Enable(MxBool p_enable) SetIsWorldActive(FALSE); break; case LegoGameState::e_bike: - AddPathActor(CurrentActor()); + PlaceActor(CurrentActor()); SetIsWorldActive(TRUE); #ifdef COMPAT_MODE @@ -626,7 +626,7 @@ void Isle::Enable(MxBool p_enable) #endif break; case LegoGameState::e_dunecar: - AddPathActor(CurrentActor()); + PlaceActor(CurrentActor()); SetIsWorldActive(TRUE); #ifdef COMPAT_MODE @@ -639,7 +639,7 @@ void Isle::Enable(MxBool p_enable) #endif break; case LegoGameState::e_motocycle: - AddPathActor(CurrentActor()); + PlaceActor(CurrentActor()); SetIsWorldActive(TRUE); #ifdef COMPAT_MODE @@ -652,7 +652,7 @@ void Isle::Enable(MxBool p_enable) #endif break; case LegoGameState::e_copter: - AddPathActor(CurrentActor()); + PlaceActor(CurrentActor()); SetIsWorldActive(TRUE); #ifdef COMPAT_MODE @@ -665,7 +665,7 @@ void Isle::Enable(MxBool p_enable) #endif break; case LegoGameState::e_skateboard: - AddPathActor(CurrentActor()); + PlaceActor(CurrentActor()); SetIsWorldActive(TRUE); #ifdef COMPAT_MODE @@ -678,7 +678,7 @@ void Isle::Enable(MxBool p_enable) #endif break; case LegoGameState::e_jetski: - AddPathActor(CurrentActor()); + PlaceActor(CurrentActor()); SetIsWorldActive(TRUE); #ifdef COMPAT_MODE From 085bdbe74bb08575f3a9d53cd9547aecd9ce33bf Mon Sep 17 00:00:00 2001 From: MS Date: Wed, 29 May 2024 16:52:45 -0400 Subject: [PATCH 23/28] Beta match MxPalette (#968) * Beta match MxPalette * Modern compiler fix --- LEGO1/omni/include/mxpalette.h | 7 +- LEGO1/omni/src/video/mxpalette.cpp | 215 ++++++++++++++++++----------- 2 files changed, 138 insertions(+), 84 deletions(-) diff --git a/LEGO1/omni/include/mxpalette.h b/LEGO1/omni/include/mxpalette.h index 4f38c91b..6d1c61e7 100644 --- a/LEGO1/omni/include/mxpalette.h +++ b/LEGO1/omni/include/mxpalette.h @@ -7,6 +7,7 @@ #include // VTABLE: LEGO1 0x100dc848 +// VTABLE: BETA10 0x101c2300 // SIZE 0x414 class MxPalette : public MxCore { public: @@ -26,9 +27,13 @@ class MxPalette : public MxCore { void Reset(MxBool p_ignoreSkyColor); LPDIRECTDRAWPALETTE CreateNativePalette(); - inline void SetOverrideSkyColor(MxBool p_value) { this->m_overrideSkyColor = p_value; } + void SetPalette(LPDIRECTDRAWPALETTE p_palette); + + // FUNCTION: BETA10 0x100d92c0 + inline void SetOverrideSkyColor(MxBool p_value) { m_overrideSkyColor = p_value; } // SYNTHETIC: LEGO1 0x100beeb0 + // SYNTHETIC: BETA10 0x10144640 // MxPalette::`scalar deleting destructor' private: diff --git a/LEGO1/omni/src/video/mxpalette.cpp b/LEGO1/omni/src/video/mxpalette.cpp index f3a3e599..7738a198 100644 --- a/LEGO1/omni/src/video/mxpalette.cpp +++ b/LEGO1/omni/src/video/mxpalette.cpp @@ -4,6 +4,7 @@ #include "mxvideomanager.h" // GLOBAL: LEGO1 0x10102188 +// GLOBAL: BETA10 0x10203558 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}, @@ -72,32 +73,35 @@ PALETTEENTRY g_defaultPaletteEntries[256] = { }; // FUNCTION: LEGO1 0x100bee30 +// FUNCTION: BETA10 0x10143b50 MxPalette::MxPalette() { - this->m_overrideSkyColor = FALSE; - this->m_palette = NULL; - GetDefaultPalette(this->m_entries); - this->m_skyColor = this->m_entries[141]; + m_overrideSkyColor = FALSE; + m_palette = NULL; + GetDefaultPalette(m_entries); + m_skyColor = m_entries[141]; } // FUNCTION: LEGO1 0x100beed0 +// FUNCTION: BETA10 0x10143bf4 MxPalette::MxPalette(const RGBQUAD* p_colors) { - this->m_overrideSkyColor = FALSE; - this->m_palette = NULL; - ApplySystemEntriesToPalette(this->m_entries); + m_overrideSkyColor = FALSE; + m_palette = NULL; + ApplySystemEntriesToPalette(m_entries); for (MxS32 i = 10; i < 246; i++) { - this->m_entries[i].peRed = p_colors[i].rgbRed; - this->m_entries[i].peGreen = p_colors[i].rgbGreen; - this->m_entries[i].peBlue = p_colors[i].rgbBlue; - this->m_entries[i].peFlags = 0; + m_entries[i].peRed = p_colors[i].rgbRed; + m_entries[i].peGreen = p_colors[i].rgbGreen; + m_entries[i].peBlue = p_colors[i].rgbBlue; + m_entries[i].peFlags = 0; } - this->m_skyColor = this->m_entries[141]; + m_skyColor = m_entries[141]; } // FUNCTION: LEGO1 0x100bef90 +// FUNCTION: BETA10 0x10143d01 MxPalette::~MxPalette() { if (m_palette) { @@ -106,97 +110,123 @@ MxPalette::~MxPalette() } // FUNCTION: LEGO1 0x100bf000 +// FUNCTION: BETA10 0x10143d88 LPDIRECTDRAWPALETTE MxPalette::CreateNativePalette() { - MxS32 i; - if (this->m_palette == NULL) { + if (m_palette == NULL) { + MxS32 i; for (i = 0; i < 10; i++) { - this->m_entries[i].peFlags = 0x80; - } - for (i = 10; i < 136; i++) { - this->m_entries[i].peFlags = 0x44; - } - for (i = 136; i < 140; i++) { - this->m_entries[i].peFlags = 0x84; - } - this->m_entries[140].peFlags = 0x84; - this->m_entries[141].peFlags = 0x44; - for (i = 142; i < 246; i++) { - this->m_entries[i].peFlags = 0x84; - } - for (i = 246; i < 256; i++) { - this->m_entries[i].peFlags = 0x80; + m_entries[i].peFlags = D3DPAL_RESERVED; } - if (MVideoManager() && MVideoManager()->GetDirectDraw()) { - MVideoManager()->GetDirectDraw()->CreatePalette(DDPCAPS_8BIT, this->m_entries, &this->m_palette, NULL); + for (; i < 136; i++) { + m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE; + } + + for (; i < 140; i++) { + m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE; + } + + m_entries[i++].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE; + m_entries[i++].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE; + + for (; i < 246; i++) { + m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE; + } + + for (; i < 256; i++) { + m_entries[i].peFlags = D3DPAL_RESERVED; + } + + if (!MVideoManager()) { + goto done; + } + + if (!MVideoManager()->GetDirectDraw()) { + goto done; + } + + if (MVideoManager()->GetDirectDraw()->CreatePalette(DDPCAPS_8BIT, m_entries, &m_palette, NULL)) { + goto done; } } - return this->m_palette; +done: + return m_palette; } // FUNCTION: LEGO1 0x100bf0b0 +// FUNCTION: BETA10 0x10143f13 MxPalette* MxPalette::Clone() { MxPalette* result = new MxPalette; - this->GetEntries(result->m_entries); - result->m_overrideSkyColor = this->m_overrideSkyColor; + GetEntries(result->m_entries); + result->SetOverrideSkyColor(m_overrideSkyColor); return result; } // FUNCTION: LEGO1 0x100bf150 +// FUNCTION: BETA10 0x10143fc8 MxResult MxPalette::GetEntries(LPPALETTEENTRY p_entries) { - memcpy(p_entries, this->m_entries, sizeof(this->m_entries)); + memcpy(p_entries, m_entries, sizeof(m_entries)); return SUCCESS; } // FUNCTION: LEGO1 0x100bf170 +// FUNCTION: BETA10 0x10143ffa MxResult MxPalette::SetEntries(LPPALETTEENTRY p_entries) { - MxS32 i; MxResult status = SUCCESS; - if (this->m_palette) { + if (m_palette) { + MxS32 i; for (i = 0; i < 10; i++) { - this->m_entries[i].peFlags = 0x80; - } - for (i = 10; i < 136; i++) { - this->m_entries[i].peFlags = 68; - this->m_entries[i].peRed = p_entries[i].peRed; - this->m_entries[i].peGreen = p_entries[i].peGreen; - this->m_entries[i].peBlue = p_entries[i].peBlue; - } - for (i = 136; i < 140; i++) { - this->m_entries[i].peFlags = 132; - this->m_entries[i].peRed = p_entries[i].peRed; - this->m_entries[i].peGreen = p_entries[i].peGreen; - this->m_entries[i].peBlue = p_entries[i].peBlue; - } - if (!this->m_overrideSkyColor) { - this->m_entries[140].peFlags = 0x44; - this->m_entries[140].peRed = p_entries[140].peRed; - this->m_entries[140].peGreen = p_entries[140].peGreen; - this->m_entries[140].peBlue = p_entries[140].peBlue; - this->m_entries[141].peFlags = 0x84; - this->m_entries[141].peRed = p_entries[141].peRed; - this->m_entries[141].peGreen = p_entries[141].peGreen; - this->m_entries[141].peBlue = p_entries[141].peBlue; + m_entries[i].peFlags = D3DPAL_RESERVED; } - for (i = 142; i < 246; i++) { - this->m_entries[i].peFlags = 132; - this->m_entries[i].peRed = p_entries[i].peRed; - this->m_entries[i].peGreen = p_entries[i].peGreen; - this->m_entries[i].peBlue = p_entries[i].peBlue; + for (; i < 136; i++) { + m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE; + m_entries[i].peRed = p_entries[i].peRed; + m_entries[i].peGreen = p_entries[i].peGreen; + m_entries[i].peBlue = p_entries[i].peBlue; } - for (i = 246; i < 256; i++) { - this->m_entries[i].peFlags = 0x80; + for (; i < 140; i++) { + m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE; + m_entries[i].peRed = p_entries[i].peRed; + m_entries[i].peGreen = p_entries[i].peGreen; + m_entries[i].peBlue = p_entries[i].peBlue; } - if (this->m_palette->SetEntries(0, 0, 256, this->m_entries)) { + if (!m_overrideSkyColor) { + m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE; + m_entries[i].peRed = p_entries[i].peRed; + m_entries[i].peGreen = p_entries[i].peGreen; + m_entries[i].peBlue = p_entries[i].peBlue; + i++; + m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE; + m_entries[i].peRed = p_entries[i].peRed; + m_entries[i].peGreen = p_entries[i].peGreen; + m_entries[i].peBlue = p_entries[i].peBlue; + i++; + } + else { + i = 142; + } + + for (; i < 246; i++) { + m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE; + m_entries[i].peRed = p_entries[i].peRed; + m_entries[i].peGreen = p_entries[i].peGreen; + m_entries[i].peBlue = p_entries[i].peBlue; + } + + for (; i < 256; i++) { + m_entries[i].peFlags = D3DPAL_RESERVED; + } + + if (m_palette->SetEntries(0, 0, 256, m_entries)) { status = FAILURE; } } @@ -205,38 +235,53 @@ MxResult MxPalette::SetEntries(LPPALETTEENTRY p_entries) } // FUNCTION: LEGO1 0x100bf2d0 +// FUNCTION: BETA10 0x101442aa MxResult MxPalette::SetSkyColor(LPPALETTEENTRY p_skyColor) { MxResult status = 0; - if (this->m_palette != NULL) { - this->m_entries[141].peRed = p_skyColor->peRed; - this->m_entries[141].peGreen = p_skyColor->peGreen; - this->m_entries[141].peBlue = p_skyColor->peBlue; - this->m_skyColor = this->m_entries[141]; - if (this->m_palette->SetEntries(0, 141, 1, &this->m_skyColor)) { + if (m_palette != NULL) { + m_entries[141].peRed = p_skyColor->peRed; + m_entries[141].peGreen = p_skyColor->peGreen; + m_entries[141].peBlue = p_skyColor->peBlue; + m_skyColor = m_entries[141]; + if (m_palette->SetEntries(0, 141, 1, &m_skyColor)) { status = -1; } } return status; } +// FUNCTION: BETA10 0x1014434a +void MxPalette::SetPalette(LPDIRECTDRAWPALETTE p_palette) +{ + if (m_palette) { + m_palette->Release(); + } + + m_palette = p_palette; +} + // FUNCTION: LEGO1 0x100bf330 +// FUNCTION: BETA10 0x1014438a void MxPalette::Detach() { - this->m_palette = NULL; + m_palette = NULL; } // FUNCTION: LEGO1 0x100bf340 +// FUNCTION: BETA10 0x101443aa MxBool MxPalette::operator==(MxPalette& p_other) { for (MxS32 i = 0; i < 256; i++) { - if (this->m_entries[i].peRed != p_other.m_entries[i].peRed) { + if (m_entries[i].peRed != p_other.m_entries[i].peRed) { return FALSE; } - if (this->m_entries[i].peGreen != p_other.m_entries[i].peGreen) { + + if (m_entries[i].peGreen != p_other.m_entries[i].peGreen) { return FALSE; } - if (this->m_entries[i].peBlue != p_other.m_entries[i].peBlue) { + + if (m_entries[i].peBlue != p_other.m_entries[i].peBlue) { return FALSE; } } @@ -244,6 +289,7 @@ MxBool MxPalette::operator==(MxPalette& p_other) } // FUNCTION: LEGO1 0x100bf390 +// FUNCTION: BETA10 0x1014445a void MxPalette::ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries) { HDC hdc; @@ -261,6 +307,7 @@ void MxPalette::ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries) } // FUNCTION: LEGO1 0x100bf420 +// FUNCTION: BETA10 0x10144517 void MxPalette::GetDefaultPalette(LPPALETTEENTRY p_entries) { HDC hdc; @@ -278,14 +325,16 @@ void MxPalette::GetDefaultPalette(LPPALETTEENTRY p_entries) } // FUNCTION: LEGO1 0x100bf490 +// FUNCTION: BETA10 0x101445bf void MxPalette::Reset(MxBool p_ignoreSkyColor) { - if (this->m_palette != NULL) { - GetDefaultPalette(this->m_entries); + if (m_palette != NULL) { + GetDefaultPalette(m_entries); if (!p_ignoreSkyColor) { - this->m_entries[140] = this->m_entries[141] = this->m_skyColor; + m_entries[140] = m_entries[141] = m_skyColor; } - SetEntries(this->m_entries); - this->m_palette->SetEntries(0, 0, 256, this->m_entries); + + SetEntries(m_entries); + m_palette->SetEntries(0, 0, 256, m_entries); } } From 689178f68906785692da1ea577f07118c82c078d Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 30 May 2024 08:48:14 -0400 Subject: [PATCH 24/28] Implement/match LegoCameraController::FUN_10012290 and FUN_10012320 (#969) --- .../lego/legoomni/include/legocameracontroller.h | 4 ++-- .../legoomni/src/entity/legocameracontroller.cpp | 15 ++++++++++----- LEGO1/realtime/matrix.h | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocameracontroller.h b/LEGO1/lego/legoomni/include/legocameracontroller.h index f7325286..8e6e4989 100644 --- a/LEGO1/lego/legoomni/include/legocameracontroller.h +++ b/LEGO1/lego/legoomni/include/legocameracontroller.h @@ -36,8 +36,8 @@ class LegoCameraController : public LegoPointOfViewController { virtual MxResult Create(); // vtable+0x44 void SetWorldTransform(const Vector3& p_at, const Vector3& p_dir, const Vector3& p_up); - void FUN_10012290(float); - void FUN_10012320(MxFloat); + void FUN_10012290(float p_angle); + void FUN_10012320(float p_angle); void FUN_100123e0(const Matrix4& p_transform, MxU32 p_und); Mx3DPointFloat GetWorldUp(); Mx3DPointFloat GetWorldLocation(); diff --git a/LEGO1/lego/legoomni/src/entity/legocameracontroller.cpp b/LEGO1/lego/legoomni/src/entity/legocameracontroller.cpp index 6025f614..da455eab 100644 --- a/LEGO1/lego/legoomni/src/entity/legocameracontroller.cpp +++ b/LEGO1/lego/legoomni/src/entity/legocameracontroller.cpp @@ -124,15 +124,20 @@ void LegoCameraController::SetWorldTransform(const Vector3& p_at, const Vector3& m_matrix2 = m_matrix1; } -// STUB: LEGO1 0x10012290 -void LegoCameraController::FUN_10012290(float) +// FUNCTION: LEGO1 0x10012290 +// FUNCTION: BETA10 0x10068c34 +void LegoCameraController::FUN_10012290(float p_angle) { + m_matrix1 = m_matrix2; + m_matrix1.RotateZ(p_angle); } -// STUB: LEGO1 0x10012320 -void LegoCameraController::FUN_10012320(MxFloat) +// FUNCTION: LEGO1 0x10012320 +// FUNCTION: BETA10 0x10068c73 +void LegoCameraController::FUN_10012320(float p_angle) { - // TODO + m_matrix1 = m_matrix2; + m_matrix1.RotateY(p_angle); } // FUNCTION: LEGO1 0x100123e0 diff --git a/LEGO1/realtime/matrix.h b/LEGO1/realtime/matrix.h index df2260ea..f90cc3e8 100644 --- a/LEGO1/realtime/matrix.h +++ b/LEGO1/realtime/matrix.h @@ -133,6 +133,20 @@ class Matrix4 { } } + // FUNCTION: BETA10 0x1001fd60 + inline void RotateY(const float& p_angle) + { + float s = sin(p_angle); + float c = cos(p_angle); + float matrix[4][4]; + memcpy(matrix, m_data, sizeof(float) * 16); + for (int i = 0; i < 4; i++) { + m_data[i][0] = matrix[i][0] * c + matrix[i][2] * s; + m_data[i][2] = matrix[i][2] * c - matrix[i][0] * s; + } + } + + // FUNCTION: BETA10 0x1006ab10 inline void RotateZ(const float& p_angle) { float s = sin(p_angle); From ae859fbc19308e8d8d8176bdae28fee50572b9a4 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 30 May 2024 09:15:16 -0400 Subject: [PATCH 25/28] Implement/match LegoControlManager::FUN_100293c0 (#970) --- .../legoomni/include/legocontrolmanager.h | 2 +- .../legoomni/include/mxcontrolpresenter.h | 4 +++- .../src/common/mxcontrolpresenter.cpp | 6 ++--- .../src/control/legocontrolmanager.cpp | 22 +++++++++++++++++-- LEGO1/lego/legoomni/src/worlds/infocenter.cpp | 10 ++++----- LEGO1/omni/include/mxdsobject.h | 1 + 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocontrolmanager.h b/LEGO1/lego/legoomni/include/legocontrolmanager.h index 46719167..f5274a31 100644 --- a/LEGO1/lego/legoomni/include/legocontrolmanager.h +++ b/LEGO1/lego/legoomni/include/legocontrolmanager.h @@ -63,7 +63,7 @@ class LegoControlManager : public MxCore { void Register(MxCore* p_listener); void Unregister(MxCore* p_listener); MxBool FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter); - void FUN_100293c0(undefined4, const char*, undefined2); + void FUN_100293c0(MxU32 p_objectId, const char* p_atom, MxS16 p_unk0x4e); MxControlPresenter* FUN_100294e0(MxS32 p_x, MxS32 p_y); MxBool FUN_10029630(); MxBool FUN_10029750(); diff --git a/LEGO1/lego/legoomni/include/mxcontrolpresenter.h b/LEGO1/lego/legoomni/include/mxcontrolpresenter.h index e12c1a25..49f9e975 100644 --- a/LEGO1/lego/legoomni/include/mxcontrolpresenter.h +++ b/LEGO1/lego/legoomni/include/mxcontrolpresenter.h @@ -37,11 +37,13 @@ class MxControlPresenter : public MxCompositePresenter { void Enable(MxBool p_enable) override; // vtable+0x54 MxBool VTable0x64(undefined4 p_undefined) override; // vtable+0x64 virtual void VTable0x68(MxBool p_unk0x50); // vtable+0x68 - virtual void VTable0x6c(MxS16); // vtable+0x6c + virtual void VTable0x6c(MxS16 p_unk0x4e); // vtable+0x6c MxBool FUN_10044480(LegoControlManagerEvent* p_event, MxPresenter* p_presenter); MxBool FUN_10044270(MxS32 p_x, MxS32 p_y, MxVideoPresenter* p_presenter); + inline MxS16 GetUnknown0x4e() { return m_unk0x4e; } + private: undefined2 m_unk0x4c; // 0x4c MxS16 m_unk0x4e; // 0x4e diff --git a/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp b/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp index 5c2eec3d..c0cbed68 100644 --- a/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp +++ b/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp @@ -206,9 +206,9 @@ MxBool MxControlPresenter::FUN_10044480(LegoControlManagerEvent* p_event, MxPres } // FUNCTION: LEGO1 0x10044540 -void MxControlPresenter::VTable0x6c(MxS16 p_val) +void MxControlPresenter::VTable0x6c(MxS16 p_unk0x4e) { - if (p_val == -1) { + if (p_unk0x4e == -1) { if ((MxS16) ((MxDSMultiAction*) m_action)->GetActionList()->GetCount() - m_unk0x4e == 1) { m_unk0x4e = 0; } @@ -217,7 +217,7 @@ void MxControlPresenter::VTable0x6c(MxS16 p_val) } } else { - m_unk0x4e = p_val; + m_unk0x4e = p_unk0x4e; } m_action->SetUnknown90(Timer()->GetTime()); diff --git a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp index a7ca2c20..b0864024 100644 --- a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp +++ b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp @@ -116,9 +116,27 @@ void LegoControlManager::FUN_100292e0() } } -// STUB: LEGO1 0x100293c0 -void LegoControlManager::FUN_100293c0(undefined4, const char*, undefined2) +// FUNCTION: LEGO1 0x100293c0 +void LegoControlManager::FUN_100293c0(MxU32 p_objectId, const char* p_atom, MxS16 p_unk0x4e) { + if (m_presenterList) { + MxPresenterListCursor cursor(m_presenterList); + MxPresenter* control; + + while (cursor.Next(control)) { + MxDSAction* action = control->GetAction(); + + if (action->GetObjectId() == p_objectId && action->GetAtomId().GetInternal() == p_atom) { + ((MxControlPresenter*) control)->VTable0x6c(p_unk0x4e); + + if (((MxControlPresenter*) control)->GetUnknown0x4e() == 0) { + g_unk0x100f31b0 = -1; + g_unk0x100f31b4 = NULL; + break; + } + } + } + } } // FUNCTION: LEGO1 0x100294e0 diff --git a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp index b88db8b5..55de745e 100644 --- a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp @@ -246,7 +246,7 @@ MxLong Infocenter::HandleEndAction(MxEndActionNotificationParam& p_param) } if (action->GetObjectId() == InfomainScript::c_iicx26in_RunAnim) { - ControlManager()->FUN_100293c0(0x10, action->GetAtomId().GetInternal(), 0); + ControlManager()->FUN_100293c0(InfomainScript::c_BigInfo_Ctl, action->GetAtomId().GetInternal(), 0); m_unk0x1d6 = 0; } @@ -1159,16 +1159,16 @@ MxResult Infocenter::Tickle() m_unk0x1d6 += 100; if (m_unk0x1d6 > 3400 && m_unk0x1d6 < 3650) { - ControlManager()->FUN_100293c0(0x10, m_atom.GetInternal(), 1); + ControlManager()->FUN_100293c0(InfomainScript::c_BigInfo_Ctl, m_atom.GetInternal(), 1); } else if (m_unk0x1d6 > 3650 && m_unk0x1d6 < 3900) { - ControlManager()->FUN_100293c0(0x10, m_atom.GetInternal(), 0); + ControlManager()->FUN_100293c0(InfomainScript::c_BigInfo_Ctl, m_atom.GetInternal(), 0); } else if (m_unk0x1d6 > 3900 && m_unk0x1d6 < 4150) { - ControlManager()->FUN_100293c0(0x10, m_atom.GetInternal(), 1); + ControlManager()->FUN_100293c0(InfomainScript::c_BigInfo_Ctl, m_atom.GetInternal(), 1); } else if (m_unk0x1d6 > 4400) { - ControlManager()->FUN_100293c0(0x10, m_atom.GetInternal(), 0); + ControlManager()->FUN_100293c0(InfomainScript::c_BigInfo_Ctl, m_atom.GetInternal(), 0); m_unk0x1d6 = 0; } } diff --git a/LEGO1/omni/include/mxdsobject.h b/LEGO1/omni/include/mxdsobject.h index 8fe2426c..396b67ba 100644 --- a/LEGO1/omni/include/mxdsobject.h +++ b/LEGO1/omni/include/mxdsobject.h @@ -62,6 +62,7 @@ class MxDSObject : public MxCore { // FUNCTION: BETA10 0x1012efb0 inline const char* GetSourceName() const { return m_sourceName; } + inline const char* GetObjectName() const { return m_objectName; } inline MxU32 GetObjectId() { return m_objectId; } inline const MxAtomId& GetAtomId() { return m_atomId; } From 650903d043b7638d1a164d6cec60725aff83c25c Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 30 May 2024 09:54:24 -0400 Subject: [PATCH 26/28] Implement/match Pizzeria::HandleClick (#971) --- LEGO1/lego/legoomni/include/ambulance.h | 14 ++++---- LEGO1/lego/legoomni/include/bike.h | 8 ++--- LEGO1/lego/legoomni/include/dunebuggy.h | 12 +++---- LEGO1/lego/legoomni/include/elevatorbottom.h | 2 +- LEGO1/lego/legoomni/include/gasstation.h | 12 +++---- LEGO1/lego/legoomni/include/helicopter.h | 4 +-- LEGO1/lego/legoomni/include/hospital.h | 2 +- LEGO1/lego/legoomni/include/infocenter.h | 2 +- LEGO1/lego/legoomni/include/infocenterdoor.h | 2 +- LEGO1/lego/legoomni/include/isle.h | 2 +- LEGO1/lego/legoomni/include/isleactor.h | 2 +- LEGO1/lego/legoomni/include/islepathactor.h | 4 +-- LEGO1/lego/legoomni/include/jetski.h | 10 +++--- LEGO1/lego/legoomni/include/jukebox.h | 2 +- LEGO1/lego/legoomni/include/motocycle.h | 12 +++---- LEGO1/lego/legoomni/include/pizza.h | 3 +- .../lego/legoomni/include/pizzamissionstate.h | 2 -- LEGO1/lego/legoomni/include/pizzeria.h | 2 +- LEGO1/lego/legoomni/include/pizzeriastate.h | 2 ++ LEGO1/lego/legoomni/include/police.h | 2 +- LEGO1/lego/legoomni/include/racecar.h | 2 +- LEGO1/lego/legoomni/include/radio.h | 2 +- .../lego/legoomni/include/registrationbook.h | 2 +- LEGO1/lego/legoomni/include/skateboard.h | 10 +++--- LEGO1/lego/legoomni/include/towtrack.h | 4 +-- LEGO1/lego/legoomni/src/actors/ambulance.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/bike.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/dunebuggy.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/helicopter.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/isleactor.cpp | 4 +-- .../legoomni/src/actors/islepathactor.cpp | 8 ++--- LEGO1/lego/legoomni/src/actors/jetski.cpp | 4 +-- .../legoomni/src/actors/jukeboxentity.cpp | 2 +- LEGO1/lego/legoomni/src/actors/motorcycle.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/pizza.cpp | 7 +++- LEGO1/lego/legoomni/src/actors/pizzeria.cpp | 30 +++++++++++++--- LEGO1/lego/legoomni/src/actors/racecar.cpp | 2 +- LEGO1/lego/legoomni/src/actors/radio.cpp | 6 ++-- LEGO1/lego/legoomni/src/actors/skateboard.cpp | 4 +-- LEGO1/lego/legoomni/src/actors/towtrack.cpp | 4 +-- .../legoomni/src/build/buildingentity.cpp | 2 +- .../src/common/mxcontrolpresenter.cpp | 4 +-- LEGO1/lego/legoomni/src/entity/legoentity.cpp | 2 +- .../legoomni/src/input/legoinputmanager.cpp | 4 +-- .../src/pizzeria/pizzamissionstate.cpp | 1 + .../legoomni/src/pizzeria/pizzeriastate.cpp | 6 ++++ .../legoomni/src/worlds/elevatorbottom.cpp | 6 ++-- LEGO1/lego/legoomni/src/worlds/gasstation.cpp | 6 ++-- LEGO1/lego/legoomni/src/worlds/hospital.cpp | 6 ++-- LEGO1/lego/legoomni/src/worlds/infocenter.cpp | 6 ++-- .../legoomni/src/worlds/infocenterdoor.cpp | 6 ++-- LEGO1/lego/legoomni/src/worlds/isle.cpp | 36 +++++++++---------- LEGO1/lego/legoomni/src/worlds/jukebox.cpp | 6 ++-- LEGO1/lego/legoomni/src/worlds/police.cpp | 6 ++-- .../legoomni/src/worlds/registrationbook.cpp | 6 ++-- LEGO1/lego/legoomni/src/worlds/score.cpp | 2 +- LEGO1/omni/include/mxnotificationparam.h | 4 +-- 57 files changed, 178 insertions(+), 143 deletions(-) diff --git a/LEGO1/lego/legoomni/include/ambulance.h b/LEGO1/lego/legoomni/include/ambulance.h index 9e4b95b7..0edd9cae 100644 --- a/LEGO1/lego/legoomni/include/ambulance.h +++ b/LEGO1/lego/legoomni/include/ambulance.h @@ -28,13 +28,13 @@ class Ambulance : public IslePathActor { return !strcmp(p_name, Ambulance::ClassName()) || IslePathActor::IsA(p_name); } - MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c - void VTable0x70(float p_float) override; // vtable+0x70 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 - MxU32 VTable0xdc(MxType19NotificationParam&) override; // vtable+0xdc - void VTable0xe4() override; // vtable+0xe4 + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c + void VTable0x70(float p_float) override; // vtable+0x70 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 HandleControl(LegoControlManagerEvent& p_param) override; // vtable+0xd4 + MxU32 VTable0xdc(MxType19NotificationParam&) override; // vtable+0xdc + void VTable0xe4() override; // vtable+0xe4 void CreateState(); void FUN_10036e60(); diff --git a/LEGO1/lego/legoomni/include/bike.h b/LEGO1/lego/legoomni/include/bike.h index 7355d1a7..a71747ad 100644 --- a/LEGO1/lego/legoomni/include/bike.h +++ b/LEGO1/lego/legoomni/include/bike.h @@ -23,10 +23,10 @@ class Bike : public IslePathActor { return !strcmp(p_name, Bike::ClassName()) || IslePathActor::IsA(p_name); } - MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 - void VTable0xe4() override; // vtable+0xe4 + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 HandleControl(LegoControlManagerEvent& p_param) override; // vtable+0xd4 + void VTable0xe4() override; // vtable+0xe4 void FUN_10076b60(); diff --git a/LEGO1/lego/legoomni/include/dunebuggy.h b/LEGO1/lego/legoomni/include/dunebuggy.h index c10ea949..6abe2881 100644 --- a/LEGO1/lego/legoomni/include/dunebuggy.h +++ b/LEGO1/lego/legoomni/include/dunebuggy.h @@ -23,12 +23,12 @@ class DuneBuggy : public IslePathActor { return !strcmp(p_name, DuneBuggy::ClassName()) || IslePathActor::IsA(p_name); } - MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - void VTable0x70(float p_float) override; // vtable+0x70 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 - MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc - void VTable0xe4() override; // vtable+0xe4 + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + void VTable0x70(float p_float) override; // vtable+0x70 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 HandleControl(LegoControlManagerEvent& p_param) override; // vtable+0xd4 + MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc + void VTable0xe4() override; // vtable+0xe4 void FUN_10068350(); diff --git a/LEGO1/lego/legoomni/include/elevatorbottom.h b/LEGO1/lego/legoomni/include/elevatorbottom.h index 81db82d6..7c94aff2 100644 --- a/LEGO1/lego/legoomni/include/elevatorbottom.h +++ b/LEGO1/lego/legoomni/include/elevatorbottom.h @@ -44,7 +44,7 @@ class ElevatorBottom : public LegoWorld { private: LegoGameState::Area m_destLocation; // 0xf8 - MxLong HandleClick(LegoControlManagerEvent& p_param); + MxLong HandleControl(LegoControlManagerEvent& p_param); }; #endif // ELEVATORBOTTOM_H diff --git a/LEGO1/lego/legoomni/include/gasstation.h b/LEGO1/lego/legoomni/include/gasstation.h index 51e7a3da..0709f0ad 100644 --- a/LEGO1/lego/legoomni/include/gasstation.h +++ b/LEGO1/lego/legoomni/include/gasstation.h @@ -32,12 +32,12 @@ class GasStation : public LegoWorld { return !strcmp(p_name, GasStation::ClassName()) || LegoWorld::IsA(p_name); } - MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - void ReadyWorld() override; // vtable+0x50 - MxBool VTable0x5c() override; // vtable+0x5c - MxBool Escape() override; // vtable+0x64 - void Enable(MxBool p_enable) override; // vtable+0x68 - virtual MxLong HandleClick(LegoControlManagerEvent& p_param); // vtable+0x6c + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + void ReadyWorld() override; // vtable+0x50 + MxBool VTable0x5c() override; // vtable+0x5c + MxBool Escape() override; // vtable+0x64 + void Enable(MxBool p_enable) override; // vtable+0x68 + virtual MxLong HandleControl(LegoControlManagerEvent& p_param); // vtable+0x6c inline void PlayAction(MxU32 p_objectId); diff --git a/LEGO1/lego/legoomni/include/helicopter.h b/LEGO1/lego/legoomni/include/helicopter.h index 867763be..638f9287 100644 --- a/LEGO1/lego/legoomni/include/helicopter.h +++ b/LEGO1/lego/legoomni/include/helicopter.h @@ -29,8 +29,8 @@ class Helicopter : public IslePathActor { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void VTable0x70(float p_float) override; // vtable+0x70 void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 HandleControl(LegoControlManagerEvent& p_param) override; // vtable+0xd4 MxU32 VTable0xd8(LegoEndAnimNotificationParam& p_param) override; // vtable+0xd8 void VTable0xe4() override; // vtable+0xe4 diff --git a/LEGO1/lego/legoomni/include/hospital.h b/LEGO1/lego/legoomni/include/hospital.h index 9f9c8e4c..014e872d 100644 --- a/LEGO1/lego/legoomni/include/hospital.h +++ b/LEGO1/lego/legoomni/include/hospital.h @@ -49,7 +49,7 @@ class Hospital : public LegoWorld { MxLong HandleKeyPress(MxS8 p_key); MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleButtonDown(LegoControlManagerEvent& p_param); - MxBool HandleClick(LegoControlManagerEvent& p_param); + MxBool HandleControl(LegoControlManagerEvent& p_param); MxS16 m_currentActorId; // 0xf8 LegoGameState::Area m_destLocation; // 0xfc diff --git a/LEGO1/lego/legoomni/include/infocenter.h b/LEGO1/lego/legoomni/include/infocenter.h index f0ed8697..08bb9a2c 100644 --- a/LEGO1/lego/legoomni/include/infocenter.h +++ b/LEGO1/lego/legoomni/include/infocenter.h @@ -79,7 +79,7 @@ class Infocenter : public LegoWorld { MxLong HandleKeyPress(MxS8 p_key); MxU8 HandleMouseMove(MxS32 p_x, MxS32 p_y); MxU8 HandleButtonUp(MxS32 p_x, MxS32 p_y); - MxU8 HandleClick(LegoControlManagerEvent& p_param); + MxU8 HandleControl(LegoControlManagerEvent& p_param); MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleNotification0(MxNotificationParam& p_param); diff --git a/LEGO1/lego/legoomni/include/infocenterdoor.h b/LEGO1/lego/legoomni/include/infocenterdoor.h index 9cb0c49d..6d012b4c 100644 --- a/LEGO1/lego/legoomni/include/infocenterdoor.h +++ b/LEGO1/lego/legoomni/include/infocenterdoor.h @@ -43,7 +43,7 @@ class InfocenterDoor : public LegoWorld { private: LegoGameState::Area m_destLocation; // 0xf8 - MxLong HandleClick(LegoControlManagerEvent& p_param); + MxLong HandleControl(LegoControlManagerEvent& p_param); }; #endif // INFOCENTERDOOR_H diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 878cef90..e9d4da42 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -71,7 +71,7 @@ class Isle : public LegoWorld { protected: MxLong HandleEndAction(MxEndActionNotificationParam& p_param); - MxLong HandleClick(LegoControlManagerEvent& p_param); + MxLong HandleControl(LegoControlManagerEvent& p_param); MxLong HandleType19Notification(MxType19NotificationParam& p_param); MxLong HandleTransitionEnd(); void HandleElevatorEndAction(); diff --git a/LEGO1/lego/legoomni/include/isleactor.h b/LEGO1/lego/legoomni/include/isleactor.h index ad2e985d..388db2c2 100644 --- a/LEGO1/lego/legoomni/include/isleactor.h +++ b/LEGO1/lego/legoomni/include/isleactor.h @@ -29,7 +29,7 @@ class IsleActor : public LegoActor { MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 // FUNCTION: LEGO1 0x1000e5f0 - virtual undefined4 VTable0x68() { return 0; } // vtable+0x68 + virtual undefined4 HandleClick() { return 0; } // vtable+0x68 // FUNCTION: LEGO1 0x1000e600 virtual undefined4 VTable0x6c() { return 0; } // vtable+0x6c diff --git a/LEGO1/lego/legoomni/include/islepathactor.h b/LEGO1/lego/legoomni/include/islepathactor.h index 43d301cf..758039ff 100644 --- a/LEGO1/lego/legoomni/include/islepathactor.h +++ b/LEGO1/lego/legoomni/include/islepathactor.h @@ -106,13 +106,13 @@ class IslePathActor : public LegoPathActor { void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c // FUNCTION: LEGO1 0x10002e70 - virtual MxU32 VTable0xcc() { return 0; } // vtable+0xcc + virtual MxU32 HandleClick() { return 0; } // vtable+0xcc // FUNCTION: LEGO1 0x10002df0 virtual MxU32 VTable0xd0() { return 0; } // vtable+0xd0 // FUNCTION: LEGO1 0x10002e80 - virtual MxU32 VTable0xd4(LegoControlManagerEvent&) { return 0; } // vtable+0xd4 + virtual MxU32 HandleControl(LegoControlManagerEvent&) { return 0; } // vtable+0xd4 // FUNCTION: LEGO1 0x10002e90 virtual MxU32 VTable0xd8(LegoEndAnimNotificationParam&) { return 0; } // vtable+0xd8 diff --git a/LEGO1/lego/legoomni/include/jetski.h b/LEGO1/lego/legoomni/include/jetski.h index 263b2a4f..773513f9 100644 --- a/LEGO1/lego/legoomni/include/jetski.h +++ b/LEGO1/lego/legoomni/include/jetski.h @@ -25,11 +25,11 @@ class Jetski : public IslePathActor { return !strcmp(p_name, Jetski::ClassName()) || IslePathActor::IsA(p_name); } - MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - void VTable0x70(float p_float) override; // vtable+0x70 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd4(LegoControlManagerEvent&) override; // vtable+0xd4 - void VTable0xe4() override; // vtable+0xe4 + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + void VTable0x70(float p_float) override; // vtable+0x70 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 HandleControl(LegoControlManagerEvent&) override; // vtable+0xd4 + void VTable0xe4() override; // vtable+0xe4 void FUN_1007e990(); diff --git a/LEGO1/lego/legoomni/include/jukebox.h b/LEGO1/lego/legoomni/include/jukebox.h index 05618523..2ee17f37 100644 --- a/LEGO1/lego/legoomni/include/jukebox.h +++ b/LEGO1/lego/legoomni/include/jukebox.h @@ -41,7 +41,7 @@ class JukeBox : public LegoWorld { // JukeBox::`scalar deleting destructor' private: - MxBool HandleClick(LegoControlManagerEvent& p_param); + MxBool HandleControl(LegoControlManagerEvent& p_param); LegoGameState::Area m_destLocation; // 0xf8 JukeBoxState* m_state; // 0xfc diff --git a/LEGO1/lego/legoomni/include/motocycle.h b/LEGO1/lego/legoomni/include/motocycle.h index 638018f0..e23e87ad 100644 --- a/LEGO1/lego/legoomni/include/motocycle.h +++ b/LEGO1/lego/legoomni/include/motocycle.h @@ -23,12 +23,12 @@ class Motocycle : public IslePathActor { return !strcmp(p_name, Motocycle::ClassName()) || IslePathActor::IsA(p_name); } - MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - void VTable0x70(float p_float) override; // vtable+0x70 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 - MxU32 VTable0xdc(MxType19NotificationParam&) override; // vtable+0xdc - void VTable0xe4() override; // vtable+0xe4 + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + void VTable0x70(float p_float) override; // vtable+0x70 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 HandleControl(LegoControlManagerEvent& p_param) override; // vtable+0xd4 + MxU32 VTable0xdc(MxType19NotificationParam&) override; // vtable+0xdc + void VTable0xe4() override; // vtable+0xe4 void FUN_10035e10(); diff --git a/LEGO1/lego/legoomni/include/pizza.h b/LEGO1/lego/legoomni/include/pizza.h index f845868f..01e99d7f 100644 --- a/LEGO1/lego/legoomni/include/pizza.h +++ b/LEGO1/lego/legoomni/include/pizza.h @@ -31,11 +31,12 @@ class Pizza : public IsleActor { } MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - undefined4 VTable0x68() override; // vtable+0x68 + undefined4 HandleClick() override; // vtable+0x68 undefined4 HandleEndAction(MxEndActionNotificationParam&) override; // vtable+0x74 undefined4 VTable0x80(MxParam&) override; // vtable+0x80 void CreateState(); + void FUN_10038220(MxU32 p_objectId); void FUN_100382b0(); void FUN_10038380(); diff --git a/LEGO1/lego/legoomni/include/pizzamissionstate.h b/LEGO1/lego/legoomni/include/pizzamissionstate.h index 1796dde4..c74ea4b1 100644 --- a/LEGO1/lego/legoomni/include/pizzamissionstate.h +++ b/LEGO1/lego/legoomni/include/pizzamissionstate.h @@ -37,10 +37,8 @@ class PizzaMissionState : public LegoState { // SYNTHETIC: LEGO1 0x10039350 // PizzaMissionState::`scalar deleting destructor' -private: PizzaMissionStateEntry* GetState(MxU8 p_id); -protected: undefined4 m_unk0x08; // 0x08 undefined4 m_unk0x0c; // 0x0c PizzaMissionStateEntry m_state[5]; // 0x10 diff --git a/LEGO1/lego/legoomni/include/pizzeria.h b/LEGO1/lego/legoomni/include/pizzeria.h index 0991d00a..91f76f46 100644 --- a/LEGO1/lego/legoomni/include/pizzeria.h +++ b/LEGO1/lego/legoomni/include/pizzeria.h @@ -27,7 +27,7 @@ class Pizzeria : public IsleActor { } MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - undefined4 VTable0x68() override; // vtable+0x68 + undefined4 HandleClick() override; // vtable+0x68 void CreateState(); diff --git a/LEGO1/lego/legoomni/include/pizzeriastate.h b/LEGO1/lego/legoomni/include/pizzeriastate.h index 6ddd23cd..6bed2aad 100644 --- a/LEGO1/lego/legoomni/include/pizzeriastate.h +++ b/LEGO1/lego/legoomni/include/pizzeriastate.h @@ -36,6 +36,8 @@ class PizzeriaState : public LegoState { // SYNTHETIC: LEGO1 0x10017ce0 // PizzeriaState::`scalar deleting destructor' + MxU32 FUN_10017d70(); + private: Playlist m_unk0x08[5]; // 0x08 PizzeriaStateStruct m_unk0x44; // 0x44 diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h index 3760f22a..67c3586a 100644 --- a/LEGO1/lego/legoomni/include/police.h +++ b/LEGO1/lego/legoomni/include/police.h @@ -43,7 +43,7 @@ class Police : public LegoWorld { // Police::`scalar deleting destructor' private: - MxLong HandleClick(LegoControlManagerEvent& p_param); + MxLong HandleControl(LegoControlManagerEvent& p_param); MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleKeyPress(LegoEventNotificationParam& p_param); diff --git a/LEGO1/lego/legoomni/include/racecar.h b/LEGO1/lego/legoomni/include/racecar.h index 462c2dbe..72174c8f 100644 --- a/LEGO1/lego/legoomni/include/racecar.h +++ b/LEGO1/lego/legoomni/include/racecar.h @@ -25,7 +25,7 @@ class RaceCar : public IslePathActor { } MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - MxU32 VTable0xcc() override; // vtable+0xcc + MxU32 HandleClick() override; // vtable+0xcc // SYNTHETIC: LEGO1 0x10028400 // RaceCar::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/radio.h b/LEGO1/lego/legoomni/include/radio.h index 50b4de6f..997c6579 100644 --- a/LEGO1/lego/legoomni/include/radio.h +++ b/LEGO1/lego/legoomni/include/radio.h @@ -45,7 +45,7 @@ class Radio : public MxCore { MxBool m_audioEnabled; // 0x0d MxLong HandleEndAction(MxEndActionNotificationParam& p_param); - MxLong HandleClick(LegoControlManagerEvent& p_param); + MxLong HandleControl(LegoControlManagerEvent& p_param); }; #endif // RADIO_H diff --git a/LEGO1/lego/legoomni/include/registrationbook.h b/LEGO1/lego/legoomni/include/registrationbook.h index ee4e55f8..fb561453 100644 --- a/LEGO1/lego/legoomni/include/registrationbook.h +++ b/LEGO1/lego/legoomni/include/registrationbook.h @@ -64,7 +64,7 @@ class RegistrationBook : public LegoWorld { MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleKeyPress(MxU8 p_key); - MxLong HandleClick(LegoControlManagerEvent& p_param); + MxLong HandleControl(LegoControlManagerEvent& p_param); MxLong HandleNotification19(MxParam& p_param); void FUN_100775c0(MxS16 p_playerIndex); void WriteInfocenterLetters(MxS16); diff --git a/LEGO1/lego/legoomni/include/skateboard.h b/LEGO1/lego/legoomni/include/skateboard.h index 60cadaa2..26007aed 100644 --- a/LEGO1/lego/legoomni/include/skateboard.h +++ b/LEGO1/lego/legoomni/include/skateboard.h @@ -26,11 +26,11 @@ class SkateBoard : public IslePathActor { return !strcmp(p_name, SkateBoard::ClassName()) || IslePathActor::IsA(p_name); } - MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd0() override; // vtable+0xd0 - MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 - void VTable0xe4() override; // vtable+0xe4 + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 VTable0xd0() override; // vtable+0xd0 + MxU32 HandleControl(LegoControlManagerEvent& p_param) override; // vtable+0xd4 + void VTable0xe4() override; // vtable+0xe4 inline void SetUnknown0x160(MxBool p_unk0x160) { m_unk0x160 = p_unk0x160; } diff --git a/LEGO1/lego/legoomni/include/towtrack.h b/LEGO1/lego/legoomni/include/towtrack.h index add3a9f6..4f4f1bb5 100644 --- a/LEGO1/lego/legoomni/include/towtrack.h +++ b/LEGO1/lego/legoomni/include/towtrack.h @@ -28,8 +28,8 @@ class TowTrack : public IslePathActor { MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void VTable0x70(float p_float) override; // vtable+0x70 - MxU32 VTable0xcc() override; // vtable+0xcc - MxU32 VTable0xd4(LegoControlManagerEvent& p_param) override; // vtable+0xd4 + MxU32 HandleClick() override; // vtable+0xcc + MxU32 HandleControl(LegoControlManagerEvent& p_param) override; // vtable+0xd4 MxU32 VTable0xd8(LegoEndAnimNotificationParam& p_param) override; // vtable+0xd8 MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc void VTable0xe4() override; // vtable+0xe4 diff --git a/LEGO1/lego/legoomni/src/actors/ambulance.cpp b/LEGO1/lego/legoomni/src/actors/ambulance.cpp index b6bc7584..2d293972 100644 --- a/LEGO1/lego/legoomni/src/actors/ambulance.cpp +++ b/LEGO1/lego/legoomni/src/actors/ambulance.cpp @@ -103,7 +103,7 @@ MxU32 Ambulance::VTable0xdc(MxType19NotificationParam& p_param) } // STUB: LEGO1 0x10036ce0 -MxU32 Ambulance::VTable0xcc() +MxU32 Ambulance::HandleClick() { // TODO return 0; @@ -122,7 +122,7 @@ void Ambulance::VTable0xe4() } // STUB: LEGO1 0x10036f90 -MxU32 Ambulance::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 Ambulance::HandleControl(LegoControlManagerEvent& p_param) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/bike.cpp b/LEGO1/lego/legoomni/src/actors/bike.cpp index e6be2228..20b6e904 100644 --- a/LEGO1/lego/legoomni/src/actors/bike.cpp +++ b/LEGO1/lego/legoomni/src/actors/bike.cpp @@ -45,14 +45,14 @@ void Bike::VTable0xe4() } // STUB: LEGO1 0x100769a0 -MxU32 Bike::VTable0xcc() +MxU32 Bike::HandleClick() { // TODO return 0; } // STUB: LEGO1 0x10076aa0 -MxU32 Bike::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 Bike::HandleControl(LegoControlManagerEvent& p_param) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/dunebuggy.cpp b/LEGO1/lego/legoomni/src/actors/dunebuggy.cpp index 3331d82f..30923948 100644 --- a/LEGO1/lego/legoomni/src/actors/dunebuggy.cpp +++ b/LEGO1/lego/legoomni/src/actors/dunebuggy.cpp @@ -31,14 +31,14 @@ void DuneBuggy::VTable0xe4() } // STUB: LEGO1 0x10068060 -MxU32 DuneBuggy::VTable0xcc() +MxU32 DuneBuggy::HandleClick() { // TODO return 0; } // STUB: LEGO1 0x100681b0 -MxU32 DuneBuggy::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 DuneBuggy::HandleControl(LegoControlManagerEvent& p_param) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index 5c0a26b3..dee0a47b 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -104,7 +104,7 @@ void Helicopter::VTable0xe4() } // FUNCTION: LEGO1 0x10003480 -MxU32 Helicopter::VTable0xcc() +MxU32 Helicopter::HandleClick() { if (!FUN_1003ef60()) { return 1; @@ -153,7 +153,7 @@ MxU32 Helicopter::VTable0xcc() } // FUNCTION: LEGO1 0x100035e0 -MxU32 Helicopter::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 Helicopter::HandleControl(LegoControlManagerEvent& p_param) { MxU32 ret = 0; MxAtomId script; diff --git a/LEGO1/lego/legoomni/src/actors/isleactor.cpp b/LEGO1/lego/legoomni/src/actors/isleactor.cpp index a09c62d7..66d8bf02 100644 --- a/LEGO1/lego/legoomni/src/actors/isleactor.cpp +++ b/LEGO1/lego/legoomni/src/actors/isleactor.cpp @@ -42,8 +42,8 @@ MxLong IsleActor::Notify(MxParam& p_param) case c_notificationButtonDown: result = HandleButtonDown((MxNotificationParam&) p_param); break; - case c_notificationType11: - result = VTable0x68(); + case c_notificationClick: + result = HandleClick(); break; case c_notificationEndAnim: result = VTable0x70(); diff --git a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp index c3913942..b4f1266a 100644 --- a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp +++ b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp @@ -53,11 +53,11 @@ MxLong IslePathActor::Notify(MxParam& p_param) case c_notificationType0: ret = VTable0xd0(); break; - case c_notificationType11: - ret = VTable0xcc(); - break; case c_notificationClick: - ret = VTable0xd4((LegoControlManagerEvent&) p_param); + ret = HandleClick(); + break; + case c_notificationControl: + ret = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationEndAnim: ret = VTable0xd8((LegoEndAnimNotificationParam&) p_param); diff --git a/LEGO1/lego/legoomni/src/actors/jetski.cpp b/LEGO1/lego/legoomni/src/actors/jetski.cpp index 8ac6924b..2b26d842 100644 --- a/LEGO1/lego/legoomni/src/actors/jetski.cpp +++ b/LEGO1/lego/legoomni/src/actors/jetski.cpp @@ -30,14 +30,14 @@ void Jetski::VTable0xe4() } // STUB: LEGO1 0x1007e750 -MxU32 Jetski::VTable0xcc() +MxU32 Jetski::HandleClick() { // TODO return 0; } // STUB: LEGO1 0x1007e8e0 -MxU32 Jetski::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 Jetski::HandleControl(LegoControlManagerEvent& p_param) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp b/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp index 72905a76..a4c505a2 100644 --- a/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp +++ b/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp @@ -32,7 +32,7 @@ JukeBoxEntity::~JukeBoxEntity() // FUNCTION: LEGO1 0x10085e40 MxLong JukeBoxEntity::Notify(MxParam& p_param) { - if (((MxNotificationParam&) p_param).GetType() == c_notificationType11) { + if (((MxNotificationParam&) p_param).GetType() == c_notificationClick) { if (!FUN_1003ef60()) { return 1; } diff --git a/LEGO1/lego/legoomni/src/actors/motorcycle.cpp b/LEGO1/lego/legoomni/src/actors/motorcycle.cpp index 68ce7950..a716d266 100644 --- a/LEGO1/lego/legoomni/src/actors/motorcycle.cpp +++ b/LEGO1/lego/legoomni/src/actors/motorcycle.cpp @@ -31,14 +31,14 @@ void Motocycle::VTable0xe4() } // STUB: LEGO1 0x10035c50 -MxU32 Motocycle::VTable0xcc() +MxU32 Motocycle::HandleClick() { // TODO return 0; } // STUB: LEGO1 0x10035d70 -MxU32 Motocycle::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 Motocycle::HandleControl(LegoControlManagerEvent& p_param) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/pizza.cpp b/LEGO1/lego/legoomni/src/actors/pizza.cpp index d3779d40..9185de23 100644 --- a/LEGO1/lego/legoomni/src/actors/pizza.cpp +++ b/LEGO1/lego/legoomni/src/actors/pizza.cpp @@ -56,6 +56,11 @@ void Pizza::CreateState() } } +// STUB: LEGO1 0x10038220 +void Pizza::FUN_10038220(MxU32 p_objectId) +{ +} + // STUB: LEGO1 0x100382b0 void Pizza::FUN_100382b0() { @@ -67,7 +72,7 @@ void Pizza::FUN_10038380() } // STUB: LEGO1 0x100383f0 -undefined4 Pizza::VTable0x68() +undefined4 Pizza::HandleClick() { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/pizzeria.cpp b/LEGO1/lego/legoomni/src/actors/pizzeria.cpp index 2d72fd56..46139dd7 100644 --- a/LEGO1/lego/legoomni/src/actors/pizzeria.cpp +++ b/LEGO1/lego/legoomni/src/actors/pizzeria.cpp @@ -1,7 +1,17 @@ #include "pizzeria.h" +#include "isle_actions.h" +#include "islepathactor.h" +#include "legoanimationmanager.h" #include "legogamestate.h" +#include "legopathactor.h" +#include "legoutils.h" +#include "legoworld.h" #include "misc.h" +#include "pizza.h" +#include "pizzamissionstate.h" +#include "pizzeriastate.h" +#include "scripts.h" DECOMP_SIZE_ASSERT(Pizzeria, 0x84) @@ -35,9 +45,21 @@ void Pizzeria::CreateState() m_pizzaMissionState = pizzaMissionState; } -// STUB: LEGO1 0x10017a50 -undefined4 Pizzeria::VTable0x68() +// FUNCTION: LEGO1 0x10017a50 +undefined4 Pizzeria::HandleClick() { - // TODO - return 0; + if (FUN_1003ef60() && m_pizzaMissionState->m_unk0x0c == 0) { + if (CurrentActor()->GetActorId() != GameState()->GetActorId()) { + if (!CurrentActor()->IsA("SkateBoard")) { + ((IslePathActor*) CurrentActor())->VTable0xe4(); + } + } + + AnimationManager()->FUN_10061010(FALSE); + + Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor); + pizza->FUN_10038220(m_pizzeriaState->FUN_10017d70()); + } + + return 1; } diff --git a/LEGO1/lego/legoomni/src/actors/racecar.cpp b/LEGO1/lego/legoomni/src/actors/racecar.cpp index 3907a7d0..e32fab62 100644 --- a/LEGO1/lego/legoomni/src/actors/racecar.cpp +++ b/LEGO1/lego/legoomni/src/actors/racecar.cpp @@ -26,7 +26,7 @@ MxResult RaceCar::Create(MxDSAction& p_dsAction) } // STUB: LEGO1 0x100284d0 -MxU32 RaceCar::VTable0xcc() +MxU32 RaceCar::HandleClick() { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/actors/radio.cpp b/LEGO1/lego/legoomni/src/actors/radio.cpp index 537bf080..f625e787 100644 --- a/LEGO1/lego/legoomni/src/actors/radio.cpp +++ b/LEGO1/lego/legoomni/src/actors/radio.cpp @@ -47,8 +47,8 @@ MxLong Radio::Notify(MxParam& p_param) case c_notificationEndAction: result = HandleEndAction((MxEndActionNotificationParam&) p_param); break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; } } @@ -96,7 +96,7 @@ void Radio::Stop() } // FUNCTION: LEGO1 0x1002cbc0 -MxLong Radio::HandleClick(LegoControlManagerEvent& p_param) +MxLong Radio::HandleControl(LegoControlManagerEvent& p_param) { MxDSAction action; // Unused MxS32 objectId = p_param.GetClickedObjectId(); diff --git a/LEGO1/lego/legoomni/src/actors/skateboard.cpp b/LEGO1/lego/legoomni/src/actors/skateboard.cpp index 2e742d97..ab37d3f1 100644 --- a/LEGO1/lego/legoomni/src/actors/skateboard.cpp +++ b/LEGO1/lego/legoomni/src/actors/skateboard.cpp @@ -72,7 +72,7 @@ void SkateBoard::VTable0xe4() } // FUNCTION: LEGO1 0x100100e0 -MxU32 SkateBoard::VTable0xcc() +MxU32 SkateBoard::HandleClick() { Act1State* state = (Act1State*) GameState()->GetState("Act1State"); @@ -107,7 +107,7 @@ MxU32 SkateBoard::VTable0xcc() } // FUNCTION: LEGO1 0x10010230 -MxU32 SkateBoard::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 SkateBoard::HandleControl(LegoControlManagerEvent& p_param) { MxU32 result = 0; diff --git a/LEGO1/lego/legoomni/src/actors/towtrack.cpp b/LEGO1/lego/legoomni/src/actors/towtrack.cpp index 7cd6ee1b..cf155775 100644 --- a/LEGO1/lego/legoomni/src/actors/towtrack.cpp +++ b/LEGO1/lego/legoomni/src/actors/towtrack.cpp @@ -89,7 +89,7 @@ MxU32 TowTrack::VTable0xdc(MxType19NotificationParam& p_param) } // STUB: LEGO1 0x1004d690 -MxU32 TowTrack::VTable0xcc() +MxU32 TowTrack::HandleClick() { // TODO return 0; @@ -102,7 +102,7 @@ void TowTrack::VTable0xe4() } // STUB: LEGO1 0x1004d9e0 -MxU32 TowTrack::VTable0xd4(LegoControlManagerEvent& p_param) +MxU32 TowTrack::HandleControl(LegoControlManagerEvent& p_param) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/build/buildingentity.cpp b/LEGO1/lego/legoomni/src/build/buildingentity.cpp index 7986a589..9491c229 100644 --- a/LEGO1/lego/legoomni/src/build/buildingentity.cpp +++ b/LEGO1/lego/legoomni/src/build/buildingentity.cpp @@ -21,7 +21,7 @@ BuildingEntity::~BuildingEntity() // FUNCTION: LEGO1 0x100150a0 MxLong BuildingEntity::Notify(MxParam& p_param) { - if (((MxNotificationParam&) p_param).GetType() == c_notificationType11) { + if (((MxNotificationParam&) p_param).GetType() == c_notificationClick) { return VTable0x50(p_param); } diff --git a/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp b/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp index c0cbed68..96e6d598 100644 --- a/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp +++ b/LEGO1/lego/legoomni/src/common/mxcontrolpresenter.cpp @@ -184,7 +184,7 @@ MxBool MxControlPresenter::FUN_10044480(LegoControlManagerEvent* p_event, MxPres p_event->SetClickedObjectId(m_action->GetObjectId()); p_event->SetClickedAtom(m_action->GetAtomId().GetInternal()); VTable0x6c(0); - p_event->SetType(c_notificationClick); + p_event->SetType(c_notificationControl); p_event->SetUnknown0x28(m_unk0x4e); return TRUE; } @@ -194,7 +194,7 @@ MxBool MxControlPresenter::FUN_10044480(LegoControlManagerEvent* p_event, MxPres p_event->SetClickedObjectId(m_action->GetObjectId()); p_event->SetClickedAtom(m_action->GetAtomId().GetInternal()); VTable0x6c(m_unk0x56); - p_event->SetType(c_notificationClick); + p_event->SetType(c_notificationControl); p_event->SetUnknown0x28(m_unk0x4e); return TRUE; } diff --git a/LEGO1/lego/legoomni/src/entity/legoentity.cpp b/LEGO1/lego/legoomni/src/entity/legoentity.cpp index c4a09084..4d9324ad 100644 --- a/LEGO1/lego/legoomni/src/entity/legoentity.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoentity.cpp @@ -337,7 +337,7 @@ MxLong LegoEntity::Notify(MxParam& p_param) { LegoEventNotificationParam& param = (LegoEventNotificationParam&) p_param; - if (param.GetNotification() != c_notificationType11) { + if (param.GetNotification() != c_notificationClick) { return 0; } diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index 9149835d..200652b1 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -456,7 +456,7 @@ MxBool LegoInputManager::ProcessOneEvent(LegoEventNotificationParam& p_param) } if (FUN_1005cdf0(p_param)) { - if (processRoi && p_param.GetType() == c_notificationType11) { + if (processRoi && p_param.GetType() == c_notificationClick) { LegoROI* roi = PickROI(p_param.GetX(), p_param.GetY()); p_param.SetROI(roi); @@ -498,7 +498,7 @@ MxBool LegoInputManager::FUN_1005cdf0(LegoEventNotificationParam& p_param) else if (m_unk0x81) { p_param.SetX(m_x); p_param.SetY(m_y); - p_param.SetType(c_notificationType11); + p_param.SetType(c_notificationClick); result = TRUE; } diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp index dac374c5..543a5152 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp @@ -18,5 +18,6 @@ PizzaMissionStateEntry* PizzaMissionState::GetState(MxU8 p_id) return m_state + i; } } + return NULL; } diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp index 41f9d029..3271c3d6 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp @@ -8,6 +8,12 @@ PizzeriaState::PizzeriaState() // TODO } +// STUB: LEGO1 0x10017d70 +MxU32 PizzeriaState::FUN_10017d70() +{ + return 0; +} + // STUB: LEGO1 0x10017da0 MxResult PizzeriaState::Serialize(LegoFile* p_legoFile) { diff --git a/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp b/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp index 32c9265a..219fcf79 100644 --- a/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp +++ b/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp @@ -59,8 +59,8 @@ MxLong ElevatorBottom::Notify(MxParam& p_param) if (m_worldStarted) { switch (((MxNotificationParam&) p_param).GetType()) { - case c_notificationClick: - ret = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + ret = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: GameState()->SwitchArea(m_destLocation); @@ -80,7 +80,7 @@ void ElevatorBottom::ReadyWorld() } // FUNCTION: LEGO1 0x100181d0 -MxLong ElevatorBottom::HandleClick(LegoControlManagerEvent& p_param) +MxLong ElevatorBottom::HandleControl(LegoControlManagerEvent& p_param) { MxLong result = 0; diff --git a/LEGO1/lego/legoomni/src/worlds/gasstation.cpp b/LEGO1/lego/legoomni/src/worlds/gasstation.cpp index e8a4d813..4042eb8d 100644 --- a/LEGO1/lego/legoomni/src/worlds/gasstation.cpp +++ b/LEGO1/lego/legoomni/src/worlds/gasstation.cpp @@ -113,8 +113,8 @@ MxLong GasStation::Notify(MxParam& p_param) case c_notificationButtonDown: result = HandleButtonDown(((LegoControlManagerEvent&) p_param)); break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: GameState()->SwitchArea(m_destLocation); @@ -313,7 +313,7 @@ MxLong GasStation::HandleButtonDown(LegoControlManagerEvent& p_param) } // FUNCTION: LEGO1 0x10005b20 -MxLong GasStation::HandleClick(LegoControlManagerEvent& p_param) +MxLong GasStation::HandleControl(LegoControlManagerEvent& p_param) { if (p_param.GetUnknown0x28() == 1) { MxDSAction action; diff --git a/LEGO1/lego/legoomni/src/worlds/hospital.cpp b/LEGO1/lego/legoomni/src/worlds/hospital.cpp index bc6b0386..59d265f7 100644 --- a/LEGO1/lego/legoomni/src/worlds/hospital.cpp +++ b/LEGO1/lego/legoomni/src/worlds/hospital.cpp @@ -122,8 +122,8 @@ MxLong Hospital::Notify(MxParam& p_param) case c_notificationButtonDown: result = HandleButtonDown(((LegoControlManagerEvent&) p_param)); break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: if (m_destLocation != LegoGameState::e_undefined) { @@ -552,7 +552,7 @@ MxLong Hospital::HandleButtonDown(LegoControlManagerEvent& p_param) } // FUNCTION: LEGO1 0x10075f90 -MxBool Hospital::HandleClick(LegoControlManagerEvent& p_param) +MxBool Hospital::HandleControl(LegoControlManagerEvent& p_param) { if (p_param.GetUnknown0x28() == 1) { switch (p_param.GetClickedObjectId()) { diff --git a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp index 55de745e..2277300a 100644 --- a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp @@ -170,8 +170,8 @@ MxLong Infocenter::Notify(MxParam& p_param) ((LegoEventNotificationParam&) p_param).GetY() ); break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: StopBookAnimation(); @@ -870,7 +870,7 @@ MxU8 Infocenter::HandleButtonUp(MxS32 p_x, MxS32 p_y) } // FUNCTION: LEGO1 0x10070370 -MxU8 Infocenter::HandleClick(LegoControlManagerEvent& p_param) +MxU8 Infocenter::HandleControl(LegoControlManagerEvent& p_param) { if (p_param.GetUnknown0x28() == 1) { m_infoManDialogueTimer = 0; diff --git a/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp b/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp index 7d205ce1..d433c337 100644 --- a/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp +++ b/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp @@ -68,8 +68,8 @@ MxLong InfocenterDoor::Notify(MxParam& p_param) result = 1; } break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: GameState()->SwitchArea(m_destLocation); @@ -90,7 +90,7 @@ void InfocenterDoor::ReadyWorld() } // FUNCTION: LEGO1 0x10037a90 -MxLong InfocenterDoor::HandleClick(LegoControlManagerEvent& p_param) +MxLong InfocenterDoor::HandleControl(LegoControlManagerEvent& p_param) { MxLong result = 0; diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 8c061f99..f99cf6fc 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -142,8 +142,8 @@ MxLong Isle::Notify(MxParam& p_param) break; } break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationEndAnim: switch (m_act1state->m_unk0x018) { @@ -278,7 +278,7 @@ void Isle::ReadyWorld() } // FUNCTION: LEGO1 0x10031030 -MxLong Isle::HandleClick(LegoControlManagerEvent& p_param) +MxLong Isle::HandleControl(LegoControlManagerEvent& p_param) { if (p_param.GetUnknown0x28() == 1) { MxDSAction action; @@ -509,7 +509,7 @@ MxLong Isle::HandleType19Notification(MxType19NotificationParam& p_param) case 0x136: LegoEntity* bouy = (LegoEntity*) Find("MxEntity", "bouybump"); if (bouy != NULL) { - NotificationManager()->Send(bouy, LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + NotificationManager()->Send(bouy, LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); } result = 1; break; @@ -595,11 +595,11 @@ void Isle::Enable(MxBool p_enable) #ifdef COMPAT_MODE { - LegoEventNotificationParam param(c_notificationType11, NULL, 0, 0, 0, 0); + LegoEventNotificationParam param(c_notificationClick, NULL, 0, 0, 0, 0); m_jetski->Notify(param); } #else - m_jetski->Notify(LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + m_jetski->Notify(LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); #endif break; case LegoGameState::e_garadoor: @@ -618,11 +618,11 @@ void Isle::Enable(MxBool p_enable) #ifdef COMPAT_MODE { - LegoEventNotificationParam param(c_notificationType11, NULL, 0, 0, 0, 0); + LegoEventNotificationParam param(c_notificationClick, NULL, 0, 0, 0, 0); m_bike->Notify(param); } #else - m_bike->Notify(LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + m_bike->Notify(LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); #endif break; case LegoGameState::e_dunecar: @@ -631,11 +631,11 @@ void Isle::Enable(MxBool p_enable) #ifdef COMPAT_MODE { - LegoEventNotificationParam param(c_notificationType11, NULL, 0, 0, 0, 0); + LegoEventNotificationParam param(c_notificationClick, NULL, 0, 0, 0, 0); m_dunebuggy->Notify(param); } #else - m_dunebuggy->Notify(LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + m_dunebuggy->Notify(LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); #endif break; case LegoGameState::e_motocycle: @@ -644,11 +644,11 @@ void Isle::Enable(MxBool p_enable) #ifdef COMPAT_MODE { - LegoEventNotificationParam param(c_notificationType11, NULL, 0, 0, 0, 0); + LegoEventNotificationParam param(c_notificationClick, NULL, 0, 0, 0, 0); m_motocycle->Notify(param); } #else - m_motocycle->Notify(LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + m_motocycle->Notify(LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); #endif break; case LegoGameState::e_copter: @@ -657,11 +657,11 @@ void Isle::Enable(MxBool p_enable) #ifdef COMPAT_MODE { - LegoEventNotificationParam param(c_notificationType11, NULL, 0, 0, 0, 0); + LegoEventNotificationParam param(c_notificationClick, NULL, 0, 0, 0, 0); m_helicopter->Notify(param); } #else - m_helicopter->Notify(LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + m_helicopter->Notify(LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); #endif break; case LegoGameState::e_skateboard: @@ -670,11 +670,11 @@ void Isle::Enable(MxBool p_enable) #ifdef COMPAT_MODE { - LegoEventNotificationParam param(c_notificationType11, NULL, 0, 0, 0, 0); + LegoEventNotificationParam param(c_notificationClick, NULL, 0, 0, 0, 0); m_skateboard->Notify(param); } #else - m_skateboard->Notify(LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + m_skateboard->Notify(LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); #endif break; case LegoGameState::e_jetski: @@ -683,11 +683,11 @@ void Isle::Enable(MxBool p_enable) #ifdef COMPAT_MODE { - LegoEventNotificationParam param(c_notificationType11, NULL, 0, 0, 0, 0); + LegoEventNotificationParam param(c_notificationClick, NULL, 0, 0, 0, 0); m_jetski->Notify(param); } #else - m_jetski->Notify(LegoEventNotificationParam(c_notificationType11, NULL, 0, 0, 0, 0)); + m_jetski->Notify(LegoEventNotificationParam(c_notificationClick, NULL, 0, 0, 0, 0)); #endif break; default: diff --git a/LEGO1/lego/legoomni/src/worlds/jukebox.cpp b/LEGO1/lego/legoomni/src/worlds/jukebox.cpp index ac284815..421760ab 100644 --- a/LEGO1/lego/legoomni/src/worlds/jukebox.cpp +++ b/LEGO1/lego/legoomni/src/worlds/jukebox.cpp @@ -75,8 +75,8 @@ MxLong JukeBox::Notify(MxParam& p_param) if (m_worldStarted) { switch (((MxNotificationParam&) p_param).GetNotification()) { - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: GameState()->SwitchArea(m_destLocation); @@ -119,7 +119,7 @@ void JukeBox::ReadyWorld() } // FUNCTION: LEGO1 0x1005da70 -MxBool JukeBox::HandleClick(LegoControlManagerEvent& p_param) +MxBool JukeBox::HandleControl(LegoControlManagerEvent& p_param) { MxStillPresenter* presenter; diff --git a/LEGO1/lego/legoomni/src/worlds/police.cpp b/LEGO1/lego/legoomni/src/worlds/police.cpp index cf1396b8..b80e1a33 100644 --- a/LEGO1/lego/legoomni/src/worlds/police.cpp +++ b/LEGO1/lego/legoomni/src/worlds/police.cpp @@ -81,8 +81,8 @@ MxLong Police::Notify(MxParam& p_param) case c_notificationKeyPress: result = HandleKeyPress(((LegoEventNotificationParam&) p_param)); break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: GameState()->SwitchArea(m_destLocation); @@ -102,7 +102,7 @@ void Police::ReadyWorld() } // FUNCTION: LEGO1 0x1005e550 -MxLong Police::HandleClick(LegoControlManagerEvent& p_param) +MxLong Police::HandleControl(LegoControlManagerEvent& p_param) { if (p_param.GetUnknown0x28() == 1) { switch (p_param.GetClickedObjectId()) { diff --git a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp index bb325a8f..28cd8c27 100644 --- a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp +++ b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp @@ -114,8 +114,8 @@ MxLong RegistrationBook::Notify(MxParam& p_param) case c_notificationButtonDown: m_registerDialogueTimer = Timer()->GetTime(); break; - case c_notificationClick: - result = HandleClick((LegoControlManagerEvent&) p_param); + case c_notificationControl: + result = HandleControl((LegoControlManagerEvent&) p_param); break; case c_notificationType19: result = HandleNotification19(p_param); @@ -210,7 +210,7 @@ MxLong RegistrationBook::HandleKeyPress(MxU8 p_key) } // FUNCTION: LEGO1 0x100774a0 -MxLong RegistrationBook::HandleClick(LegoControlManagerEvent& p_param) +MxLong RegistrationBook::HandleControl(LegoControlManagerEvent& p_param) { MxS16 unk0x28 = p_param.GetUnknown0x28(); diff --git a/LEGO1/lego/legoomni/src/worlds/score.cpp b/LEGO1/lego/legoomni/src/worlds/score.cpp index f8bea176..a4ff3621 100644 --- a/LEGO1/lego/legoomni/src/worlds/score.cpp +++ b/LEGO1/lego/legoomni/src/worlds/score.cpp @@ -104,7 +104,7 @@ MxLong Score::Notify(MxParam& p_param) } ret = 1; break; - case c_notificationClick: + case c_notificationControl: ret = FUN_100016d0((LegoControlManagerEvent&) p_param); break; case c_notificationTransitioned: diff --git a/LEGO1/omni/include/mxnotificationparam.h b/LEGO1/omni/include/mxnotificationparam.h index fd0990f9..1c1e691d 100644 --- a/LEGO1/omni/include/mxnotificationparam.h +++ b/LEGO1/omni/include/mxnotificationparam.h @@ -19,12 +19,12 @@ enum NotificationId { c_notificationButtonUp = 8, // 100d6aa0 c_notificationButtonDown = 9, // 100d6aa0 c_notificationMouseMove = 10, // 100d6aa0 - c_notificationType11 = 11, // 100d6aa0 + c_notificationClick = 11, // 100d6aa0 c_notificationDragEnd = 12, c_notificationDragStart = 13, c_notificationDrag = 14, c_notificationTimer = 15, // 100d6aa0 - c_notificationClick = 17, + c_notificationControl = 17, c_notificationEndAnim = 18, // 100d7e80 c_notificationType19 = 19, // 100d6230 c_notificationType20 = 20, From ab4ba9fc4f73fca3ff865bab9e5b5020bbebbe7f Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 30 May 2024 10:27:18 -0400 Subject: [PATCH 27/28] Implement/match Lego3DWavePresenter::StartingTickle (#972) * Implement/match Lego3DWavePresenter::StartingTickle * Fix annotation * Add StreamingTickle * Rename --- CMakeLists.txt | 2 +- .../{legounknown100d5778.h => lego3dsound.h} | 20 ++++++------- .../legoomni/include/lego3dwavepresenter.h | 6 ++-- LEGO1/lego/legoomni/include/legocachsound.h | 4 +-- ...egounknown100d5778.cpp => lego3dsound.cpp} | 28 ++++++++++--------- .../src/audio/lego3dwavepresenter.cpp | 26 ++++++++++++++--- LEGO1/omni/include/mxaudiopresenter.h | 2 +- 7 files changed, 54 insertions(+), 34 deletions(-) rename LEGO1/lego/legoomni/include/{legounknown100d5778.h => lego3dsound.h} (59%) rename LEGO1/lego/legoomni/src/audio/{legounknown100d5778.cpp => lego3dsound.cpp} (58%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 259ec560..58d2b662 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,12 +306,12 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/actors/radio.cpp LEGO1/lego/legoomni/src/actors/skateboard.cpp LEGO1/lego/legoomni/src/actors/towtrack.cpp + LEGO1/lego/legoomni/src/audio/lego3dsound.cpp LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp LEGO1/lego/legoomni/src/audio/legocachsound.cpp LEGO1/lego/legoomni/src/audio/legocachesoundmanager.cpp LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp - LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp LEGO1/lego/legoomni/src/audio/mxbackgroundaudiomanager.cpp LEGO1/lego/legoomni/src/build/buildingentity.cpp LEGO1/lego/legoomni/src/build/helicopterstate.cpp diff --git a/LEGO1/lego/legoomni/include/legounknown100d5778.h b/LEGO1/lego/legoomni/include/lego3dsound.h similarity index 59% rename from LEGO1/lego/legoomni/include/legounknown100d5778.h rename to LEGO1/lego/legoomni/include/lego3dsound.h index 5ae43070..a6f4bb02 100644 --- a/LEGO1/lego/legoomni/include/legounknown100d5778.h +++ b/LEGO1/lego/legoomni/include/lego3dsound.h @@ -1,5 +1,5 @@ -#ifndef LEGOUNKNOWN100D5778_H -#define LEGOUNKNOWN100D5778_H +#ifndef LEGO3DSOUND_H +#define LEGO3DSOUND_H #include "decomp.h" #include "mxtypes.h" @@ -10,20 +10,20 @@ class LegoROI; // VTABLE: LEGO1 0x100d5778 // SIZE 0x30 -class LegoUnknown100d5778 { +class Lego3DSound { public: - LegoUnknown100d5778(); - virtual ~LegoUnknown100d5778(); + Lego3DSound(); + virtual ~Lego3DSound(); void Init(); - MxResult FUN_100116a0(LPDIRECTSOUND p_dsound, undefined4, undefined4 p_unk0x2c); + MxResult Create(LPDIRECTSOUNDBUFFER p_directSoundBuffer, const char*, MxS32 p_volume); void Destroy(); - undefined4 FUN_100118e0(LPDIRECTSOUNDBUFFER p_dsBuffer); + undefined4 FUN_100118e0(LPDIRECTSOUNDBUFFER p_directSoundBuffer); void FUN_10011ca0(); MxS32 FUN_10011cf0(undefined4, undefined4); // SYNTHETIC: LEGO1 0x10011650 - // LegoUnknown100d5778::`scalar deleting destructor' + // Lego3DSound::`scalar deleting destructor' private: undefined m_unk0x04[4]; // 0x04 @@ -34,7 +34,7 @@ class LegoUnknown100d5778 { MxBool m_unk0x15; // 0x15 undefined4 m_unk0x18; // 0x18 undefined m_unk0x1c[0x10]; // 0x1c - undefined4 m_unk0x2c; // 0x2c + MxS32 m_volume; // 0x2c }; -#endif // LEGOUNKNOWN100D5778_H +#endif // LEGO3DSOUND_H diff --git a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h index 79be1834..775f6a09 100644 --- a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h +++ b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h @@ -2,7 +2,7 @@ #define LEGO3DWAVEPRESENTER_H #include "decomp.h" -#include "legounknown100d5778.h" +#include "lego3dsound.h" #include "mxwavepresenter.h" // VTABLE: LEGO1 0x100d52b0 @@ -31,8 +31,8 @@ class Lego3DWavePresenter : public MxWavePresenter { // Lego3DWavePresenter::`scalar deleting destructor' private: - undefined m_unk0x6c[4]; // 0x6c - LegoUnknown100d5778 m_unk0x70; // 0x70 + undefined m_unk0x6c[4]; // 0x6c + Lego3DSound m_sound; // 0x70 }; #endif // LEGO3DWAVEPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legocachsound.h b/LEGO1/lego/legoomni/include/legocachsound.h index 178430ff..f424a465 100644 --- a/LEGO1/lego/legoomni/include/legocachsound.h +++ b/LEGO1/lego/legoomni/include/legocachsound.h @@ -2,7 +2,7 @@ #define LEGOCACHSOUND_H #include "decomp.h" -#include "legounknown100d5778.h" +#include "lego3dsound.h" #include "mxcore.h" #include "mxstring.h" @@ -47,7 +47,7 @@ class LegoCacheSound : public MxCore { LPDIRECTSOUNDBUFFER m_dsBuffer; // 0x08 undefined m_unk0xc[4]; // 0x0c - LegoUnknown100d5778 m_unk0x10; // 0x10 + Lego3DSound m_unk0x10; // 0x10 undefined* m_unk0x40; // 0x40 undefined4 m_unk0x44; // 0x44 MxString m_string0x48; // 0x48 diff --git a/LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp b/LEGO1/lego/legoomni/src/audio/lego3dsound.cpp similarity index 58% rename from LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp rename to LEGO1/lego/legoomni/src/audio/lego3dsound.cpp index 3ff57585..23b7a8c5 100644 --- a/LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp +++ b/LEGO1/lego/legoomni/src/audio/lego3dsound.cpp @@ -1,25 +1,25 @@ -#include "legounknown100d5778.h" +#include "lego3dsound.h" #include "legocharactermanager.h" #include "misc.h" #include "mxomni.h" -DECOMP_SIZE_ASSERT(LegoUnknown100d5778, 0x30) +DECOMP_SIZE_ASSERT(Lego3DSound, 0x30) // FUNCTION: LEGO1 0x10011630 -LegoUnknown100d5778::LegoUnknown100d5778() +Lego3DSound::Lego3DSound() { Init(); } // FUNCTION: LEGO1 0x10011670 -LegoUnknown100d5778::~LegoUnknown100d5778() +Lego3DSound::~Lego3DSound() { Destroy(); } // FUNCTION: LEGO1 0x10011680 -void LegoUnknown100d5778::Init() +void Lego3DSound::Init() { m_dsBuffer = NULL; m_unk0x0c = NULL; @@ -27,16 +27,17 @@ void LegoUnknown100d5778::Init() m_unk0x18 = 0; m_unk0x14 = FALSE; m_unk0x15 = FALSE; - m_unk0x2c = 79; + m_volume = 79; } // STUB: LEGO1 0x100116a0 -MxResult LegoUnknown100d5778::FUN_100116a0(LPDIRECTSOUND p_dsound, undefined4, undefined4 p_unk0x2c) +// FUNCTION: BETA10 0x10039647 +MxResult Lego3DSound::Create(LPDIRECTSOUNDBUFFER p_directSoundBuffer, const char*, MxS32 p_volume) { - m_unk0x2c = p_unk0x2c; + m_volume = p_volume; if (MxOmni::IsSound3D()) { - p_dsound->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*) &m_dsBuffer); + p_directSoundBuffer->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*) &m_dsBuffer); if (m_dsBuffer == NULL) { return FAILURE; } @@ -50,7 +51,7 @@ MxResult LegoUnknown100d5778::FUN_100116a0(LPDIRECTSOUND p_dsound, undefined4, u } // FUNCTION: LEGO1 0x10011880 -void LegoUnknown100d5778::Destroy() +void Lego3DSound::Destroy() { if (m_dsBuffer) { m_dsBuffer->Release(); @@ -70,20 +71,21 @@ void LegoUnknown100d5778::Destroy() } // STUB: LEGO1 0x100118e0 -undefined4 LegoUnknown100d5778::FUN_100118e0(LPDIRECTSOUNDBUFFER p_dsBuffer) +// FUNCTION: BETA10 0x10039a2a +undefined4 Lego3DSound::FUN_100118e0(LPDIRECTSOUNDBUFFER p_directSoundBuffer) { // TODO return 0; } // STUB: LEGO1 0x10011ca0 -void LegoUnknown100d5778::FUN_10011ca0() +void Lego3DSound::FUN_10011ca0() { // TODO } // STUB: LEGO1 0x10011cf0 -MxS32 LegoUnknown100d5778::FUN_10011cf0(undefined4, undefined4) +MxS32 Lego3DSound::FUN_10011cf0(undefined4, undefined4) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp b/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp index b60f3ded..10b79146 100644 --- a/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp +++ b/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp @@ -1,5 +1,7 @@ #include "lego3dwavepresenter.h" +#include "mxcompositepresenter.h" +#include "mxdsaction.h" #include "mxomni.h" DECOMP_SIZE_ASSERT(Lego3DWavePresenter, 0xa0) @@ -28,7 +30,8 @@ void Lego3DWavePresenter::Destroy() } } -// STUB: LEGO1 0x1004a810 +// FUNCTION: LEGO1 0x1004a810 +// FUNCTION: BETA10 0x1003a3b0 void Lego3DWavePresenter::StartingTickle() { if (MxOmni::IsSound3D()) { @@ -37,12 +40,27 @@ void Lego3DWavePresenter::StartingTickle() MxWavePresenter::StartingTickle(); - // TODO + if (m_dsBuffer != NULL) { + MxU16 extraLength; + char* buff; + m_action->GetExtra(extraLength, buff); + + if (!strcmp(buff, "FROM_PARENT") && m_compositePresenter != NULL) { + m_compositePresenter->GetAction()->GetExtra(extraLength, buff); + } + + if (m_sound.Create(m_dsBuffer, buff, m_volume) != SUCCESS) { + m_dsBuffer->Release(); + m_dsBuffer = NULL; + EndAction(); + } + } } -// STUB: LEGO1 0x1004a8b0 +// FUNCTION: LEGO1 0x1004a8b0 +// FUNCTION: BETA10 0x1003a4cc void Lego3DWavePresenter::StreamingTickle() { MxWavePresenter::StreamingTickle(); - // TODO + m_sound.FUN_100118e0(m_dsBuffer); } diff --git a/LEGO1/omni/include/mxaudiopresenter.h b/LEGO1/omni/include/mxaudiopresenter.h index 873871ec..dd4369ea 100644 --- a/LEGO1/omni/include/mxaudiopresenter.h +++ b/LEGO1/omni/include/mxaudiopresenter.h @@ -30,7 +30,7 @@ class MxAudioPresenter : public MxMediaPresenter { virtual void SetVolume(MxS32 p_volume) { m_volume = p_volume; } // vtable+0x60 protected: - MxS32 m_volume; + MxS32 m_volume; // 0x50 }; // SYNTHETIC: LEGO1 0x1000d370 From ac41854149776a30b7acaa89808cee0a7cad7380 Mon Sep 17 00:00:00 2001 From: MS Date: Thu, 30 May 2024 13:10:41 -0400 Subject: [PATCH 28/28] Add static HandlerClassName function (#973) * Add static HandlerClassName function * Use method in PresenterNameDispatch --- LEGO1/lego/legoomni/include/jetskirace.h | 11 ++++++-- .../legoomni/include/lego3dwavepresenter.h | 11 ++++++-- .../include/legoactioncontrolpresenter.h | 11 ++++++-- .../legoomni/include/legoactorpresenter.h | 11 ++++++-- .../legoomni/include/legoanimmmpresenter.h | 11 ++++++-- .../lego/legoomni/include/legoanimpresenter.h | 11 ++++++-- .../include/legocarbuildanimpresenter.h | 11 ++++++-- .../legoomni/include/legocontrolmanager.h | 11 ++++++-- .../legoomni/include/legoentitypresenter.h | 11 ++++++-- .../include/legoflctexturepresenter.h | 11 ++++++-- .../legoomni/include/legohideanimpresenter.h | 11 ++++++-- .../include/legoloadcachesoundpresenter.h | 11 ++++++-- .../include/legolocomotionanimpresenter.h | 11 ++++++-- .../include/legoloopinganimpresenter.h | 11 ++++++-- .../legoomni/include/legomodelpresenter.h | 11 ++++++-- .../legoomni/include/legopalettepresenter.h | 11 ++++++-- .../lego/legoomni/include/legopartpresenter.h | 11 ++++++-- .../lego/legoomni/include/legopathpresenter.h | 11 ++++++-- .../legoomni/include/legophonemepresenter.h | 11 ++++++-- LEGO1/lego/legoomni/include/legorace.h | 11 ++++++-- .../legoomni/include/legotexturepresenter.h | 11 ++++++-- .../legoomni/include/legoworldpresenter.h | 11 ++++++-- LEGO1/omni/include/mxaudiopresenter.h | 11 ++++++-- LEGO1/omni/include/mxcompositepresenter.h | 11 ++++++-- LEGO1/omni/include/mxeventpresenter.h | 11 ++++++-- LEGO1/omni/include/mxflcpresenter.h | 11 ++++++-- LEGO1/omni/include/mxloopingflcpresenter.h | 11 ++++++-- LEGO1/omni/include/mxloopingmidipresenter.h | 11 ++++++-- LEGO1/omni/include/mxloopingsmkpresenter.h | 11 ++++++-- LEGO1/omni/include/mxmediapresenter.h | 11 ++++++-- LEGO1/omni/include/mxmidipresenter.h | 11 ++++++-- LEGO1/omni/include/mxmusicpresenter.h | 11 ++++++-- LEGO1/omni/include/mxpresenter.h | 11 ++++++-- LEGO1/omni/include/mxsmkpresenter.h | 11 ++++++-- LEGO1/omni/include/mxsoundpresenter.h | 11 ++++++-- LEGO1/omni/include/mxstillpresenter.h | 11 ++++++-- LEGO1/omni/include/mxvideopresenter.h | 11 ++++++-- LEGO1/omni/include/mxwavepresenter.h | 11 ++++++-- LEGO1/omni/src/common/mxpresenter.cpp | 27 ++++++++++++++----- 39 files changed, 362 insertions(+), 83 deletions(-) diff --git a/LEGO1/lego/legoomni/include/jetskirace.h b/LEGO1/lego/legoomni/include/jetskirace.h index bb612ec7..7f17a1fc 100644 --- a/LEGO1/lego/legoomni/include/jetskirace.h +++ b/LEGO1/lego/legoomni/include/jetskirace.h @@ -7,13 +7,20 @@ // SIZE 0x144 class JetskiRace : public LegoRace { public: - // FUNCTION: LEGO1 0x1000daf0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a8840 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0530 return "JetskiRace"; } + // FUNCTION: LEGO1 0x1000daf0 + // FUNCTION: BETA10 0x100a8810 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000db00 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h index 775f6a09..2ebd9426 100644 --- a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h +++ b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h @@ -9,13 +9,20 @@ // SIZE 0xa0 class Lego3DWavePresenter : public MxWavePresenter { public: - // FUNCTION: LEGO1 0x1000d890 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a8670 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f058c return "Lego3DWavePresenter"; } + // FUNCTION: LEGO1 0x1000d890 + // FUNCTION: BETA10 0x100a8640 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000d8a0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoactioncontrolpresenter.h b/LEGO1/lego/legoomni/include/legoactioncontrolpresenter.h index 98ee03f2..c46aec5b 100644 --- a/LEGO1/lego/legoomni/include/legoactioncontrolpresenter.h +++ b/LEGO1/lego/legoomni/include/legoactioncontrolpresenter.h @@ -13,13 +13,20 @@ class LegoActionControlPresenter : public MxMediaPresenter { LegoActionControlPresenter() { m_unk0x50 = Extra::ActionType::e_none; } ~LegoActionControlPresenter() override { Destroy(TRUE); } // vtable+0x00 - // FUNCTION: LEGO1 0x1000d0e0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a7840 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f05bc return "LegoActionControlPresenter"; } + // FUNCTION: LEGO1 0x1000d0e0 + // FUNCTION: BETA10 0x100a7810 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000d0f0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoactorpresenter.h b/LEGO1/lego/legoomni/include/legoactorpresenter.h index aea15b64..99f6cd04 100644 --- a/LEGO1/lego/legoomni/include/legoactorpresenter.h +++ b/LEGO1/lego/legoomni/include/legoactorpresenter.h @@ -12,13 +12,20 @@ class LegoActorPresenter : public LegoEntityPresenter { // FUNCTION: LEGO1 0x100679c0 ~LegoActorPresenter() override {} - // FUNCTION: LEGO1 0x1000cb10 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a6f10 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f06a4 return "LegoActorPresenter"; } + // FUNCTION: LEGO1 0x1000cb10 + // FUNCTION: BETA10 0x100a6ee0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000cb20 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoanimmmpresenter.h b/LEGO1/lego/legoomni/include/legoanimmmpresenter.h index 4ca63a7b..946fcdd0 100644 --- a/LEGO1/lego/legoomni/include/legoanimmmpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimmmpresenter.h @@ -29,13 +29,20 @@ class LegoAnimMMPresenter : public MxCompositePresenter { MxLong Notify(MxParam& p_param) override; // vtable+0x04 - // FUNCTION: LEGO1 0x1004a950 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1004d840 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f046c return "LegoAnimMMPresenter"; } + // FUNCTION: LEGO1 0x1004a950 + // FUNCTION: BETA10 0x1004d810 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1004a960 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index 44ed14aa..6dc2c7ce 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -41,13 +41,20 @@ class LegoAnimPresenter : public MxVideoPresenter { LegoAnimPresenter(); ~LegoAnimPresenter() override; - // FUNCTION: LEGO1 0x10068530 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x10055300 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f071c return "LegoAnimPresenter"; } + // FUNCTION: LEGO1 0x10068530 + // FUNCTION: BETA10 0x100552d0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x10068540 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h b/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h index 5b72d2be..d4c12d76 100644 --- a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h @@ -11,13 +11,20 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter { LegoCarBuildAnimPresenter(); ~LegoCarBuildAnimPresenter() override; // vtable+0x00 - // FUNCTION: LEGO1 0x10078510 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x10073290 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f05ec return "LegoCarBuildAnimPresenter"; } + // FUNCTION: LEGO1 0x10078510 + // FUNCTION: BETA10 0x10073260 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x10078520 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legocontrolmanager.h b/LEGO1/lego/legoomni/include/legocontrolmanager.h index f5274a31..09e5a6d5 100644 --- a/LEGO1/lego/legoomni/include/legocontrolmanager.h +++ b/LEGO1/lego/legoomni/include/legocontrolmanager.h @@ -46,13 +46,20 @@ class LegoControlManager : public MxCore { MxResult Tickle() override; // vtable+0x08 - // FUNCTION: LEGO1 0x10028cb0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1008af70 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f31b8 return "LegoControlManager"; } + // FUNCTION: LEGO1 0x10028cb0 + // FUNCTION: BETA10 0x1008af40 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x10028cc0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoentitypresenter.h b/LEGO1/lego/legoomni/include/legoentitypresenter.h index e8bf6ff1..e4da7af7 100644 --- a/LEGO1/lego/legoomni/include/legoentitypresenter.h +++ b/LEGO1/lego/legoomni/include/legoentitypresenter.h @@ -13,13 +13,20 @@ class LegoEntityPresenter : public MxCompositePresenter { LegoEntityPresenter(); ~LegoEntityPresenter() override; // vtable+0x00 - // FUNCTION: LEGO1 0x100534b0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x10080780 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f06b8 return "LegoEntityPresenter"; } + // FUNCTION: LEGO1 0x100534b0 + // FUNCTION: BETA10 0x10080750 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100534c0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoflctexturepresenter.h b/LEGO1/lego/legoomni/include/legoflctexturepresenter.h index 70f8a309..706b953d 100644 --- a/LEGO1/lego/legoomni/include/legoflctexturepresenter.h +++ b/LEGO1/lego/legoomni/include/legoflctexturepresenter.h @@ -10,13 +10,20 @@ class LegoFlcTexturePresenter : public MxFlcPresenter { public: LegoFlcTexturePresenter(); - // FUNCTION: LEGO1 0x1005def0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100837e0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0634 return "LegoFlcTexturePresenter"; } + // FUNCTION: LEGO1 0x1005def0 + // FUNCTION: BETA10 0x100837b0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + void StartingTickle() override; // vtable+0x1c void LoadFrame(MxStreamChunk* p_chunk) override; // vtable+0x68 void PutFrame() override; // vtable+0x6c diff --git a/LEGO1/lego/legoomni/include/legohideanimpresenter.h b/LEGO1/lego/legoomni/include/legohideanimpresenter.h index d560f224..4006a91c 100644 --- a/LEGO1/lego/legoomni/include/legohideanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legohideanimpresenter.h @@ -25,13 +25,20 @@ class LegoHideAnimPresenter : public LegoLoopingAnimPresenter { LegoHideAnimPresenter(); ~LegoHideAnimPresenter() override; - // FUNCTION: LEGO1 0x1006d880 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1005d4a0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f06cc return "LegoHideAnimPresenter"; } + // FUNCTION: LEGO1 0x1006d880 + // FUNCTION: BETA10 0x1005d470 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1006d890 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h b/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h index cb6ad80a..883f4b01 100644 --- a/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h +++ b/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h @@ -13,13 +13,20 @@ class LegoLoadCacheSoundPresenter : public MxWavePresenter { LegoLoadCacheSoundPresenter(); ~LegoLoadCacheSoundPresenter() override; - // FUNCTION: LEGO1 0x10018450 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1008cf90 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f05a0 return "LegoLoadCacheSoundPresenter"; } + // FUNCTION: LEGO1 0x10018450 + // FUNCTION: BETA10 0x1008cf60 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + void ReadyTickle() override; // vtable+0x18 void StreamingTickle() override; // vtable+0x20 void DoneTickle() override; // vtable+0x2c diff --git a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h index 1a06ab35..f3eb4ccf 100644 --- a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h @@ -11,13 +11,20 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { LegoLocomotionAnimPresenter(); ~LegoLocomotionAnimPresenter() override; - // FUNCTION: LEGO1 0x1006ce50 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1005c4e0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f06e4 return "LegoLocomotionAnimPresenter"; } + // FUNCTION: LEGO1 0x1006ce50 + // FUNCTION: BETA10 0x1005c4b0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1006ce60 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h b/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h index c7095dac..355d6dc8 100644 --- a/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h @@ -7,13 +7,20 @@ // SIZE 0xc0 class LegoLoopingAnimPresenter : public LegoAnimPresenter { public: - // FUNCTION: LEGO1 0x1000c9a0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1005c6f0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0700 return "LegoLoopingAnimPresenter"; } + // FUNCTION: LEGO1 0x1000c9a0 + // FUNCTION: BETA10 0x1005c6c0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000c9b0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legomodelpresenter.h b/LEGO1/lego/legoomni/include/legomodelpresenter.h index f8b4cea1..679aec0b 100644 --- a/LEGO1/lego/legoomni/include/legomodelpresenter.h +++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h @@ -19,13 +19,20 @@ class LegoModelPresenter : public MxVideoPresenter { static void configureLegoModelPresenter(MxS32 p_modelPresenterConfig); - // FUNCTION: LEGO1 0x1000ccb0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a7180 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f067c return "LegoModelPresenter"; } + // FUNCTION: LEGO1 0x1000ccb0 + // FUNCTION: BETA10 0x100a7150 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000ccc0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legopalettepresenter.h b/LEGO1/lego/legoomni/include/legopalettepresenter.h index d6906540..2cd72973 100644 --- a/LEGO1/lego/legoomni/include/legopalettepresenter.h +++ b/LEGO1/lego/legoomni/include/legopalettepresenter.h @@ -13,13 +13,20 @@ class LegoPalettePresenter : public MxVideoPresenter { LegoPalettePresenter(); ~LegoPalettePresenter() override; // vtable+0x00 - // FUNCTION: LEGO1 0x10079f30 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100ab250 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f061c return "LegoPalettePresenter"; } + // FUNCTION: LEGO1 0x10079f30 + // FUNCTION: BETA10 0x100ab220 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x10079f40 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legopartpresenter.h b/LEGO1/lego/legoomni/include/legopartpresenter.h index 5de1402d..514ab603 100644 --- a/LEGO1/lego/legoomni/include/legopartpresenter.h +++ b/LEGO1/lego/legoomni/include/legopartpresenter.h @@ -13,13 +13,20 @@ class LegoPartPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x10067300 ~LegoPartPresenter() override { Destroy(TRUE); } - // FUNCTION: LEGO1 0x1000cf70 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a75d0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f05d8 return "LegoPartPresenter"; } + // FUNCTION: LEGO1 0x1000cf70 + // FUNCTION: BETA10 0x100a75a0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000cf80 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legopathpresenter.h b/LEGO1/lego/legoomni/include/legopathpresenter.h index 9e3f0f0f..bfae8a74 100644 --- a/LEGO1/lego/legoomni/include/legopathpresenter.h +++ b/LEGO1/lego/legoomni/include/legopathpresenter.h @@ -11,13 +11,20 @@ class LegoPathPresenter : public MxMediaPresenter { LegoPathPresenter(); ~LegoPathPresenter() override; - // FUNCTION: LEGO1 0x100449a0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100c24d0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0690 return "LegoPathPresenter"; } + // FUNCTION: LEGO1 0x100449a0 + // FUNCTION: BETA10 0x100c24a0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100449b0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legophonemepresenter.h b/LEGO1/lego/legoomni/include/legophonemepresenter.h index 0f4a6a5d..3786a6f1 100644 --- a/LEGO1/lego/legoomni/include/legophonemepresenter.h +++ b/LEGO1/lego/legoomni/include/legophonemepresenter.h @@ -15,13 +15,20 @@ class LegoPhonemePresenter : public MxFlcPresenter { LegoPhonemePresenter(); ~LegoPhonemePresenter() override; // vtable+0x00 - // FUNCTION: LEGO1 0x1004e310 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100c4220 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f064c return "LegoPhonemePresenter"; } + // FUNCTION: LEGO1 0x1004e310 + // FUNCTION: BETA10 0x100c41f0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + void StartingTickle() override; // vtable+0x1c void EndAction() override; // vtable+0x40 void LoadFrame(MxStreamChunk* p_chunk) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/legorace.h b/LEGO1/lego/legoomni/include/legorace.h index 29e46cab..f99f7e28 100644 --- a/LEGO1/lego/legoomni/include/legorace.h +++ b/LEGO1/lego/legoomni/include/legorace.h @@ -15,13 +15,20 @@ class LegoRace : public LegoWorld { MxLong Notify(MxParam& p_param) override; // vtable+0x04 - // FUNCTION: LEGO1 0x10015ba0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a8970 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f07c4 return "LegoRace"; } + // FUNCTION: LEGO1 0x10015ba0 + // FUNCTION: BETA10 0x100a8940 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x10015bb0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legotexturepresenter.h b/LEGO1/lego/legoomni/include/legotexturepresenter.h index 49947295..3e8cf5d1 100644 --- a/LEGO1/lego/legoomni/include/legotexturepresenter.h +++ b/LEGO1/lego/legoomni/include/legotexturepresenter.h @@ -11,13 +11,20 @@ class LegoTexturePresenter : public MxMediaPresenter { LegoTexturePresenter() : m_textures(NULL) {} ~LegoTexturePresenter() override; - // FUNCTION: LEGO1 0x1000ce50 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100a73c0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0664 return "LegoTexturePresenter"; } + // FUNCTION: LEGO1 0x1000ce50 + // FUNCTION: BETA10 0x100a7390 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000ce60 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/lego/legoomni/include/legoworldpresenter.h b/LEGO1/lego/legoomni/include/legoworldpresenter.h index 831b64f5..a7e09c4e 100644 --- a/LEGO1/lego/legoomni/include/legoworldpresenter.h +++ b/LEGO1/lego/legoomni/include/legoworldpresenter.h @@ -18,13 +18,20 @@ class LegoWorldPresenter : public LegoEntityPresenter { static void configureLegoWorldPresenter(MxS32 p_legoWorldPresenterQuality); - // FUNCTION: LEGO1 0x10066630 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100e41c0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0608 return "LegoWorldPresenter"; } + // FUNCTION: LEGO1 0x10066630 + // FUNCTION: BETA10 0x100e4190 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x10066640 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxaudiopresenter.h b/LEGO1/omni/include/mxaudiopresenter.h index dd4369ea..448f957f 100644 --- a/LEGO1/omni/include/mxaudiopresenter.h +++ b/LEGO1/omni/include/mxaudiopresenter.h @@ -10,13 +10,20 @@ class MxAudioPresenter : public MxMediaPresenter { public: MxAudioPresenter() { m_volume = 100; } - // FUNCTION: LEGO1 0x1000d280 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1008cba0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f078c return "MxAudioPresenter"; } + // FUNCTION: LEGO1 0x1000d280 + // FUNCTION: BETA10 0x1008cb70 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000d290 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxcompositepresenter.h b/LEGO1/omni/include/mxcompositepresenter.h index 977c1325..fb88cf86 100644 --- a/LEGO1/omni/include/mxcompositepresenter.h +++ b/LEGO1/omni/include/mxcompositepresenter.h @@ -18,13 +18,20 @@ class MxCompositePresenter : public MxPresenter { MxLong Notify(MxParam& p_param) override; // vtable+0x04 - // FUNCTION: LEGO1 0x100b6210 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1004da30 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0774 return "MxCompositePresenter"; } + // FUNCTION: LEGO1 0x100b6210 + // FUNCTION: BETA10 0x1004da00 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100b6220 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxeventpresenter.h b/LEGO1/omni/include/mxeventpresenter.h index 1812280f..71c5aed3 100644 --- a/LEGO1/omni/include/mxeventpresenter.h +++ b/LEGO1/omni/include/mxeventpresenter.h @@ -11,13 +11,20 @@ class MxEventPresenter : public MxMediaPresenter { MxEventPresenter(); ~MxEventPresenter() override; - // FUNCTION: LEGO1 0x100c2c30 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1012f0d0 + static const char* HandlerClassName() { // STRING: LEGO1 0x10101dcc return "MxEventPresenter"; } + // FUNCTION: LEGO1 0x100c2c30 + // FUNCTION: BETA10 0x10152f10 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100c2c40 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxflcpresenter.h b/LEGO1/omni/include/mxflcpresenter.h index 569fa06c..deffbac0 100644 --- a/LEGO1/omni/include/mxflcpresenter.h +++ b/LEGO1/omni/include/mxflcpresenter.h @@ -19,13 +19,20 @@ class MxFlcPresenter : public MxVideoPresenter { return !strcmp(p_name, MxFlcPresenter::ClassName()) || MxVideoPresenter::IsA(p_name); } - // FUNCTION: LEGO1 0x100b33f0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x10083790 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f43c8 return "MxFlcPresenter"; } + // FUNCTION: LEGO1 0x100b33f0 + // FUNCTION: BETA10 0x10083760 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + void LoadHeader(MxStreamChunk* p_chunk) override; // vtable+0x5c void CreateBitmap() override; // vtable+0x60 void LoadFrame(MxStreamChunk* p_chunk) override; // vtable+0x68 diff --git a/LEGO1/omni/include/mxloopingflcpresenter.h b/LEGO1/omni/include/mxloopingflcpresenter.h index 1bc76e18..8a1f7d8d 100644 --- a/LEGO1/omni/include/mxloopingflcpresenter.h +++ b/LEGO1/omni/include/mxloopingflcpresenter.h @@ -11,13 +11,20 @@ class MxLoopingFlcPresenter : public MxFlcPresenter { MxLoopingFlcPresenter(); ~MxLoopingFlcPresenter() override; - // FUNCTION: LEGO1 0x100b4380 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1012f050 + static const char* HandlerClassName() { // STRING: LEGO1 0x10101e20 return "MxLoopingFlcPresenter"; } + // FUNCTION: LEGO1 0x100b4380 + // FUNCTION: BETA10 0x1013c300 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + void RepeatingTickle() override; // vtable+0x24 MxResult AddToManager() override; // vtable+0x34 void Destroy() override; // vtable+0x38 diff --git a/LEGO1/omni/include/mxloopingmidipresenter.h b/LEGO1/omni/include/mxloopingmidipresenter.h index 1a9eff73..0bdd191e 100644 --- a/LEGO1/omni/include/mxloopingmidipresenter.h +++ b/LEGO1/omni/include/mxloopingmidipresenter.h @@ -7,13 +7,20 @@ // SIZE 0x58 class MxLoopingMIDIPresenter : public MxMIDIPresenter { public: - // FUNCTION: LEGO1 0x100b1830 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1012f0b0 + static const char* HandlerClassName() { // STRING: LEGO1 0x10101de0 return "MxLoopingMIDIPresenter"; } + // FUNCTION: LEGO1 0x100b1830 + // FUNCTION: BETA10 0x10143910 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100b1840 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxloopingsmkpresenter.h b/LEGO1/omni/include/mxloopingsmkpresenter.h index de0f506f..a71b00e1 100644 --- a/LEGO1/omni/include/mxloopingsmkpresenter.h +++ b/LEGO1/omni/include/mxloopingsmkpresenter.h @@ -11,13 +11,20 @@ class MxLoopingSmkPresenter : public MxSmkPresenter { MxLoopingSmkPresenter(); ~MxLoopingSmkPresenter() override; // vtable+0x00 - // FUNCTION: LEGO1 0x100b4920 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1012f070 + static const char* HandlerClassName() { // STRING: LEGO1 0x10101e08 return "MxLoopingSmkPresenter"; } + // FUNCTION: LEGO1 0x100b4920 + // FUNCTION: BETA10 0x1013c360 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + void RepeatingTickle() override; // vtable+0x24 MxResult AddToManager() override; // vtable+0x34 void Destroy() override; // vtable+0x38 diff --git a/LEGO1/omni/include/mxmediapresenter.h b/LEGO1/omni/include/mxmediapresenter.h index e78ac194..83dc2c28 100644 --- a/LEGO1/omni/include/mxmediapresenter.h +++ b/LEGO1/omni/include/mxmediapresenter.h @@ -18,13 +18,20 @@ class MxMediaPresenter : public MxPresenter { MxResult Tickle() override; // vtable+0x08 - // FUNCTION: LEGO1 0x1000c5c0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x10054f50 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f074c return "MxMediaPresenter"; } + // FUNCTION: LEGO1 0x1000c5c0 + // FUNCTION: BETA10 0x10054f20 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000c5d0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxmidipresenter.h b/LEGO1/omni/include/mxmidipresenter.h index adab6fe2..35eefd4d 100644 --- a/LEGO1/omni/include/mxmidipresenter.h +++ b/LEGO1/omni/include/mxmidipresenter.h @@ -12,13 +12,20 @@ class MxMIDIPresenter : public MxMusicPresenter { MxMIDIPresenter(); ~MxMIDIPresenter() override; - // FUNCTION: LEGO1 0x100c2650 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1012f090 + static const char* HandlerClassName() { // STRING: LEGO1 0x10101df8 return "MxMIDIPresenter"; } + // FUNCTION: LEGO1 0x100c2650 + // FUNCTION: BETA10 0x10143a90 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100c2660 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxmusicpresenter.h b/LEGO1/omni/include/mxmusicpresenter.h index a66afa78..ec9a37ce 100644 --- a/LEGO1/omni/include/mxmusicpresenter.h +++ b/LEGO1/omni/include/mxmusicpresenter.h @@ -10,13 +10,20 @@ class MxMusicPresenter : public MxAudioPresenter { MxMusicPresenter(); ~MxMusicPresenter() override; - // FUNCTION: LEGO1 0x100c23a0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x10143a70 + static const char* HandlerClassName() { // STRING: LEGO1 0x10101e48 return "MxMusicPresenter"; } + // FUNCTION: LEGO1 0x100c23a0 + // FUNCTION: BETA10 0x10143a50 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100c23b0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxpresenter.h b/LEGO1/omni/include/mxpresenter.h index a652f40d..b865a52f 100644 --- a/LEGO1/omni/include/mxpresenter.h +++ b/LEGO1/omni/include/mxpresenter.h @@ -33,13 +33,20 @@ class MxPresenter : public MxCore { MxResult Tickle() override; // vtable+0x08 - // FUNCTION: LEGO1 0x1000bfe0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1004d9e0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0740 return "MxPresenter"; } + // FUNCTION: LEGO1 0x1000bfe0 + // FUNCTION: BETA10 0x1004d9b0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000bff0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxsmkpresenter.h b/LEGO1/omni/include/mxsmkpresenter.h index d17ce59d..eccd6737 100644 --- a/LEGO1/omni/include/mxsmkpresenter.h +++ b/LEGO1/omni/include/mxsmkpresenter.h @@ -12,13 +12,20 @@ class MxSmkPresenter : public MxVideoPresenter { MxSmkPresenter(); ~MxSmkPresenter() override; - // FUNCTION: LEGO1 0x100b3730 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1012f010 + static const char* HandlerClassName() { // STRING: LEGO1 0x10101e38 return "MxSmkPresenter"; } + // FUNCTION: LEGO1 0x100b3730 + // FUNCTION: BETA10 0x1013b8c0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100b3740 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxsoundpresenter.h b/LEGO1/omni/include/mxsoundpresenter.h index 3f578109..e56aa1fd 100644 --- a/LEGO1/omni/include/mxsoundpresenter.h +++ b/LEGO1/omni/include/mxsoundpresenter.h @@ -10,13 +10,20 @@ class MxSoundPresenter : public MxAudioPresenter { // FUNCTION: LEGO1 0x1000d430 ~MxSoundPresenter() override { Destroy(TRUE); } - // FUNCTION: LEGO1 0x1000d4a0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1008ca70 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f07a0 return "MxSoundPresenter"; } + // FUNCTION: LEGO1 0x1000d4a0 + // FUNCTION: BETA10 0x1008ca40 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000d4b0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxstillpresenter.h b/LEGO1/omni/include/mxstillpresenter.h index 0fb92862..3364085f 100644 --- a/LEGO1/omni/include/mxstillpresenter.h +++ b/LEGO1/omni/include/mxstillpresenter.h @@ -13,13 +13,20 @@ class MxStillPresenter : public MxVideoPresenter { // FUNCTION: LEGO1 0x10043550 ~MxStillPresenter() override { Destroy(TRUE); } // vtable+0x00 - // FUNCTION: LEGO1 0x100435c0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100980c0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0184 return "MxStillPresenter"; } + // FUNCTION: LEGO1 0x100435c0 + // FUNCTION: BETA10 0x10098090 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x100435d0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxvideopresenter.h b/LEGO1/omni/include/mxvideopresenter.h index 19a40e39..55770f60 100644 --- a/LEGO1/omni/include/mxvideopresenter.h +++ b/LEGO1/omni/include/mxvideopresenter.h @@ -17,13 +17,20 @@ class MxVideoPresenter : public MxMediaPresenter { // FUNCTION: LEGO1 0x1000c740 ~MxVideoPresenter() override { Destroy(TRUE); } // vtable+0x00 - // FUNCTION: LEGO1 0x1000c820 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x100551b0 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f0760 return "MxVideoPresenter"; } + // FUNCTION: LEGO1 0x1000c820 + // FUNCTION: BETA10 0x10055180 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000c830 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/include/mxwavepresenter.h b/LEGO1/omni/include/mxwavepresenter.h index 27bd1824..12ed817e 100644 --- a/LEGO1/omni/include/mxwavepresenter.h +++ b/LEGO1/omni/include/mxwavepresenter.h @@ -15,13 +15,20 @@ class MxWavePresenter : public MxSoundPresenter { // FUNCTION: LEGO1 0x1000d640 ~MxWavePresenter() override { Destroy(TRUE); } // vtable+0x00 - // FUNCTION: LEGO1 0x1000d6c0 - inline const char* ClassName() const override // vtable+0x0c + // FUNCTION: BETA10 0x1008cd00 + static const char* HandlerClassName() { // STRING: LEGO1 0x100f07b4 return "MxWavePresenter"; } + // FUNCTION: LEGO1 0x1000d6c0 + // FUNCTION: BETA10 0x1008ccd0 + inline const char* ClassName() const override // vtable+0x0c + { + return HandlerClassName(); + } + // FUNCTION: LEGO1 0x1000d6d0 inline MxBool IsA(const char* p_name) const override // vtable+0x10 { diff --git a/LEGO1/omni/src/common/mxpresenter.cpp b/LEGO1/omni/src/common/mxpresenter.cpp index be530f58..5d19f091 100644 --- a/LEGO1/omni/src/common/mxpresenter.cpp +++ b/LEGO1/omni/src/common/mxpresenter.cpp @@ -8,13 +8,22 @@ #include "mxdsanim.h" #include "mxdssound.h" #include "mxentity.h" +#include "mxeventpresenter.h" +#include "mxflcpresenter.h" +#include "mxloopingflcpresenter.h" +#include "mxloopingmidipresenter.h" +#include "mxloopingsmkpresenter.h" +#include "mxmidipresenter.h" #include "mxmisc.h" #include "mxnotificationmanager.h" #include "mxobjectfactory.h" #include "mxomni.h" #include "mxparam.h" +#include "mxsmkpresenter.h" +#include "mxstillpresenter.h" #include "mxstreamer.h" #include "mxutilities.h" +#include "mxwavepresenter.h" #include @@ -175,6 +184,7 @@ void MxPresenter::Enable(MxBool p_enable) } // FUNCTION: LEGO1 0x100b5310 +// FUNCTION: BETA10 0x1012e8bd const char* PresenterNameDispatch(const MxDSAction& p_action) { const char* name = p_action.GetSourceName(); @@ -186,10 +196,12 @@ const char* PresenterNameDispatch(const MxDSAction& p_action) format = ((MxDSAnim&) p_action).GetMediaFormat(); switch (format) { case FOURCC(' ', 'F', 'L', 'C'): - name = !p_action.IsLooping() ? "MxFlcPresenter" : "MxLoopingFlcPresenter"; + name = !p_action.IsLooping() ? MxFlcPresenter::HandlerClassName() + : MxLoopingFlcPresenter::HandlerClassName(); break; case FOURCC(' ', 'S', 'M', 'K'): - name = !p_action.IsLooping() ? "MxSmkPresenter" : "MxLoopingSmkPresenter"; + name = !p_action.IsLooping() ? MxSmkPresenter::HandlerClassName() + : MxLoopingSmkPresenter::HandlerClassName(); break; } break; @@ -198,10 +210,11 @@ const char* PresenterNameDispatch(const MxDSAction& p_action) format = ((MxDSSound&) p_action).GetMediaFormat(); switch (format) { case FOURCC(' ', 'M', 'I', 'D'): - name = !p_action.IsLooping() ? "MxMIDIPresenter" : "MxLoopingMIDIPresenter"; + name = !p_action.IsLooping() ? MxMIDIPresenter::HandlerClassName() + : MxLoopingMIDIPresenter::HandlerClassName(); break; case FOURCC(' ', 'W', 'A', 'V'): - name = "MxWavePresenter"; + name = MxWavePresenter::HandlerClassName(); break; } break; @@ -209,15 +222,15 @@ const char* PresenterNameDispatch(const MxDSAction& p_action) case MxDSObject::e_serialAction: case MxDSObject::e_parallelAction: case MxDSObject::e_selectAction: - name = "MxCompositePresenter"; + name = MxCompositePresenter::HandlerClassName(); break; case MxDSObject::e_event: - name = "MxEventPresenter"; + name = MxEventPresenter::HandlerClassName(); break; case MxDSObject::e_still: - name = "MxStillPresenter"; + name = MxStillPresenter::HandlerClassName(); break; } }