better soft reset (#4984)

This commit is contained in:
briaguya 2025-02-01 23:33:04 -08:00 committed by GitHub
parent f4604673e0
commit ac9b8c2e87
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 48 additions and 20 deletions

View File

@ -247,6 +247,7 @@ extern "C"
extern GfxPool gGfxPools[2]; // 0x24820 bytes extern GfxPool gGfxPools[2]; // 0x24820 bytes
extern u8* gAudioHeap; extern u8* gAudioHeap;
extern u8* gSystemHeap; extern u8* gSystemHeap;
extern GameState* gGameState;
#ifdef __cplusplus #ifdef __cplusplus
}; };

View File

@ -0,0 +1,30 @@
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/ShipInit.hpp"
extern "C" {
#include "functions.h"
#include "variables.h"
}
void ResetGameplayFramesOnSoftReset() {
PlayState* play = (PlayState*)gGameState;
if (gGameState->init == TitleSetup_Init) {
play->gameplayFrames = 0;
}
}
void ResetGameplayFramesOnTitleScreenExit() {
PlayState* play = (PlayState*)gGameState;
if (gSaveContext.fileNum == 0xFF) {
play->gameplayFrames = 0;
}
}
void RegisterResetGameplayFrames() {
COND_HOOK(OnPlayDestroy, true, ResetGameplayFramesOnSoftReset);
COND_HOOK(OnPlayDestroy, true, ResetGameplayFramesOnTitleScreenExit);
}
static RegisterShipInitFunc initFunc(RegisterResetGameplayFrames);

View File

@ -204,14 +204,13 @@ static bool SetPosHandler(std::shared_ptr<Ship::Console> Console, const std::vec
} }
static bool ResetHandler(std::shared_ptr<Ship::Console> Console, std::vector<std::string> args, std::string* output) { static bool ResetHandler(std::shared_ptr<Ship::Console> Console, std::vector<std::string> args, std::string* output) {
if (gPlayState == nullptr) { if (gGameState == nullptr) {
ERROR_MESSAGE("PlayState == nullptr"); ERROR_MESSAGE("gGameState == nullptr");
return 1; return 1;
} }
gPlayState->gameplayFrames = 0; SET_NEXT_GAMESTATE(gGameState, TitleSetup_Init, GameState);
SET_NEXT_GAMESTATE(&gPlayState->state, TitleSetup_Init, GameState); gGameState->running = false;
gPlayState->state.running = false;
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnExitGame>(gSaveContext.fileNum); GameInteractor::Instance->ExecuteHooks<GameInteractor::OnExitGame>(gSaveContext.fileNum);
return 0; return 0;
} }

View File

@ -14,6 +14,10 @@ ViMode sViMode;
FaultClient sGameFaultClient; FaultClient sGameFaultClient;
u16 sLastButtonPressed; u16 sLastButtonPressed;
// #region SOH [General] Making gGameState available
GameState* gGameState;
// #endregion
// Forward declared, because this in a C++ header. // Forward declared, because this in a C++ header.
int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height, uint8_t resize); int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height, uint8_t resize);
void gfx_texture_cache_clear(); void gfx_texture_cache_clear();

View File

