From f8e2f8648b3d70063d57213f40f28d4e3d0428c8 Mon Sep 17 00:00:00 2001 From: Louis Stockdale-Lees Date: Thu, 21 May 2026 22:44:23 +0100 Subject: [PATCH 1/5] Start on zGameLoop --- src/SB/Game/zGame.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/SB/Game/zGame.cpp b/src/SB/Game/zGame.cpp index ba31265e4..249676d44 100644 --- a/src/SB/Game/zGame.cpp +++ b/src/SB/Game/zGame.cpp @@ -437,6 +437,30 @@ void zGameSetup() gGameWhereAmI = eGameWhere_SetupEnd; } +void zGameLoop() +{ + gGameWhereAmI = eGameWhere_LoopStart; + zGameStateSwitch(eGameState_Play); + sTimeLast = iTimeGet(); + + if (globals.cmgr) + { + zCutsceneMgrFinishLoad(globals.cmgr); + } + + gGameWhereAmI = eGameWhere_LoopCalcTime; + sTimeCurrent = iTimeGet(); + sTimeElapsed = iTimeDiffSec(sTimeLast, sTimeCurrent); + + if (sHackSmoothedUpdate = 0) + { + if (sTimeElapsed <= 0.1) + { + sTimeElapsed = 0.016666668f; + } + } +} + S32 zGameIsPaused() { if (gGameMode == 8) From 7dcf14261d7ade3ffccd75491ccc46eccf070ef6 Mon Sep 17 00:00:00 2001 From: Louis Stockdale-Lees Date: Wed, 10 Jun 2026 15:07:59 +0100 Subject: [PATCH 2/5] zGameLoop 25% --- src/SB/Core/x/xCamera.h | 3 + src/SB/Game/zGame.cpp | 119 +++++++++++++++++++++++++++++++++--- src/SB/Game/zGameExtras.cpp | 2 +- src/SB/Game/zGameExtras.h | 1 + 4 files changed, 117 insertions(+), 8 deletions(-) diff --git a/src/SB/Core/x/xCamera.h b/src/SB/Core/x/xCamera.h index a1e72caf3..590f1bb5e 100644 --- a/src/SB/Core/x/xCamera.h +++ b/src/SB/Core/x/xCamera.h @@ -277,6 +277,9 @@ void xCameraReset(xCamera* cam, F32 d, F32 h, F32 pitch); void xCameraExit(xCamera* cam); void xCameraUpdate(xCamera* cam, F32 dt); void xCameraBegin(xCamera* cam, S32); +void xCameraFXBegin(xCamera* cam); +void xCameraFXUpdate(xCamera* cam, F32 dt); +void xCameraFXEnd(xCamera* cam); void xCameraEnd(xCamera* cam, F32 seconds, S32 update_scrn_fx); void xCameraShowRaster(xCamera* cam); F32 xCameraGetFOV(const xCamera* cam); diff --git a/src/SB/Game/zGame.cpp b/src/SB/Game/zGame.cpp index 249676d44..9b9d7edfc 100644 --- a/src/SB/Game/zGame.cpp +++ b/src/SB/Game/zGame.cpp @@ -13,11 +13,13 @@ #include "zMusic.h" #include "zParPTank.h" #include "zSaveLoad.h" +#include "zVolume.h" #include "iDraw.h" #include "iSystem.h" #include "iTRC.h" +#include "xCamera.h" #include "xDebug.h" #include "xFont.h" #include "xMarkerAsset.h" @@ -448,17 +450,120 @@ void zGameLoop() zCutsceneMgrFinishLoad(globals.cmgr); } - gGameWhereAmI = eGameWhere_LoopCalcTime; - sTimeCurrent = iTimeGet(); - sTimeElapsed = iTimeDiffSec(sTimeLast, sTimeCurrent); + do { + gGameWhereAmI = eGameWhere_LoopCalcTime; + sTimeCurrent = iTimeGet(); + sTimeElapsed = iTimeDiffSec(sTimeLast, sTimeCurrent); - if (sHackSmoothedUpdate = 0) - { - if (sTimeElapsed <= 0.1) + if (sHackSmoothedUpdate = 0) + { + if (sTimeElapsed <= 0.1) + { + sTimeElapsed = 0.016666668f; + } + } + else + { + sTimeElapsed = 0; + } + + sTimeLast = sTimeCurrent; + iTimeGet(); + //gloop_time += 1; + //gloop_ct += 1; + iTimeDiffSec(0); + //gloop_net_time = 0; + iTimeDiffSec(0); + //gloop_net_time_secs = 0; + gGameWhereAmI = eGameWhere_LoopPadUpdate; + xPadUpdate(0, sTimeElapsed); + + if ((zGameExtras_CheatFlags() & 0x1000) != 0) + { + + } + + //xPadNormalizeAnalog(0, 0, 0); + gGameWhereAmI = eGameWhere_LoopTRCCheck; + iTRCDisk::CheckDVDAndResetState(); + + if (1) + { + zMusicNotify(0x7); + } + + gGameWhereAmI = eGameWhere_LoopCheats; + zGameCheats(sTimeElapsed); + zGameExtras_SceneUpdate(sTimeElapsed); + iFileAsyncService(); + gGameWhereAmI = eGameWhere_LoopSceneUpdate; + zSceneUpdate(sTimeElapsed); + gGameWhereAmI = eGameWhere_LoopPlayerUpdate; + + if (zGameIsPaused()) { - sTimeElapsed = 0.016666668f; + } + + gGameWhereAmI = eGameWhere_LoopSoundUpdate; + xSndSetListenerData(SND_LISTENER_CAMERA, 0); + xSndSetListenerData(SND_LISTENER_PLAYER, 0); + xSndUpdate(); + gGameWhereAmI = eGameWhere_LoopSFXWidgets; + zSceneUpdateSFXWidgets(); + gGameWhereAmI = eGameWhere_LoopHUDUpdate; + zhud::update(sTimeElapsed); + gGameWhereAmI = eGameWhere_LoopCameraUpdate; + + if (1) + { + zCameraUpdate(&globals.camera, sTimeElapsed); + } + + gGameWhereAmI = eGameWhere_LoopCameraFXUpdate; + xCameraFXBegin(&globals.camera); + xCameraFXUpdate(&globals.camera, sTimeElapsed); + gGameWhereAmI = eGameWhere_LoopFlyToInterface; + zScene_UpdateFlyToInterface(sTimeElapsed); + gGameWhereAmI = eGameWhere_LoopCameraBegin; + iTimeGet(); + xCameraBegin(&globals.camera, 0x1); + iTimeGet(); + //gwait_time += 1; + iTimeDiffSec(/*gwait_time, */0); + //gwait_time_secs = 0; + zVolume_OccludePrecalc(0/*&globals.player*/); + gGameWhereAmI = eGameWhere_LoopSceneRender; + zSceneRender(); + xDebugUpdate(); + gGameWhereAmI = eGameWhere_LoopCameraEnd; + xCameraEnd(&globals.camera, sTimeElapsed, 0x1); + iEnvEndRenderFX(0); + //RwGameCubeSetMinRetraceCount(); + gGameWhereAmI = eGameWhere_LoopCameraShowRaster; + xCameraShowRaster(&globals.camera); + gGameWhereAmI = eGameWhere_LoopCameraFXEnd; + xCameraFXEnd(&globals.camera); + gGameWhereAmI = eGameWhere_LoopMusicUpdate; + zMusicUpdate(sTimeElapsed); + gGameWhereAmI = eGameWhere_LoopUpdateMode; + //zGameUpdateMode(); + gFrameCount += 1; + + if (0) + { + + } + else + { + + } + + gGameWhereAmI = eGameWhere_LoopContinue; } + while (0/*zGameLoopContinue()*/); + + gGameWhereAmI = eGameWhere_LoopEndGameLoop; } S32 zGameIsPaused() diff --git a/src/SB/Game/zGameExtras.cpp b/src/SB/Game/zGameExtras.cpp index 0a17e5a77..3be2c1b1d 100644 --- a/src/SB/Game/zGameExtras.cpp +++ b/src/SB/Game/zGameExtras.cpp @@ -360,7 +360,7 @@ void AddToCheatPressed(U32 button) sCheatPressed[15] = button; } -void zGameCheats(float dt) +void zGameCheats(F32 dt) { if (zGameModeGet() != eGameMode_Pause) { diff --git a/src/SB/Game/zGameExtras.h b/src/SB/Game/zGameExtras.h index 74a060ec9..210094994 100644 --- a/src/SB/Game/zGameExtras.h +++ b/src/SB/Game/zGameExtras.h @@ -56,6 +56,7 @@ void zGameExtras_Load(xSerial* xser); S32 TestCheat(U32* cheat); S32 EGG_check_ExtrasFlags(EGGItem* egg); void AddToCheatPressed(U32 param_1); +void zGameCheats(F32 dt); void GEC_CheatFlagAdd(S32 bit); void GEC_CheatFlagToggle(S32 bit); void GEC_dfltSound(); From b6fa6b1d988918e4badfbe0fb963d6e613075c3a Mon Sep 17 00:00:00 2001 From: Louis Stockdale-Lees Date: Wed, 12 Aug 2026 18:51:06 +0100 Subject: [PATCH 3/5] Update zGame.cpp --- src/SB/Game/zGame.cpp | 57 +++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/src/SB/Game/zGame.cpp b/src/SB/Game/zGame.cpp index 9b9d7edfc..5b38e6873 100644 --- a/src/SB/Game/zGame.cpp +++ b/src/SB/Game/zGame.cpp @@ -11,6 +11,7 @@ #include "zLOD.h" #include "zMenu.h" #include "zMusic.h" +#include "zEntPlayerOOBState.h" #include "zParPTank.h" #include "zSaveLoad.h" #include "zVolume.h" @@ -59,9 +60,17 @@ xPortalAsset dummyPortalAsset; _zPortal dummyPortal; U32 gSoak; static U32 loadMeter; +static F32 gwait_time_secs; +static S64 gwait_time; +static S64 w0; +static S64 w1; void xMemDebug_SoakLog(const char*); void zCutsceneMgrFinishExit(xBase* to); +static S32 zGameLoopContinue(); +static void zGameUpdateMode(); +void RwGameCubeSetMinRetraceCount(RwChar); +void __cvt_dbl_usll(); char* soaklevels_gameorder[] = { @@ -441,9 +450,15 @@ void zGameSetup() void zGameLoop() { + S32 ostrich_delay; // r19 + S32 cheats; // r2 + class xMat4x3 playerMat; // r29+0x50 + gGameWhereAmI = eGameWhere_LoopStart; zGameStateSwitch(eGameState_Play); + __cvt_dbl_usll(); sTimeLast = iTimeGet(); + gGameWhereAmI = eGameWhere_CutsceneFinish; if (globals.cmgr) { @@ -480,14 +495,13 @@ void zGameLoop() if ((zGameExtras_CheatFlags() & 0x1000) != 0) { - + globals.pad0->analog2.x = globals.player.g.AnalogMin; } - //xPadNormalizeAnalog(0, 0, 0); + xPadNormalizeAnalog(*globals.pad0, globals.player.g.AnalogMin, globals.player.g.AnalogMax); gGameWhereAmI = eGameWhere_LoopTRCCheck; - iTRCDisk::CheckDVDAndResetState(); - if (1) + if (iTRCDisk::CheckDVDAndResetState() != '\0') { zMusicNotify(0x7); } @@ -496,16 +510,12 @@ void zGameLoop() zGameCheats(sTimeElapsed); zGameExtras_SceneUpdate(sTimeElapsed); iFileAsyncService(); + zGameIsPaused(); gGameWhereAmI = eGameWhere_LoopSceneUpdate; zSceneUpdate(sTimeElapsed); gGameWhereAmI = eGameWhere_LoopPlayerUpdate; - - if (zGameIsPaused()) - { - - } - - gGameWhereAmI = eGameWhere_LoopSoundUpdate; + xEntGetFrame(&globals.player.ent); + //gGameWhereAmI = eGameWhere_LoopSoundUpdate; xSndSetListenerData(SND_LISTENER_CAMERA, 0); xSndSetListenerData(SND_LISTENER_PLAYER, 0); xSndUpdate(); @@ -529,17 +539,20 @@ void zGameLoop() iTimeGet(); xCameraBegin(&globals.camera, 0x1); iTimeGet(); + + w1 = 0x1; //gwait_time += 1; - iTimeDiffSec(/*gwait_time, */0); - //gwait_time_secs = 0; - zVolume_OccludePrecalc(0/*&globals.player*/); + gwait_time_secs = iTimeDiffSec(gwait_time) / 4503601774854144.0; + zVolume_OccludePrecalc(&globals.camera.mat.pos); gGameWhereAmI = eGameWhere_LoopSceneRender; zSceneRender(); xDebugUpdate(); gGameWhereAmI = eGameWhere_LoopCameraEnd; xCameraEnd(&globals.camera, sTimeElapsed, 0x1); iEnvEndRenderFX(0); - //RwGameCubeSetMinRetraceCount(); + + RwGameCubeSetMinRetraceCount(0); + gGameWhereAmI = eGameWhere_LoopCameraShowRaster; xCameraShowRaster(&globals.camera); gGameWhereAmI = eGameWhere_LoopCameraFXEnd; @@ -547,12 +560,20 @@ void zGameLoop() gGameWhereAmI = eGameWhere_LoopMusicUpdate; zMusicUpdate(sTimeElapsed); gGameWhereAmI = eGameWhere_LoopUpdateMode; - //zGameUpdateMode(); + zGameUpdateMode(); gFrameCount += 1; - if (0) + if (gTrcPad[0].state) { + zGameSetOstrich(eGameOstrich_PlayingMovie); + if (gBusStopIsRunning && oob_state::IsPlayerInControl()) + { + xTRCPad(gTrcPad[0].state, TRC_PadMissing); + } + + globals.dontShowPadMessageDuringLoadingOrCutScene = 0x1; + zSaveLoadAutoSaveUpdate(); } else { @@ -561,7 +582,7 @@ void zGameLoop() gGameWhereAmI = eGameWhere_LoopContinue; } - while (0/*zGameLoopContinue()*/); + while (zGameLoopContinue()); gGameWhereAmI = eGameWhere_LoopEndGameLoop; } From f3a49dcbdd4e240ce352a5da4a1e2da90e3d6a79 Mon Sep 17 00:00:00 2001 From: Louis Stockdale-Lees Date: Mon, 24 Aug 2026 16:01:26 +0100 Subject: [PATCH 4/5] HackDrawCard / Cleanup --- src/SB/Game/zGame.cpp | 72 +++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/src/SB/Game/zGame.cpp b/src/SB/Game/zGame.cpp index 5b38e6873..a3a30a8e3 100644 --- a/src/SB/Game/zGame.cpp +++ b/src/SB/Game/zGame.cpp @@ -450,9 +450,9 @@ void zGameSetup() void zGameLoop() { - S32 ostrich_delay; // r19 - S32 cheats; // r2 - class xMat4x3 playerMat; // r29+0x50 + S32 ostrich_delay; + S32 cheats; + xMat4x3 playerMat; gGameWhereAmI = eGameWhere_LoopStart; zGameStateSwitch(eGameState_Play); @@ -484,12 +484,8 @@ void zGameLoop() sTimeLast = sTimeCurrent; iTimeGet(); - //gloop_time += 1; - //gloop_ct += 1; iTimeDiffSec(0); - //gloop_net_time = 0; iTimeDiffSec(0); - //gloop_net_time_secs = 0; gGameWhereAmI = eGameWhere_LoopPadUpdate; xPadUpdate(0, sTimeElapsed); @@ -515,7 +511,6 @@ void zGameLoop() zSceneUpdate(sTimeElapsed); gGameWhereAmI = eGameWhere_LoopPlayerUpdate; xEntGetFrame(&globals.player.ent); - //gGameWhereAmI = eGameWhere_LoopSoundUpdate; xSndSetListenerData(SND_LISTENER_CAMERA, 0); xSndSetListenerData(SND_LISTENER_PLAYER, 0); xSndUpdate(); @@ -524,12 +519,7 @@ void zGameLoop() gGameWhereAmI = eGameWhere_LoopHUDUpdate; zhud::update(sTimeElapsed); gGameWhereAmI = eGameWhere_LoopCameraUpdate; - - if (1) - { - zCameraUpdate(&globals.camera, sTimeElapsed); - } - + zCameraUpdate(&globals.camera, sTimeElapsed); gGameWhereAmI = eGameWhere_LoopCameraFXUpdate; xCameraFXBegin(&globals.camera); xCameraFXUpdate(&globals.camera, sTimeElapsed); @@ -539,9 +529,7 @@ void zGameLoop() iTimeGet(); xCameraBegin(&globals.camera, 0x1); iTimeGet(); - w1 = 0x1; - //gwait_time += 1; gwait_time_secs = iTimeDiffSec(gwait_time) / 4503601774854144.0; zVolume_OccludePrecalc(&globals.camera.mat.pos); gGameWhereAmI = eGameWhere_LoopSceneRender; @@ -550,9 +538,7 @@ void zGameLoop() gGameWhereAmI = eGameWhere_LoopCameraEnd; xCameraEnd(&globals.camera, sTimeElapsed, 0x1); iEnvEndRenderFX(0); - RwGameCubeSetMinRetraceCount(0); - gGameWhereAmI = eGameWhere_LoopCameraShowRaster; xCameraShowRaster(&globals.camera); gGameWhereAmI = eGameWhere_LoopCameraFXEnd; @@ -688,7 +674,55 @@ void zGameStall() } } -static void zGame_HackDrawCard(F32 x, F32 y, F32 w, F32 h, RwRaster* rast); +static void zGame_HackDrawCard(F32 x, F32 y, F32 w, F32 h, RwRaster* rast) +{ + RwIm2DVertex quad[4]; + F32 screenZ = RwIm2DGetNearScreenZ(); + + quad[0].x = x; + quad[0].y = y; + quad[0].z = screenZ; + quad[0].emissiveColor.red = 0xff; + quad[0].emissiveColor.green = 0xff; + quad[0].emissiveColor.blue = 0xff; + quad[0].emissiveColor.alpha = 0xff; + quad[0].u = 0.0f; + quad[0].v = 0.0f; + quad[1].x = x; + quad[1].y = y + h; + quad[1].z = screenZ; + quad[1].emissiveColor.red = 0xff; + quad[1].emissiveColor.green = 0xff; + quad[1].emissiveColor.blue = 0xff; + quad[1].emissiveColor.alpha = 0xff; + quad[1].u = 0.0f; + quad[1].v = 1.0f; + quad[2].x = x + w; + quad[2].y = y; + quad[2].z = screenZ; + quad[2].emissiveColor.red = 0xff; + quad[2].emissiveColor.green = 0xff; + quad[2].emissiveColor.blue = 0xff; + quad[2].emissiveColor.alpha = 0xff; + quad[2].u = 1.0f; + quad[2].v = 0.0f; + quad[3].x = x + w; + quad[3].y = y + h; + quad[3].z = screenZ; + quad[3].emissiveColor.red = 0xff; + quad[3].emissiveColor.green = 0xff; + quad[3].emissiveColor.blue = 0xff; + quad[3].emissiveColor.alpha = 0xff; + quad[3].u = 1.0f; + quad[3].v = 1.0f; + + RwRenderStateSet(rwRENDERSTATESHADEMODE, (void*)0x1); + RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA); + RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); + RwRenderStateSet(rwRENDERSTATETEXTURERASTER, rast); + RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)0); + RwIm2DRenderPrimitive(rwPRIMTYPETRISTRIP, &quad[0], 4); +} // Equivalent; scheduling. static void zGame_HackPostPortalAutoSaveDraw() From 8c044d1a82bc687fe9f6f4c77e2934e091c8b921 Mon Sep 17 00:00:00 2001 From: Louis Stockdale-Lees Date: Tue, 25 Aug 2026 23:07:43 +0100 Subject: [PATCH 5/5] Remove __cvt_dbl_usll() --- src/SB/Game/zGame.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/SB/Game/zGame.cpp b/src/SB/Game/zGame.cpp index a3a30a8e3..a52b998dd 100644 --- a/src/SB/Game/zGame.cpp +++ b/src/SB/Game/zGame.cpp @@ -70,7 +70,6 @@ void zCutsceneMgrFinishExit(xBase* to); static S32 zGameLoopContinue(); static void zGameUpdateMode(); void RwGameCubeSetMinRetraceCount(RwChar); -void __cvt_dbl_usll(); char* soaklevels_gameorder[] = { @@ -456,7 +455,6 @@ void zGameLoop() gGameWhereAmI = eGameWhere_LoopStart; zGameStateSwitch(eGameState_Play); - __cvt_dbl_usll(); sTimeLast = iTimeGet(); gGameWhereAmI = eGameWhere_CutsceneFinish;