diff --git a/source-code/source/plugins/TLAC/Components/Pause.cpp b/source-code/source/plugins/TLAC/Components/Pause.cpp index 980bd1e..39b64e4 100644 --- a/source-code/source/plugins/TLAC/Components/Pause.cpp +++ b/source-code/source/plugins/TLAC/Components/Pause.cpp @@ -17,6 +17,7 @@ namespace TLAC::Components bool Pause::pause = false; bool Pause::isPaused = false; bool Pause::giveUp = false; + bool Pause::autoPause = false; bool Pause::showUI = true; int Pause::selResultAet1 = 0; int Pause::selResultAet2 = 0; @@ -181,6 +182,17 @@ namespace TLAC::Components } } + /* for testing `-ss` stuff + if (inputState->Tapped.Buttons & JVS_TRIANGLE) + { + void** ScreenShotImplAddr = (void**)0x1412016d0; + Drawing::MsString path; // just a small struct from TLAC::Utilities::Drawing::MsString + path.SetCharBuf("blahblahblah"); + + ((void(*)(void* impl, Drawing::MsString* path, int width, int height))0x140557210)(*ScreenShotImplAddr, &path, 1280, 720); + } + */ + // only process menu events when UI is visible if (showUI) { @@ -293,6 +305,11 @@ namespace TLAC::Components pause = true; } } + else + { + // ensure giveUp isn't retained after already quitting + giveUp = false; + } } // swallow filtered button inputs @@ -550,7 +567,7 @@ namespace TLAC::Components void Pause::OnFocusLost() { - if (isInGame() && autoPause) + if (autoPause && isInGame()) pause = true; } @@ -561,7 +578,7 @@ namespace TLAC::Components bool Pause::isInGame() { - return *(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN; + return *(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN && *(uint8_t*)PV_STATE_ADDRESS == 1; } bool Pause::hookedGiveUpFunc(void* cls) diff --git a/source-code/source/plugins/TLAC/Components/Pause.h b/source-code/source/plugins/TLAC/Components/Pause.h index 42c15d6..15a7018 100644 --- a/source-code/source/plugins/TLAC/Components/Pause.h +++ b/source-code/source/plugins/TLAC/Components/Pause.h @@ -29,6 +29,8 @@ namespace TLAC::Components static bool pause; // set pause to change pause state static bool giveUp; // set give up to end current song + + static bool autoPause; // pause when window loses focus private: // this is a mess of static so that menuItems can work static bool isPauseKeyTapped(); @@ -37,7 +39,7 @@ namespace TLAC::Components static void InjectCode(void* address, const std::vector data); static bool isPaused; // tracks internal state - + static void saveOldPatchOps(); static std::vector origAetMovOp; @@ -119,7 +121,51 @@ namespace TLAC::Components static void mainmenu() { setMenuPos(MENUSET_MAIN, mainMenuPos); }; static void unpause() { pause = false; }; - //static void restart() { *(uint8_t*)0x140d0b512 = 2; ((void(*)(uint64_t))0x140127a30)(0x140d0b510); ((void(*)(uint64_t))0x140674e20)(PV_GAME_BASE_ADDRESS); /* *(uint8_t*)0x140d0b512 = 1; *(uint8_t*)0x140d0b513 = 1; *(int32_t*)0x140d0b534 = 0; ((void(*)(uint64_t))0x140127a30)(0x140d0b510); */ unpause(); } + static void restart() { + /* + 140d0b510+2 = 0, 140d0b510+14 = 8 for restart + + also 140cdd8d0+8 (something less than 0x1a but idk what) -- controls a switch statement in FUN_1400fddc0 + + 0x18: PV seems good, audio good, chart and score broken? -- timing resets, notes don't + 0x14: PVs a little bugged (not major), chart and scoring fine, life still doesn't reset + 0x10: life resets now, but old graphics don't clear + + 0x15: same as 0x14 + 0x16: doesn't actually reset???? + 0x17: crash + 0x12: like 0x10 but life isn't cleared + + case 0x11 seems to clear life + case 0x15 seems to clear score (maybe note data) + case 0x18 seems to fix timing + + patch 0x15 at 1401038cd (was 0x12), 0x18 at 140103b94 (was 0x16) + then call with 0x11 + hopefully it'll work + + percentage doesn't fully reset by the looks of it???? + rip + */ + + // inject flow overrides to switch cases in FUN_1400fddc0 + InjectCode((void*)0x1401038cd, { 0x15 }); InjectCode((void*)0x140103b94, { 0x18 }); + + // set parameters + *(uint8_t*)PV_STATE_ADDRESS = 0; *(uint8_t*)PV_LOADING_STATE_ADDRESS = 8; *(int*)PV_INNER_LOADING_STATE_ADDRESS = 0x11; + + void(*doLoading)(uint64_t) = (void(*)(uint64_t))0x1400fddc0; + + // do loading until definitely done + while (*(int*)PV_INNER_LOADING_STATE_ADDRESS < 0x18) + { + doLoading(0x140cdd8d0); + } + + // revert patches and unpause + InjectCode((void*)0x1401038cd, { 0x12 }); InjectCode((void*)0x140103b94, { 0x16 }); + unpause(); + } static void giveup() { giveUp = true; }; static void sevolmenu() { setMenuPos(MENUSET_SEVOL, 1); }; @@ -134,7 +180,5 @@ namespace TLAC::Components static float getMenuAnimPos(); static TLAC::Utilities::Drawing::Point getMenuItemCoords(menusets set, int pos); - - bool autoPause; }; }