From fe36c2543ee5e52e164b24a0d87ba70d646cef04 Mon Sep 17 00:00:00 2001 From: jonschz <17198703+jonschz@users.noreply.github.com> Date: Sun, 26 Jan 2025 08:02:01 +0100 Subject: [PATCH] BETA10 match `RegistrationBook::ReadyWorld()` (#1376) --------- Co-authored-by: jonschz --- LEGO1/lego/legoomni/include/infocenter.h | 3 +++ LEGO1/lego/legoomni/include/legomain.h | 2 ++ .../lego/legoomni/include/registrationbook.h | 2 +- LEGO1/lego/legoomni/src/common/misc.cpp | 3 +++ .../lego/legoomni/src/worlds/historybook.cpp | 2 ++ .../legoomni/src/worlds/registrationbook.cpp | 25 ++++++++++++++++++- 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/LEGO1/lego/legoomni/include/infocenter.h b/LEGO1/lego/legoomni/include/infocenter.h index 7749cc84..f4c86a67 100644 --- a/LEGO1/lego/legoomni/include/infocenter.h +++ b/LEGO1/lego/legoomni/include/infocenter.h @@ -40,7 +40,10 @@ public: MxS16 GetMaxNameLength() { return sizeOfArray(m_letters); } MxStillPresenter* GetNameLetter(MxS32 p_index) { return m_letters[p_index]; } void SetNameLetter(MxS32 p_index, MxStillPresenter* p_letter) { m_letters[p_index] = p_letter; } + + // FUNCTION: BETA10 0x10031bd0 MxBool HasRegistered() { return m_letters[0] != NULL; } + Playlist& GetExitDialogueAct1() { return m_exitDialogueAct1; } Playlist& GetExitDialogueAct23() { return m_exitDialogueAct23; } Playlist& GetReturnDialogue(LegoGameState::Act p_act) { return m_returnDialogue[p_act]; } diff --git a/LEGO1/lego/legoomni/include/legomain.h b/LEGO1/lego/legoomni/include/legomain.h index 1ab6c2ee..263d59d5 100644 --- a/LEGO1/lego/legoomni/include/legomain.h +++ b/LEGO1/lego/legoomni/include/legomain.h @@ -168,7 +168,9 @@ public: // FUNCTION: BETA10 0x100e52b0 LegoGameState* GetGameState() { return m_gameState; } + // FUNCTION: BETA10 0x100e5280 MxBackgroundAudioManager* GetBackgroundAudioManager() { return m_bkgAudioManager; } + MxTransitionManager* GetTransitionManager() { return m_transitionManager; } MxDSAction& GetCurrentAction() { return m_action; } LegoCharacterManager* GetCharacterManager() { return m_characterManager; } diff --git a/LEGO1/lego/legoomni/include/registrationbook.h b/LEGO1/lego/legoomni/include/registrationbook.h index 3e2cf367..146bcf30 100644 --- a/LEGO1/lego/legoomni/include/registrationbook.h +++ b/LEGO1/lego/legoomni/include/registrationbook.h @@ -40,7 +40,7 @@ public: MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 - inline void PlayAction(MxU32 p_objectId); + inline static void PlayAction(MxU32 p_objectId); // SYNTHETIC: LEGO1 0x10076f30 // RegistrationBook::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/src/common/misc.cpp b/LEGO1/lego/legoomni/src/common/misc.cpp index 28f6c039..08072b7c 100644 --- a/LEGO1/lego/legoomni/src/common/misc.cpp +++ b/LEGO1/lego/legoomni/src/common/misc.cpp @@ -212,8 +212,11 @@ MxTransitionManager* TransitionManager() } // FUNCTION: LEGO1 0x10015910 +// FUNCTION: BETA10 0x100e4f4c void PlayMusic(JukeboxScript::Script p_objectId) { + assert(LegoOmni::GetInstance()); + MxDSAction action; action.SetAtomId(*g_jukeboxScript); action.SetObjectId(p_objectId); diff --git a/LEGO1/lego/legoomni/src/worlds/historybook.cpp b/LEGO1/lego/legoomni/src/worlds/historybook.cpp index b3df73d5..f31f1258 100644 --- a/LEGO1/lego/legoomni/src/worlds/historybook.cpp +++ b/LEGO1/lego/legoomni/src/worlds/historybook.cpp @@ -103,6 +103,8 @@ void HistoryBook::ReadyWorld() MxS16 i; for (i = 0; i < 26; i++) { + // TODO: This might be an inline function. + // See also `RegistrationBook::ReadyWorld()`. if (i < 26) { m_alphabet[i] = (MxStillPresenter*) Find("MxStillPresenter", bitmap); assert(m_alphabet[i]); diff --git a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp index 7a4a43c2..c1aed0a9 100644 --- a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp +++ b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp @@ -32,6 +32,7 @@ DECOMP_SIZE_ASSERT(RegistrationBook, 0x2d0) // GLOBAL: LEGO1 0x100d9924 +// GLOBAL: BETA10 0x101bfb3c const char* g_infoman = "infoman"; // GLOBAL: LEGO1 0x100f7964 @@ -268,6 +269,7 @@ MxLong RegistrationBook::HandleControl(LegoControlManagerNotificationParam& p_pa } // FUNCTION: LEGO1 0x100775c0 +// STUB: BETA10 0x100f32b2 void RegistrationBook::FUN_100775c0(MxS16 p_playerIndex) { if (m_infocenterState->HasRegistered()) { @@ -388,10 +390,17 @@ void RegistrationBook::FUN_100778c0() } // FUNCTION: LEGO1 0x10077cc0 +// FUNCTION: BETA10 0x100f3671 void RegistrationBook::ReadyWorld() { + // This function is very fragile and appears to oscillate between two versions on small changes. + // This even happens for commenting out `assert()` calls, which shouldn't affect release builds at all. + // See https://github.com/isledecomp/isle/pull/1375 for a version that had 100 %. + +#ifndef BETA10 LegoGameState* gameState = GameState(); gameState->m_history.WriteScoreHistory(); +#endif PlayMusic(JukeboxScript::c_InformationCenter_Music); @@ -399,8 +408,11 @@ void RegistrationBook::ReadyWorld() MxS16 i; for (i = 0; i < 26; i++) { + // TODO: This might be an inline function. + // See also `HistoryBook::ReadyWorld()`. if (i < 26) { m_alphabet[i] = (MxStillPresenter*) Find("MxStillPresenter", letterBuffer); + assert(m_alphabet[i]); // We need to loop through the entire alphabet, // so increment the first char of the bitmap name @@ -412,6 +424,7 @@ void RegistrationBook::ReadyWorld() char checkmarkBuffer[] = "Check0_Ctl"; for (i = 0; i < 10; i++) { m_checkmark[i] = (MxControlPresenter*) Find("MxControlPresenter", checkmarkBuffer); + assert(m_checkmark[i]); // Just like in the prior letter loop, // we need to increment the fifth char @@ -431,6 +444,7 @@ void RegistrationBook::ReadyWorld() // Start building the player names using a two-dimensional array m_name[i][j] = m_alphabet[players[i - 1].m_letters[j]]->Clone(); + assert(m_name[i][j]); // Enable the presenter to actually show the letter in the grid m_name[i][j]->Enable(TRUE); @@ -440,7 +454,15 @@ void RegistrationBook::ReadyWorld() } } - if (m_infocenterState->m_letters[0] != NULL) { +#ifdef BETA10 + InfocenterState* infocenterState = (InfocenterState*) GameState()->GetState("InfocenterState"); + assert(infocenterState); + + if (infocenterState->HasRegistered()) +#else + if (m_infocenterState->HasRegistered()) +#endif + { PlayAction(RegbookScript::c_iic008in_PlayWav); LegoROI* infoman = FindROI(g_infoman); @@ -453,6 +475,7 @@ void RegistrationBook::ReadyWorld() } } +// FUNCTION: BETA10 0x100f3424 inline void RegistrationBook::PlayAction(MxU32 p_objectId) { MxDSAction action;