Fix auto controller icons breaking loading screen graphics (#64)

This commit is contained in:
Hyper 2024-12-27 20:58:41 +00:00 committed by GitHub
parent c98f3942d6
commit bab9705151
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 37 additions and 5 deletions

View file

@ -20,8 +20,12 @@ namespace SWA
class CLoading class CLoading
{ {
public: public:
SWA_INSERT_PADDING(0x128); SWA_INSERT_PADDING(0xD8);
bool m_IsVisible; be<uint32_t> m_pUnk;
SWA_INSERT_PADDING(0x3C);
Chao::CSD::RCPtr<Chao::CSD::CScene> m_rcNightToDay;
SWA_INSERT_PADDING(0x0C);
be<uint32_t> m_IsVisible;
SWA_INSERT_PADDING(0x0C); SWA_INSERT_PADDING(0x0C);
be<ELoadingDisplayType> m_LoadingDisplayType; be<ELoadingDisplayType> m_LoadingDisplayType;
SWA_INSERT_PADDING(0x65); SWA_INSERT_PADDING(0x65);

View file

@ -7,6 +7,7 @@ class App
public: public:
static inline bool s_isInit; static inline bool s_isInit;
static inline bool s_isMissingDLC; static inline bool s_isMissingDLC;
static inline bool s_isLoading;
static inline ELanguage s_language; static inline ELanguage s_language;

View file

@ -4,6 +4,7 @@
#include <hid/hid_detail.h> #include <hid/hid_detail.h>
#include <ui/game_window.h> #include <ui/game_window.h>
#include <kernel/xdm.h> #include <kernel/xdm.h>
#include <app.h>
#define TRANSLATE_INPUT(S, X) SDL_GameControllerGetButton(controller, S) << FirstBitLow(X) #define TRANSLATE_INPUT(S, X) SDL_GameControllerGetButton(controller, S) << FirstBitLow(X)
#define VIBRATION_TIMEOUT_MS 5000 #define VIBRATION_TIMEOUT_MS 5000
@ -163,6 +164,10 @@ inline Controller* FindController(int which)
static void SetControllerInputDevice(Controller* controller) static void SetControllerInputDevice(Controller* controller)
{ {
g_activeController = controller; g_activeController = controller;
if (App::s_isLoading)
return;
hid::detail::g_inputDevice = controller->GetInputDevice(); hid::detail::g_inputDevice = controller->GetInputDevice();
hid::detail::g_inputDeviceController = hid::detail::g_inputDevice; hid::detail::g_inputDeviceController = hid::detail::g_inputDevice;
} }

View file

@ -3,6 +3,8 @@
#include <user/config.h> #include <user/config.h>
#include <api/SWA.h> #include <api/SWA.h>
#include <os/logger.h> #include <os/logger.h>
#include <hid/hid_detail.h>
#include <app.h>
const char* m_pStageID; const char* m_pStageID;
@ -13,10 +15,12 @@ void GetStageIDMidAsmHook(PPCRegister& r5)
m_pStageID = *(xpointer<const char>*)g_memory.Translate(r5.u32); m_pStageID = *(xpointer<const char>*)g_memory.Translate(r5.u32);
} }
// Loading screen hook. // SWA::Message::MsgRequestStartLoading::Impl
PPC_FUNC_IMPL(__imp__sub_824DCF38); PPC_FUNC_IMPL(__imp__sub_824DCF38);
PPC_FUNC(sub_824DCF38) PPC_FUNC(sub_824DCF38)
{ {
App::s_isLoading = true;
// TODO: use the actual PS3 loading screen ("n_2_d"). // TODO: use the actual PS3 loading screen ("n_2_d").
if (Config::TimeOfDayTransition == ETimeOfDayTransition::PlayStation) if (Config::TimeOfDayTransition == ETimeOfDayTransition::PlayStation)
{ {
@ -35,6 +39,18 @@ PPC_FUNC(sub_824DCF38)
__imp__sub_824DCF38(ctx, base); __imp__sub_824DCF38(ctx, base);
} }
// SWA::CLoading::Update
PPC_FUNC_IMPL(__imp__sub_824DAB60);
PPC_FUNC(sub_824DAB60)
{
auto pLoading = (SWA::CLoading*)g_memory.Translate(ctx.r3.u32);
__imp__sub_824DAB60(ctx, base);
if (!pLoading->m_LoadingDisplayType)
App::s_isLoading = false;
}
// Load voice language files. // Load voice language files.
PPC_FUNC_IMPL(__imp__sub_824EB9B0); PPC_FUNC_IMPL(__imp__sub_824EB9B0);
PPC_FUNC(sub_824EB9B0) PPC_FUNC(sub_824EB9B0)
@ -112,10 +128,16 @@ void LoadingScreenControllerMidAsmHook()
0x820301C4, // 360_sonic3 0x820301C4, // 360_sonic3
0x820301D0, // 360_evil 0x820301D0, // 360_evil
0x820301DC, // 360_robo 0x820301DC, // 360_robo
0x820301E8, // 360_super 0x820301E8 // 360_super
}; };
const char* prefix = Config::ControllerIcons == EControllerIcons::PlayStation ? "ps3" : "360"; auto isPlayStation = Config::ControllerIcons == EControllerIcons::PlayStation;
if (Config::ControllerIcons == EControllerIcons::Auto)
isPlayStation = hid::detail::g_inputDeviceController == hid::detail::EInputDevice::PlayStation;
const char* prefix = isPlayStation ? "ps3" : "360";
for (auto address : STR_ADDRESSES) for (auto address : STR_ADDRESSES)
memcpy(g_memory.Translate(address), prefix, 3); memcpy(g_memory.Translate(address), prefix, 3);
} }