From 322b293130f844c97800d4ffb0ebaec6cc9188b5 Mon Sep 17 00:00:00 2001 From: patataofcourse Date: Sun, 16 Mar 2025 20:23:29 +0100 Subject: [PATCH 1/6] Endless save scoring (0x205) --- include/Megamix/Commands.hpp | 2 + include/Megamix/Region.hpp | 15 +++++++ include/Megamix/Types.hpp | 52 +++++++++++++++++++++++- src/Megamix/Commands.cpp | 22 +++++++++++ src/Megamix/Region.cpp | 77 ++++++++++++++++++++++++++++++++++++ 5 files changed, 167 insertions(+), 1 deletion(-) diff --git a/include/Megamix/Commands.hpp b/include/Megamix/Commands.hpp index 9e0e212..9716dd4 100644 --- a/include/Megamix/Commands.hpp +++ b/include/Megamix/Commands.hpp @@ -8,6 +8,7 @@ namespace Megamix{ InputCheck = 0x200, VersionNumber = 0x201, LanguageCheck = 0x202, + EndlessSave = 0x205, DisplayCondvar = 0x300 }; @@ -20,6 +21,7 @@ namespace Megamix{ void versionCheck(CTickflow* self, u32 arg0, u32* args); void languageCheck(CTickflow* self, u32 arg0, u32* args); void displayCondvar(CTickflow* self, u32 arg0, u32* args); + void endlessSave(CTickflow* self, u32 arg0, u32* args); } #endif diff --git a/include/Megamix/Region.hpp b/include/Megamix/Region.hpp index dfa6d2b..dcd0feb 100644 --- a/include/Megamix/Region.hpp +++ b/include/Megamix/Region.hpp @@ -5,6 +5,7 @@ #include #include "types.h" +#include "Megamix/Types.hpp" extern u8 region; @@ -59,6 +60,20 @@ namespace Region { u32 RegionFSHookFunc(); u32 RegionOtherHookFunc(); + + Megamix::UnkStruct0054ef10* D_0054ef10(); + + typedef bool (*IsGateGameValidSignature) (Megamix::GateGameIndex index); + typedef u16 (*GetGateScoreSignature) (Megamix::CSaveManager* self, Megamix::GateGameIndex index, int file); + typedef void (*SetGateScoreSignature) (Megamix::CSaveManager* self, Megamix::GateGameIndex index, u16 score, int file); + typedef void (*SaveGameSignature) (Megamix::CSaveManager* self); + + IsGateGameValidSignature IsGateGameValidFunc(); + GetGateScoreSignature GetGateScoreFunc(); + SetGateScoreSignature SetGateScoreFunc(); + SaveGameSignature SaveGameFunc(); + + Megamix::CSaveManager* SaveManager(); } #endif \ No newline at end of file diff --git a/include/Megamix/Types.hpp b/include/Megamix/Types.hpp index af0af17..0004ab2 100644 --- a/include/Megamix/Types.hpp +++ b/include/Megamix/Types.hpp @@ -343,6 +343,9 @@ namespace Megamix { u32 currentFile; }; + // TODO + struct CSaveManager {}; + //----------------- //Input Manager //----------------- @@ -474,7 +477,7 @@ namespace Megamix { //----------------- - //File Manager + // File Manager //----------------- struct CFileManager { @@ -517,6 +520,53 @@ namespace Megamix { s32 id; }; + enum class GateGameIndex: u8 { + Game = 0xC, + AgbVirus = 0, + NtrCoinToss = 4, + RvlSword = 8, + CtrChicken = 0xC, + + Difficulty = 0x3, + Easy = 0, + Medium = 1, + Hard = 2, + Endless = 3, + + AgbVirusEasy = AgbVirus | Easy, + AgbVirusMedium = AgbVirus | Medium, + AgbVirusHard = AgbVirus | Hard, + AgbVirusEndless = AgbVirus | Endless, + NtrCoinTossEasy = NtrCoinToss | Easy, + NtrCoinTossMedium = NtrCoinToss | Medium, + NtrCoinTossHard = NtrCoinToss | Hard, + NtrCoinTossEndless = NtrCoinToss | Endless, + RvlSwordEasy = RvlSword | Easy, + RvlSwordMedium = RvlSword | Medium, + RvlSwordHard = RvlSword | Hard, + RvlSwordEndless = RvlSword | Endless, + CtrChickenEasy = CtrChicken | Easy, + CtrChickenMedium = CtrChicken | Medium, + CtrChickenHard = CtrChicken | Hard, + CtrChickenEndless = CtrChicken | Endless, + + Invalid = 0x11, + }; + + enum class GateGameRank : u8 { + Unplayed = 0, + Failed = 1, + Beaten = 2, + Invalid = 4, + }; + + // Not really sure what this is, and it's undocumented + struct UnkStruct0054ef10 { + u8 padding[0x4c]; + GateGameIndex currentGateSlot; + GateGameRank currentGateState; + }; + } // namespace Megamix #endif diff --git a/src/Megamix/Commands.cpp b/src/Megamix/Commands.cpp index 877dbd9..7a04f74 100644 --- a/src/Megamix/Commands.cpp +++ b/src/Megamix/Commands.cpp @@ -33,6 +33,9 @@ namespace Megamix{ case LanguageCheck: languageCheck(self, arg0, args); break; + case EndlessSave: + endlessSave(self, arg0, args); + break; // 0x300 range - debugging commands case DisplayCondvar: @@ -105,6 +108,25 @@ namespace Megamix{ } } + void endlessSave(CTickflow* self, u32 arg0, u32* args) { + using enum Megamix::GateGameIndex; + + if (arg0 != 0) return; + + // alternatively, load the current slot loaded with the tickflow hook into a global, and use that instead + // that way we can avoid the UB on non-gate slots + GateGameIndex slot = Region::D_0054ef10()->currentGateSlot; + if ((u8)slot & Difficulty != Endless || !Region::IsGateGameValidFunc()(slot)) + return; + + u32 oldScore = Region::GetGateScoreFunc()(Region::SaveManager(), slot, -1); + + if (oldScore < self->condvar) { + Region::SetGateScoreFunc()(Region::SaveManager(), slot, self->condvar, -1); + Region::SaveGameFunc()(Region::SaveManager()); + } + } + void displayCondvar(CTickflow* self, u32 arg0, u32* args) { // Keeping that just in case // Screen bottomScreen = OSD::GetBottomScreen(); diff --git a/src/Megamix/Region.cpp b/src/Megamix/Region.cpp index bfd1426..5c04a8c 100644 --- a/src/Megamix/Region.cpp +++ b/src/Megamix/Region.cpp @@ -420,4 +420,81 @@ namespace Region { } } + + // Endless stuff + + Megamix::UnkStruct0054ef10* D_0054ef10() { + switch (region) { + case US: + return (Megamix::UnkStruct0054ef10*)0x54ef10; + case JP: + case EU: + case KR: + default: + return 0; + } + } + + IsGateGameValidSignature IsGateGameValidFunc() { + switch (region) { + case US: + return (IsGateGameValidSignature)0x255550; + case JP: + case EU: + case KR: + default: + return 0; + } + } + + + GetGateScoreSignature GetGateScoreFunc() { + switch (region) { + case US: + return (GetGateScoreSignature)0x261a6c; + case JP: + case EU: + case KR: + default: + return 0; + } + } + + SetGateScoreSignature SetGateScoreFunc() { + switch (region) { + case US: + return (SetGateScoreSignature)0x2366c0; + case JP: + case EU: + case KR: + default: + return 0; + } + } + + SaveGameSignature SaveGameFunc() { + switch (region) { + case US: + return (SaveGameSignature)0x28bf14; + case JP: + case EU: + case KR: + default: + return 0; + } + } + + Megamix::CSaveManager* SaveManager() { + switch (region) { + case US: + return 0; + case JP: + case EU: + case KR: + default: + return 0; + + } + } + } \ No newline at end of file From 260a5ebe419143688188aa41aa684f2b9795655d Mon Sep 17 00:00:00 2001 From: patataofcourse Date: Sun, 13 Apr 2025 18:57:00 +0200 Subject: [PATCH 2/6] idr what these fixes were --- include/Megamix/Region.hpp | 4 ++-- include/Megamix/Types.hpp | 4 ++++ src/Megamix/Commands.cpp | 15 ++++++++++----- src/Megamix/Region.cpp | 8 ++++---- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/include/Megamix/Region.hpp b/include/Megamix/Region.hpp index dcd0feb..fd9dcb5 100644 --- a/include/Megamix/Region.hpp +++ b/include/Megamix/Region.hpp @@ -61,7 +61,7 @@ namespace Region { u32 RegionFSHookFunc(); u32 RegionOtherHookFunc(); - Megamix::UnkStruct0054ef10* D_0054ef10(); + Megamix::UnkStruct0054ef10** D_0054ef10(); typedef bool (*IsGateGameValidSignature) (Megamix::GateGameIndex index); typedef u16 (*GetGateScoreSignature) (Megamix::CSaveManager* self, Megamix::GateGameIndex index, int file); @@ -73,7 +73,7 @@ namespace Region { SetGateScoreSignature SetGateScoreFunc(); SaveGameSignature SaveGameFunc(); - Megamix::CSaveManager* SaveManager(); + Megamix::CSaveManager** SaveManager(); } #endif \ No newline at end of file diff --git a/include/Megamix/Types.hpp b/include/Megamix/Types.hpp index 0004ab2..84f0b0d 100644 --- a/include/Megamix/Types.hpp +++ b/include/Megamix/Types.hpp @@ -553,6 +553,10 @@ namespace Megamix { Invalid = 0x11, }; + inline GateGameIndex operator&(GateGameIndex lhs, GateGameIndex rhs) { + return (GateGameIndex)((u8)lhs & (u8)rhs); + } + enum class GateGameRank : u8 { Unplayed = 0, Failed = 1, diff --git a/src/Megamix/Commands.cpp b/src/Megamix/Commands.cpp index 7a04f74..5c1eb74 100644 --- a/src/Megamix/Commands.cpp +++ b/src/Megamix/Commands.cpp @@ -115,15 +115,20 @@ namespace Megamix{ // alternatively, load the current slot loaded with the tickflow hook into a global, and use that instead // that way we can avoid the UB on non-gate slots - GateGameIndex slot = Region::D_0054ef10()->currentGateSlot; - if ((u8)slot & Difficulty != Endless || !Region::IsGateGameValidFunc()(slot)) + GateGameIndex slot = (*Region::D_0054ef10())->currentGateSlot; + OSD::Notify(Utils::Format("%d", slot), CTRPluginFramework::Color::Red); + if ((slot & Difficulty) != Endless || !Region::IsGateGameValidFunc()(slot)) return; - u32 oldScore = Region::GetGateScoreFunc()(Region::SaveManager(), slot, -1); + CSaveManager* gSaveManager = *Region::SaveManager(); + + u32 oldScore = Region::GetGateScoreFunc()(gSaveManager, slot, -1); + + OSD::Notify(Utils::Format("%x %d %d", gSaveManager, self->condvar, oldScore), CTRPluginFramework::Color::Blue); if (oldScore < self->condvar) { - Region::SetGateScoreFunc()(Region::SaveManager(), slot, self->condvar, -1); - Region::SaveGameFunc()(Region::SaveManager()); + Region::SetGateScoreFunc()(gSaveManager, slot, self->condvar, -1); + Region::SaveGameFunc()(gSaveManager); } } diff --git a/src/Megamix/Region.cpp b/src/Megamix/Region.cpp index 5c04a8c..08cb581 100644 --- a/src/Megamix/Region.cpp +++ b/src/Megamix/Region.cpp @@ -423,10 +423,10 @@ namespace Region { // Endless stuff - Megamix::UnkStruct0054ef10* D_0054ef10() { + Megamix::UnkStruct0054ef10** D_0054ef10() { switch (region) { case US: - return (Megamix::UnkStruct0054ef10*)0x54ef10; + return (Megamix::UnkStruct0054ef10**)0x54ef10; case JP: case EU: case KR: @@ -484,10 +484,10 @@ namespace Region { } } - Megamix::CSaveManager* SaveManager() { + Megamix::CSaveManager** SaveManager() { switch (region) { case US: - return 0; + return (Megamix::CSaveManager**)0x54ef28; case JP: case EU: case KR: From ea6cf27e510869e786d6643055f61f8e4e9d04f6 Mon Sep 17 00:00:00 2001 From: patataofcourse Date: Fri, 18 Apr 2025 00:22:36 +0200 Subject: [PATCH 3/6] fix endless save scoring, for real plus, give types to a few pointers used in Commands.cpp --- include/Megamix/Region.hpp | 10 +++++----- src/Megamix/Commands.cpp | 26 ++++++++++++-------------- src/Megamix/Region.cpp | 18 +++++++++--------- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/include/Megamix/Region.hpp b/include/Megamix/Region.hpp index fd9dcb5..f1ca7aa 100644 --- a/include/Megamix/Region.hpp +++ b/include/Megamix/Region.hpp @@ -52,9 +52,9 @@ namespace Region { u32 TickflowCommandsEnd(); u32 TickflowAsyncSubLocation(); - u32 GlobalSaveDataPointer(); - u32 GlobalInputManagerPointer(); - u32 GlobalFileManagerPointer(); + Megamix::CSaveData** GlobalSaveDataPointer(); + Megamix::CInputManager** GlobalInputManagerPointer(); + Megamix::CFileManager** GlobalFileManagerPointer(); std::vector RetryRemixLocs(); @@ -64,8 +64,8 @@ namespace Region { Megamix::UnkStruct0054ef10** D_0054ef10(); typedef bool (*IsGateGameValidSignature) (Megamix::GateGameIndex index); - typedef u16 (*GetGateScoreSignature) (Megamix::CSaveManager* self, Megamix::GateGameIndex index, int file); - typedef void (*SetGateScoreSignature) (Megamix::CSaveManager* self, Megamix::GateGameIndex index, u16 score, int file); + typedef u16 (*GetGateScoreSignature) (Megamix::CSaveData* self, Megamix::GateGameIndex index, s32 file); + typedef void (*SetGateScoreSignature) (Megamix::CSaveData* self, Megamix::GateGameIndex index, u16 score, s32 file); typedef void (*SaveGameSignature) (Megamix::CSaveManager* self); IsGateGameValidSignature IsGateGameValidFunc(); diff --git a/src/Megamix/Commands.cpp b/src/Megamix/Commands.cpp index 5c1eb74..416ab1f 100644 --- a/src/Megamix/Commands.cpp +++ b/src/Megamix/Commands.cpp @@ -50,21 +50,21 @@ namespace Megamix{ self->condvar = 0; return; } else if (arg0 == 2) { - CSaveData** gSaveData = (CSaveData**)Region::GlobalSaveDataPointer(); + CSaveData** gSaveData = Region::GlobalSaveDataPointer(); // Here, arg0 gets replaced by the playstyle - 0 for buttons, 1 for tap - Results in playstyle-dependant reading arg0 = (u32)(*gSaveData)->fileData[(*gSaveData)->currentFile].playStyle; } - CInputManager** gInputManager = (CInputManager**)Region::GlobalInputManagerPointer(); + CInputManager* gInputManager = *Region::GlobalInputManagerPointer(); if (arg0 == 0) { if (args[0] >= 32) { // We're working with a 32-bit integer here, so flags are limited to bits 1-31 self->condvar = 0; return; } - self->condvar = ((u32)(*gInputManager)->padHandler->holdButtons >> args[0]) & 1; + self->condvar = ((u32)gInputManager->padHandler->holdButtons >> args[0]) & 1; } else { - self->condvar = ((*gInputManager)->touchPanelHandler->touchPanelStatus.touch); + self->condvar = (gInputManager->touchPanelHandler->touchPanelStatus.touch); } } @@ -78,14 +78,14 @@ namespace Megamix{ void languageCheck(CTickflow* self, u32 arg0, u32* args) { if (arg0 != 0) return; - CSaveData** gSaveData = (CSaveData**)Region::GlobalSaveDataPointer(); - CFileManager** gFileManager = (CFileManager**)Region::GlobalFileManagerPointer(); - int saveLanguage = (*gSaveData)->fileData[(*gSaveData)->currentFile].locale; + CSaveData* gSaveData = *Region::GlobalSaveDataPointer(); + CFileManager* gFileManager = *Region::GlobalFileManagerPointer(); + int saveLanguage = gSaveData->fileData[gSaveData->currentFile].locale; if(saveLanguage == 1){ self->condvar = 0; } else { wchar_t sublocale[5]; - utf16_to_utf32((u32*)sublocale, (*gFileManager)->sublocale, 4); + utf16_to_utf32((u32*)sublocale, gFileManager->sublocale, 4); sublocale[4] = '\0'; std::wstring localews(sublocale); if(localews.find(L"JP") != (unsigned int)-1){ @@ -116,18 +116,16 @@ namespace Megamix{ // alternatively, load the current slot loaded with the tickflow hook into a global, and use that instead // that way we can avoid the UB on non-gate slots GateGameIndex slot = (*Region::D_0054ef10())->currentGateSlot; - OSD::Notify(Utils::Format("%d", slot), CTRPluginFramework::Color::Red); if ((slot & Difficulty) != Endless || !Region::IsGateGameValidFunc()(slot)) return; CSaveManager* gSaveManager = *Region::SaveManager(); + CSaveData* gSaveData = *Region::GlobalSaveDataPointer(); - u32 oldScore = Region::GetGateScoreFunc()(gSaveManager, slot, -1); - - OSD::Notify(Utils::Format("%x %d %d", gSaveManager, self->condvar, oldScore), CTRPluginFramework::Color::Blue); + u32 oldScore = Region::GetGateScoreFunc()(gSaveData, slot, -1); - if (oldScore < self->condvar) { - Region::SetGateScoreFunc()(gSaveManager, slot, self->condvar, -1); + if (oldScore < self->condvar && self->condvar <= 0xFFFF) { + Region::SetGateScoreFunc()(gSaveData, slot, self->condvar, -1); Region::SaveGameFunc()(gSaveManager); } } diff --git a/src/Megamix/Region.cpp b/src/Megamix/Region.cpp index 08cb581..d9863bd 100644 --- a/src/Megamix/Region.cpp +++ b/src/Megamix/Region.cpp @@ -340,39 +340,39 @@ namespace Region { // Locations of global variables - u32 GlobalSaveDataPointer(){ + Megamix::CSaveData** GlobalSaveDataPointer(){ switch (region) { case US: - return 0x54d350; + return (Megamix::CSaveData**)0x54d350; case EU: case KR: - return 0x54d448; + return (Megamix::CSaveData**)0x54d448; case JP: default: return 0; } } - u32 GlobalInputManagerPointer(){ + Megamix::CInputManager** GlobalInputManagerPointer(){ switch (region) { case US: - return 0x54eed0; + return (Megamix::CInputManager**)0x54eed0; case EU: case KR: - return 0x54efc8; + return (Megamix::CInputManager**)0x54efc8; case JP: default: return 0; } } - u32 GlobalFileManagerPointer(){ + Megamix::CFileManager** GlobalFileManagerPointer(){ switch (region) { case US: - return 0x54eedc; + return (Megamix::CFileManager**)0x54eedc; case EU: case KR: - return 0x54efd4; + return (Megamix::CFileManager**)0x54efd4; case JP: default: return 0; From d0a698f45ce9514a3f97564a3a088a21cf4e14dd Mon Sep 17 00:00:00 2001 From: patataofcourse Date: Fri, 16 Jan 2026 22:53:54 +0100 Subject: [PATCH 4/6] make it actually work --- src/Megamix/Commands.cpp | 2 +- src/Megamix/Region.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Megamix/Commands.cpp b/src/Megamix/Commands.cpp index 12da7cd..83f6d57 100644 --- a/src/Megamix/Commands.cpp +++ b/src/Megamix/Commands.cpp @@ -118,7 +118,7 @@ namespace Megamix { // alternatively, load the current slot loaded with the tickflow hook into a global, and use that instead // that way we can avoid the UB on non-gate slots GateGameIndex slot = Game::D_0054ef10()->currentGateSlot; - if ((slot & Difficulty) != Endless || Game::isGateGameValid(slot)) + if ((slot & Difficulty) != Endless || !Game::isGateGameValid(slot)) return; u32 oldScore = Game::gSaveData()->getGateScore(slot, -1); diff --git a/src/Megamix/Region.cpp b/src/Megamix/Region.cpp index 2aac8f1..4dec596 100644 --- a/src/Megamix/Region.cpp +++ b/src/Megamix/Region.cpp @@ -108,8 +108,8 @@ namespace Megamix { .regionBHookPos= 0x119560, .saveData= (CSaveData**)0x54d350, - .getGateScore = (GameInterface::GetGateScoreSignature)GameInterface::UNIMPLEMENTED, - .setGateScore = (GameInterface::SetGateScoreSignature)GameInterface::UNIMPLEMENTED, + .getGateScore = (GameInterface::GetGateScoreSignature)0x261a6c, + .setGateScore = (GameInterface::SetGateScoreSignature)0x2366c0, .inputManager= (CInputManager**)0x54eed0, .fileManager= (CFileManager**)0x54eedc, From 5ca9903862f072ead35a9df9bf2d61413ed19b4e Mon Sep 17 00:00:00 2001 From: patataofcourse Date: Fri, 23 Jan 2026 19:30:22 +0100 Subject: [PATCH 5/6] endless: support EU --- src/Megamix/Region.cpp | 14 +++++++------- src/main.cpp | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Megamix/Region.cpp b/src/Megamix/Region.cpp index 4dec596..9a66fb8 100644 --- a/src/Megamix/Region.cpp +++ b/src/Megamix/Region.cpp @@ -61,7 +61,7 @@ namespace Megamix { .blackbarLayout= (CBlackBarManager**)0x526404, - .isGateGameValid= (GameInterface::IsGateGameValidSignature)GameInterface::UNIMPLEMENTED, + .isGateGameValid= (GameInterface::IsGateGameValidSignature)0x2569d8, .tickflowCommandsHook= 0x25e054, .tickflowCommandsCmd0= 0x25e338, @@ -162,19 +162,19 @@ namespace Megamix { .regionBHookPos= 0x119560, .saveData= (CSaveData**)0x54d448, - .getGateScore = (GameInterface::GetGateScoreSignature)GameInterface::UNIMPLEMENTED, - .setGateScore = (GameInterface::SetGateScoreSignature)GameInterface::UNIMPLEMENTED, + .getGateScore = (GameInterface::GetGateScoreSignature)0x261a6c, + .setGateScore = (GameInterface::SetGateScoreSignature)0x2366c0, .inputManager= (CInputManager**)0x54efc8, .fileManager= (CFileManager**)0x54efd4, - .unk0054ef10 = (UnkStruct0054ef10**)GameInterface::UNIMPLEMENTED, + .unk0054ef10 = (UnkStruct0054ef10**)0x54f008, - .saveManager = (CSaveManager**)GameInterface::UNIMPLEMENTED, - .saveGame = (GameInterface::SaveDataSignature)GameInterface::UNIMPLEMENTED, + .saveManager = (CSaveManager**)0x54f020, + .saveGame = (GameInterface::SaveDataSignature)0x28bf14, .blackbarLayout= (CBlackBarManager**)0x52f3f8, - .isGateGameValid= (GameInterface::IsGateGameValidSignature)GameInterface::UNIMPLEMENTED, + .isGateGameValid= (GameInterface::IsGateGameValidSignature)0x255550, .tickflowCommandsHook= 0x25c3c0, .tickflowCommandsCmd0= 0x25c6c0, diff --git a/src/main.cpp b/src/main.cpp index 19d6d32..cb8dc3d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -108,7 +108,7 @@ void ctrpf::PatchProcess(ctrpf::FwkSettings&) { if (!Megamix::isJP()) { //TODO: find out how to make the tempo hooks JP-compatible Megamix::Hooks::TempoHooks(); - //TODO: find out how to make the tickflow commands hook JP-compatible + //TODO: find out how to make the tickflow commands hook (and each individual command) JP-compatible Megamix::Hooks::CommandHook(); } From 73f89386670539cf9e20a8aa11fbfd0a63d4bf2a Mon Sep 17 00:00:00 2001 From: patataofcourse Date: Sun, 31 May 2026 13:21:48 +0200 Subject: [PATCH 6/6] endless: support KR --- src/Megamix/Region.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Megamix/Region.cpp b/src/Megamix/Region.cpp index 9a66fb8..5b3401b 100644 --- a/src/Megamix/Region.cpp +++ b/src/Megamix/Region.cpp @@ -221,19 +221,19 @@ namespace Megamix { .regionBHookPos= 0x119560, .saveData= (CSaveData**)0x54d448, - .getGateScore = (GameInterface::GetGateScoreSignature)GameInterface::UNIMPLEMENTED, - .setGateScore = (GameInterface::SetGateScoreSignature)GameInterface::UNIMPLEMENTED, + .getGateScore = (GameInterface::GetGateScoreSignature)0x261a44, + .setGateScore = (GameInterface::SetGateScoreSignature)0x236698, .inputManager= (CInputManager**)0x54efc8, .fileManager= (CFileManager**)0x54efd4, - .unk0054ef10 = (UnkStruct0054ef10**)GameInterface::UNIMPLEMENTED, + .unk0054ef10 = (UnkStruct0054ef10**)0x54f008, - .saveManager = (CSaveManager**)GameInterface::UNIMPLEMENTED, - .saveGame = (GameInterface::SaveDataSignature)GameInterface::UNIMPLEMENTED, + .saveManager = (CSaveManager**)0x54f020, + .saveGame = (GameInterface::SaveDataSignature)0x28beec, .blackbarLayout= (CBlackBarManager**)0x52f3f8, - .isGateGameValid= (GameInterface::IsGateGameValidSignature)GameInterface::UNIMPLEMENTED, + .isGateGameValid= (GameInterface::IsGateGameValidSignature)0x255528, .tickflowCommandsHook= 0x25c398, .tickflowCommandsCmd0= 0x25c698,