@ -18,7 +18,6 @@
// SOH [Port] Game State management for our render loop // SOH [Port] Game State management for our render loop
static struct RunFrameContext { static struct RunFrameContext {
GraphicsContext gfxCtx; GraphicsContext gfxCtx;
GameState* gameState;
GameStateOverlay* nextOvl; GameStateOverlay* nextOvl;
GameStateOverlay* ovl; GameStateOverlay* ovl;
int state; int state;
@ -487,28 +486,28 @@ static void RunFrame()
size = runFrameContext.ovl->instanceSize; size = runFrameContext.ovl->instanceSize;
osSyncPrintf("クラスサイズ=%dバイト\n", size); // "Class size = %d bytes" osSyncPrintf("クラスサイズ=%dバイト\n", size); // "Class size = %d bytes"
runFrameContext.gameState = SYSTEM_ARENA_MALLOC_DEBUG(size); gGameState = SYSTEM_ARENA_MALLOC_DEBUG(size);
if (!runFrameContext.gameState) if (!gGameState)
{ {
osSyncPrintf("確保失敗\n"); // "Failure to secure" osSyncPrintf("確保失敗\n"); // "Failure to secure"
snprintf(faultMsg, sizeof(faultMsg), "CLASS SIZE= %d bytes", size); snprintf(faultMsg, sizeof(faultMsg), "CLASS SIZE= %d bytes", size);
Fault_AddHungupAndCrashImpl("GAME CLASS MALLOC FAILED", faultMsg); Fault_AddHungupAndCrashImpl("GAME CLASS MALLOC FAILED", faultMsg);
} }
GameState_Init(runFrameContext.gameState, runFrameContext.ovl->init, &runFrameContext.gfxCtx); GameState_Init(gGameState, runFrameContext.ovl->init, &runFrameContext.gfxCtx);
// Setup the normal skybox once before entering any game states to avoid the 0xabababab crash. // Setup the normal skybox once before entering any game states to avoid the 0xabababab crash.
// The crash is due to certain skyboxes not loading all the data they need from Skybox_Setup. // The crash is due to certain skyboxes not loading all the data they need from Skybox_Setup.
if (!hasSetupSkybox) { if (!hasSetupSkybox) {
PlayState* play = (PlayState*)runFrameContext.gameState; PlayState* play = (PlayState*)gGameState;
Skybox_Setup(play, &play->skyboxCtx, SKYBOX_NORMAL_SKY); Skybox_Setup(play, &play->skyboxCtx, SKYBOX_NORMAL_SKY);
hasSetupSkybox = true; hasSetupSkybox = true;
} }
uint64_t freq = GetFrequency(); uint64_t freq = GetFrequency();
while (GameState_IsRunning(runFrameContext.gameState)) while (GameState_IsRunning(gGameState))
{ {
//uint64_t ticksA, ticksB; //uint64_t ticksA, ticksB;
//ticksA = GetPerfCounter(); //ticksA = GetPerfCounter();
@ -517,7 +516,7 @@ static void RunFrame()
PadMgr_ThreadEntry(&gPadMgr); PadMgr_ThreadEntry(&gPadMgr);
Graph_Update(&runFrameContext.gfxCtx, runFrameContext.gameState); Graph_Update(&runFrameContext.gfxCtx, gGameState);
//ticksB = GetPerfCounter(); //ticksB = GetPerfCounter();
if (GfxDebuggerIsDebuggingRequested()) { if (GfxDebuggerIsDebuggingRequested()) {
@ -535,9 +534,9 @@ static void RunFrame()
nextFrame:; nextFrame:;
} }
runFrameContext.nextOvl = Graph_GetNextGameState(runFrameContext.gameState); runFrameContext.nextOvl = Graph_GetNextGameState(gGameState);
GameState_Destroy(runFrameContext.gameState); GameState_Destroy(gGameState);
SYSTEM_ARENA_FREE_DEBUG(runFrameContext.gameState); SYSTEM_ARENA_FREE_DEBUG(gGameState);
Overlay_FreeGameState(runFrameContext.ovl); Overlay_FreeGameState(runFrameContext.ovl);
} }
Graph_Destroy(&runFrameContext.gfxCtx); Graph_Destroy(&runFrameContext.gfxCtx);

View File

@ -205,11 +205,6 @@ void Play_Destroy(GameState* thisx) {
GameInteractor_ExecuteOnPlayDestroy(); GameInteractor_ExecuteOnPlayDestroy();
// Only initialize the frame counter when exiting the title screen
if (gSaveContext.fileNum == 0xFF) {
play->gameplayFrames = 0;
}
play->state.gfxCtx->callback = NULL; play->state.gfxCtx->callback = NULL;
play->state.gfxCtx->callbackParam = 0; play->state.gfxCtx->callbackParam = 0;