From cdd801dcec32b295314a7509f9b273beec92096e Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:06:38 +0000 Subject: [PATCH] Fix quit message not blocking advertise movie (#127) --- UnleashedRecomp/CMakeLists.txt | 3 +- .../Universe/Engine/hhStateMachineBase.h | 32 +++++++++++++++++++ .../Universe/Engine/hhStateMachineBase.inl | 13 ++++++++ .../Engine/hhStateMachineMessageReceiver.h | 12 +++++++ UnleashedRecomp/api/SWA.h | 4 +++ .../api/SWA/System/GameMode/GameMode.h | 3 +- .../SWA/System/GameMode/GameModeStageTitle.h | 14 ++++++++ .../System/GameMode/Title/TitleStateBase.h | 9 ++---- .../System/GameMode/Title/TitleStateIntro.h | 8 +++++ .../patches/CGameModeStageTitle_patches.cpp | 14 ++++++++ .../patches/ui/CTitleStateIntro_patches.cpp | 1 + .../patches/ui/CTitleStateIntro_patches.h | 3 ++ .../patches/ui/CTitleStateMenu_patches.cpp | 11 ++++--- 13 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.h create mode 100644 UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.inl create mode 100644 UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineMessageReceiver.h create mode 100644 UnleashedRecomp/api/SWA/System/GameMode/GameModeStageTitle.h create mode 100644 UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateIntro.h create mode 100644 UnleashedRecomp/patches/CGameModeStageTitle_patches.cpp create mode 100644 UnleashedRecomp/patches/ui/CTitleStateIntro_patches.h diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index 378297f..80da98b 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -154,7 +154,8 @@ set(SWA_PATCHES_CXX_SOURCES "patches/ui/frontend_listener.cpp" "patches/aspect_ratio_patches.cpp" "patches/audio_patches.cpp" - "patches/camera_patches.cpp" + "patches/camera_patches.cpp" + "patches/CGameModeStageTitle_patches.cpp" "patches/fps_patches.cpp" "patches/inspire_patches.cpp" "patches/misc_patches.cpp" diff --git a/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.h b/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.h new file mode 100644 index 0000000..269cf86 --- /dev/null +++ b/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include + +namespace Hedgehog::Universe +{ + class CStateMachineBase : public IStateMachineMessageReceiver, public Base::CObject + { + public: + class CStateBase : public IMessageProcess + { + public: + SWA_INSERT_PADDING(0x08); + xpointer m_pContext; + xpointer m_pStateMachine; + be m_Time; + SWA_INSERT_PADDING(0x4C); + + void* GetContextBase() const; + + template + T* GetContextBase() const; + }; + + SWA_INSERT_PADDING(0x60); + }; +} + +#include diff --git a/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.inl b/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.inl new file mode 100644 index 0000000..0750b37 --- /dev/null +++ b/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineBase.inl @@ -0,0 +1,13 @@ +namespace Hedgehog::Universe +{ + inline void* CStateMachineBase::CStateBase::GetContextBase() const + { + return m_pContext; + } + + template + inline T* CStateMachineBase::CStateBase::GetContextBase() const + { + return (T*)m_pContext.get(); + } +} diff --git a/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineMessageReceiver.h b/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineMessageReceiver.h new file mode 100644 index 0000000..f75ce5e --- /dev/null +++ b/UnleashedRecomp/api/Hedgehog/Universe/Engine/hhStateMachineMessageReceiver.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace Hedgehog::Universe +{ + class IStateMachineMessageReceiver + { + public: + IStateMachineMessageReceiver(const swa_null_ctor&) {} + }; +} diff --git a/UnleashedRecomp/api/SWA.h b/UnleashedRecomp/api/SWA.h index 20c3ea9..e2a846e 100644 --- a/UnleashedRecomp/api/SWA.h +++ b/UnleashedRecomp/api/SWA.h @@ -47,6 +47,8 @@ #include "Hedgehog/Sparkle/hhParticleMaterial.h" #include "Hedgehog/Universe/Engine/hhMessageActor.h" #include "Hedgehog/Universe/Engine/hhMessageProcess.h" +#include "Hedgehog/Universe/Engine/hhStateMachineBase.h" +#include "Hedgehog/Universe/Engine/hhStateMachineMessageReceiver.h" #include "Hedgehog/Universe/Engine/hhUpdateInfo.h" #include "Hedgehog/Universe/Engine/hhUpdateUnit.h" #include "Hedgehog/Universe/Thread/hhParallelJob.h" @@ -91,8 +93,10 @@ #include "SWA/System/GameMode/GameMode.h" #include "SWA/System/GameMode/GameModeStage.h" #include "SWA/System/GameMode/GameModeStageMovie.h" +#include "SWA/System/GameMode/GameModeStageTitle.h" #include "SWA/System/GameMode/Title/TitleMenu.h" #include "SWA/System/GameMode/Title/TitleStateBase.h" +#include "SWA/System/GameMode/Title/TitleStateIntro.h" #include "SWA/System/GameObject.h" #include "SWA/System/GameParameter.h" #include "SWA/System/GammaController.h" diff --git a/UnleashedRecomp/api/SWA/System/GameMode/GameMode.h b/UnleashedRecomp/api/SWA/System/GameMode/GameMode.h index 5b6c35d..8c64abc 100644 --- a/UnleashedRecomp/api/SWA/System/GameMode/GameMode.h +++ b/UnleashedRecomp/api/SWA/System/GameMode/GameMode.h @@ -4,10 +4,9 @@ namespace SWA { - class CGameMode // : Hedgehog::Universe::TStateMachine::TState + class CGameMode : public Hedgehog::Universe::CStateMachineBase::CStateBase { public: - SWA_INSERT_PADDING(0x60); // base SWA_INSERT_PADDING(0x08); }; } diff --git a/UnleashedRecomp/api/SWA/System/GameMode/GameModeStageTitle.h b/UnleashedRecomp/api/SWA/System/GameMode/GameModeStageTitle.h new file mode 100644 index 0000000..b2b6f84 --- /dev/null +++ b/UnleashedRecomp/api/SWA/System/GameMode/GameModeStageTitle.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace SWA +{ + class CGameModeStageTitle : public CGameModeStage + { + public: + SWA_INSERT_PADDING(0x0E); + bool m_IsPlayingAdvertiseMovie; + be m_AdvertiseMovieWaitTime; + }; +} diff --git a/UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateBase.h b/UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateBase.h index 6782f3b..da38b6c 100644 --- a/UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateBase.h +++ b/UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateBase.h @@ -4,19 +4,14 @@ namespace SWA { - class CTitleStateBase // : Hedgehog::Universe::TStateMachine::TState + class CTitleStateBase : public Hedgehog::Universe::CStateMachineBase::CStateBase { public: - class CMember + class CTitleStateContext { public: SWA_INSERT_PADDING(0x1E8); xpointer m_pTitleMenu; }; - - SWA_INSERT_PADDING(0x08); - xpointer m_pMember; - SWA_INSERT_PADDING(0x5C); - be m_State; }; } diff --git a/UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateIntro.h b/UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateIntro.h new file mode 100644 index 0000000..618a078 --- /dev/null +++ b/UnleashedRecomp/api/SWA/System/GameMode/Title/TitleStateIntro.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace SWA +{ + class CTitleStateIntro : public CTitleStateBase {}; +} diff --git a/UnleashedRecomp/patches/CGameModeStageTitle_patches.cpp b/UnleashedRecomp/patches/CGameModeStageTitle_patches.cpp new file mode 100644 index 0000000..15fdb3b --- /dev/null +++ b/UnleashedRecomp/patches/CGameModeStageTitle_patches.cpp @@ -0,0 +1,14 @@ +#include +#include + +// SWA::CGameModeStageTitle::Update +PPC_FUNC_IMPL(__imp__sub_825518B8); +PPC_FUNC(sub_825518B8) +{ + auto pGameModeStageTitle = (SWA::CGameModeStageTitle*)g_memory.Translate(ctx.r3.u32); + + __imp__sub_825518B8(ctx, base); + + if (g_quitMessageOpen) + pGameModeStageTitle->m_AdvertiseMovieWaitTime = 0; +} diff --git a/UnleashedRecomp/patches/ui/CTitleStateIntro_patches.cpp b/UnleashedRecomp/patches/ui/CTitleStateIntro_patches.cpp index 4b7f8b6..dfc6db1 100644 --- a/UnleashedRecomp/patches/ui/CTitleStateIntro_patches.cpp +++ b/UnleashedRecomp/patches/ui/CTitleStateIntro_patches.cpp @@ -1,3 +1,4 @@ +#include "CTitleStateIntro_patches.h" #include #include #include diff --git a/UnleashedRecomp/patches/ui/CTitleStateIntro_patches.h b/UnleashedRecomp/patches/ui/CTitleStateIntro_patches.h new file mode 100644 index 0000000..74a123a --- /dev/null +++ b/UnleashedRecomp/patches/ui/CTitleStateIntro_patches.h @@ -0,0 +1,3 @@ +#pragma once + +extern bool g_quitMessageOpen; diff --git a/UnleashedRecomp/patches/ui/CTitleStateMenu_patches.cpp b/UnleashedRecomp/patches/ui/CTitleStateMenu_patches.cpp index aea4b65..c4050a7 100644 --- a/UnleashedRecomp/patches/ui/CTitleStateMenu_patches.cpp +++ b/UnleashedRecomp/patches/ui/CTitleStateMenu_patches.cpp @@ -50,15 +50,18 @@ PPC_FUNC_IMPL(__imp__sub_825882B8); PPC_FUNC(sub_825882B8) { auto pTitleState = (SWA::CTitleStateBase*)g_memory.Translate(ctx.r3.u32); + auto pInputState = SWA::CInputState::GetInstance(); auto& pPadState = pInputState->GetPadState(); auto isAccepted = pPadState.IsTapped(SWA::eKeyState_A) || pPadState.IsTapped(SWA::eKeyState_Start); - auto isOptionsIndex = pTitleState->m_pMember->m_pTitleMenu->m_CursorIndex == 2; - auto isInstallIndex = pTitleState->m_pMember->m_pTitleMenu->m_CursorIndex == 3; + + auto pContext = pTitleState->GetContextBase(); + auto isOptionsIndex = pContext->m_pTitleMenu->m_CursorIndex == 2; + auto isInstallIndex = pContext->m_pTitleMenu->m_CursorIndex == 3; // Always default to New Game with corrupted save data. - if (App::s_isSaveDataCorrupt && pTitleState->m_pMember->m_pTitleMenu->m_CursorIndex == 1) - pTitleState->m_pMember->m_pTitleMenu->m_CursorIndex = 0; + if (App::s_isSaveDataCorrupt && pContext->m_pTitleMenu->m_CursorIndex == 1) + pContext->m_pTitleMenu->m_CursorIndex = 0; if (!OptionsMenu::s_isVisible && isOptionsIndex) {