From cefbf61cf6b2072089b8884619b64f87ea2bbd65 Mon Sep 17 00:00:00 2001 From: energydrink02 <136357605+energydrink02@users.noreply.github.com> Date: Thu, 15 May 2025 19:20:19 +0200 Subject: [PATCH 1/4] zCutsceneMgr: update cutsceneHackTable --- src/SB/Core/x/xFX.h | 1 + src/SB/Game/zCutsceneMgr.cpp | 87 ++++++++++++++++++++++++------------ 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/src/SB/Core/x/xFX.h b/src/SB/Core/x/xFX.h index 4f85a47e0..9a0397239 100644 --- a/src/SB/Core/x/xFX.h +++ b/src/SB/Core/x/xFX.h @@ -93,6 +93,7 @@ RpAtomic* AtomicDisableMatFX(RpAtomic* atomic); void xFXPreAllocMatFX(RpClump* clump); RpAtomic* xFXBubbleRender(RpAtomic* atomic); +RpAtomic* xFXShinyRender(RpAtomic* atomic); void xFXanimUV2PSetTexture(RwTexture* texture); void xFXanimUVSetTranslation(const xVec3* trans); diff --git a/src/SB/Game/zCutsceneMgr.cpp b/src/SB/Game/zCutsceneMgr.cpp index 5244557d5..b9252bb43 100644 --- a/src/SB/Game/zCutsceneMgr.cpp +++ b/src/SB/Game/zCutsceneMgr.cpp @@ -19,35 +19,64 @@ #include "iSystem.h" static zCutsceneHack cutsceneHackTable[58] = { - { NULL, NULL, 0, 1, 0, 0, NULL }, { NULL, NULL, 0, 1, 0, 0, NULL }, - { NULL, NULL, 0, 1, 0, 0, NULL }, { NULL, NULL, 0, 1, 0, 0, NULL }, - { NULL, NULL, 0, 0, 0, 1, NULL }, { NULL, NULL, 0, 0, 0, 1, NULL }, - { NULL, NULL, 0, 0, 0, 1, NULL }, { NULL, NULL, 0, 0, 0, 1, NULL }, - { NULL, NULL, 0, 0, 0, 1, NULL }, { NULL, NULL, 0, 0, 0, 1, NULL }, - { NULL, NULL, 0, 0, 0, 1, NULL }, { NULL, NULL, 0, 0, 0, 1, NULL }, - { NULL, NULL, 0, 0, 0, 1, NULL }, { NULL, NULL, 0, 0, 0, 1, NULL }, - { NULL, NULL, 0, 0, 0, 1, NULL }, { NULL, NULL, 0, 0, 0, 1, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 400.0f, 0, 1, 0, NULL }, - { NULL, NULL, 400.0f, 0, 1, 0, NULL }, { NULL, NULL, 400.0f, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 50.0f, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 100.0f, 0, 1, 0, NULL }, - { NULL, NULL, 100.0f, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, - { NULL, NULL, 0, 0, 1, 0, NULL }, { NULL, NULL, 0, 0, 1, 0, NULL }, + {"cin_hammer", "spongebob.dff", 0.0f, 1, 0, 0, NULL}, + {"cin_hammer", "fish_j_skel.dff", 0.0f, 1, 0, 0, NULL}, + {"cin_hammer", "ham_bind07_ham_bind1.dff", 0.0f, 1, 0, 0, NULL}, + {"cin_tartar", "robot_tar_skel.dff", 0.0f, 1, 0, 0, NULL}, + {"GY_dutchman_open", "spatula_golden_spatula.dff", 0.0f, 0, 0, 1, xFXShinyRender}, + {"GY_dutchman_end", "group12_golden_spatula.dff", 0.0f, 0, 0, 1, xFXShinyRender}, + {"GY_dutchman_end", "group12_bubble_pirate_ship.dff", 0.0f, 0, 0, 1, xFXBubbleRender}, + {"GY_dutchman_end", "group12_bubble1.dff", 0.0f, 0, 0, 1, xFXBubbleRender}, + {"GY_dutchman_end", "group12_bubble2.dff", 0.0f, 0, 0, 1, xFXBubbleRender}, + {"GY_dutchman_end", "group12_bubble3.dff", 0.0f, 0, 0, 1, xFXBubbleRender}, + {"GY_dutchman_end", "group12_bubble4.dff", 0.0f, 0, 0, 1, xFXBubbleRender}, + {"GY_dutchman_end", "group12_bubble5.dff", 0.0f, 0, 0, 1, xFXBubbleRender}, + {"B1_ending", "golden_spatula_golden_spatula.dff", 0.0f, 0, 0, 1, xFXShinyRender}, + {"B2_open", "icecube.dff", 0.0f, 0, 0, 1, NULL}, + {"B2_round2", "group4_SB_frozen1.dff", 0.0f, 0, 0, 1, NULL}, + {"B2_round3", "group6_bubble_bowlingball1.dff", 0.0f, 0, 0, 1, xFXBubbleRender}, + {"B3_open", "dupe_duplicatotron3001_skel2.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_open", "sb_karate_skel.dff", 400.0f, 0, 1, 0, NULL}, + {"B3_transition", "sb_big_skel.dff", 400.0f, 0, 1, 0, NULL}, + {"B3_transition", "sb_karate_skel.dff", 400.0f, 0, 1, 0, NULL}, + {"B3_transition", "plankton_boss_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss19.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss18.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss16.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss15.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss24.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss14.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss23.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss13.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss22.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss12.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "duplicatotron3001_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss21.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss11.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform02_platform_b301_boss20.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_transition", "platform01_platform_b301_boss10.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "sb_big_skel.dff", 50.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "plankton_boss_skel_02.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "plankton_boss_skel_03.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "plankton_boss_skel_04.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "plankton_boss_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "plankton_boss_skel_05.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "duplicatotron3000_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "plankton_boss_skel_06.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "plankton_boss_skel_07.dff", 0.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "sb_big_armr_skel.dff", 100.0f, 0, 1, 0, NULL}, + {"B3_end_game_win", "sb_big_arml_skel.dff", 100.0f, 0, 1, 0, NULL}, + {"game_win", "larry_lobster_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "squidward_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "mr_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "mspuffs_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "mermaid_man_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "King_neptune_bind_gecklund_group1.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "plankton_skel.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "bubblebuddy.dff", 0.0f, 0, 1, 0, NULL}, + {"game_win", "gary_skel.dff", 0.0f, 0, 1, 0, NULL}, }; static zCutSceneNames zCutSceneNamesTable[14] = { From 7e56f07978b1e527dcc56a325b849ec2b4014134 Mon Sep 17 00:00:00 2001 From: energydrink02 <136357605+energydrink02@users.noreply.github.com> Date: Thu, 15 May 2025 19:21:19 +0200 Subject: [PATCH 2/4] xCutscene: Implement xCutscene_Update, CutsceneShadowRender and xCutscene_SetSpeed --- src/SB/Core/x/xCutscene.cpp | 115 ++++++++++++++++++++++++++++++++++++ src/SB/Core/x/xCutscene.h | 10 ++++ 2 files changed, 125 insertions(+) diff --git a/src/SB/Core/x/xCutscene.cpp b/src/SB/Core/x/xCutscene.cpp index 02bd422dd..db0c68cb6 100644 --- a/src/SB/Core/x/xCutscene.cpp +++ b/src/SB/Core/x/xCutscene.cpp @@ -148,6 +148,105 @@ S32 xCutscene_LoadStart(xCutscene* csn) return 1; } +S32 xCutscene_Update(xCutscene *csn, F32 dt) +{ + if ((csn->SndStarted == 0) && (csn->SndNumChannel != 0)) + { + if (csn->SndNumChannel == 1) + { + xSndSetPitch(csn->SndHandle[0], 0.0f); + } + else if (csn->SndNumChannel == 2) + { + xSndStartStereo(csn->SndHandle[0], csn->SndHandle[1], 0.0f); + } + csn->SndStarted = 1; + } + + csn->Time = csn->PlaybackSpeed * dt + csn->Time; + csn->CamTime = xCutsceneConvertBreak(csn->Time, csn->BreakList, csn->Info->BreakCount, -1); + + if ((csn->Time > csn->Play->EndTime) || (csn->BadReadPause != 0)) + { + if (csn->PlayIndex == csn->Info->NumTime - 1) + { + csn->Time = csn->Play->EndTime; + return 0; + } + + if ((csn->BadReadPause != 0) && (csn->Waiting == 0)) + { + csn->BadReadPause = 0; + xCutscene_SetSpeed(csn, csn->BadReadSpeed); + } + + if (csn->CamTime != csn->Time) + { + return 1; + } + + if (csn->Waiting != 0) + { + csn->Time = csn->Play->EndTime; + csn->CamTime = xCutsceneConvertBreak(csn->Time, csn->BreakList, csn->Info->BreakCount, -1); + + if (csn->BadReadPause == 0) + { + csn->BadReadSpeed = csn->PlaybackSpeed; + xCutscene_SetSpeed(csn, 0.0f); + csn->BadReadPause = 1; + } + + return 1; + } + + xCutsceneTime* oldChunk = csn->Play; + csn->Play = csn->Stream; + csn->Stream = oldChunk; + csn->PlayIndex = csn->PlayIndex + 1; + + if (csn->PlayIndex + 1 < csn->Info->NumTime) + { + iCSFileAsyncRead(csn, csn->Stream, csn->TimeChunkOffs[csn->PlayIndex + 2] - csn->TimeChunkOffs[csn->PlayIndex + 1]); + } + } + + return 1; +} + +void xCutscene_SetSpeed(xCutscene* csn, F32 speed) +{ + if (csn->BadReadPause != 0) + return; + + if (speed > 4.0f) + { + speed = 4.0f; + } + + if (speed < 0.001f) + { + speed = 0.0f; + } + + csn->PlaybackSpeed = speed; + + F32 semitones; + if (speed != 0.0f) + { + semitones = xlog(speed) / 0.057762269f; + } + else + { + semitones = -99999.0f; + } + + for (S32 i = 0; i < (S32)csn->SndNumChannel; i++) + { + xSndSetPitch(csn->SndHandle[i], semitones); + } +} + F32 xCutsceneConvertBreak(float param_1, xCutsceneBreak* param_2, U32 param_3, int param_4) { int i = 0; @@ -179,6 +278,22 @@ F32 xCutsceneConvertBreak(float param_1, xCutsceneBreak* param_2, U32 param_3, i return param_2[i].Time - lbl_803CCB40; } +void CutsceneShadowRender(CutsceneShadowModel* smod) +{ + RpAtomic* model = smod->model; + U32 bits = smod->shadowBits; + + while (model != NULL) + { + if ((bits & 1) != 0) + { + iModelRender(model, smod->animMat); + } + model = iModelFile_RWMultiAtomic(model); + bits >>= 1; + } +} + xCutscene* xCutscene_CurrentCutscene() { return &sActiveCutscene; diff --git a/src/SB/Core/x/xCutscene.h b/src/SB/Core/x/xCutscene.h index 3dac4c625..6337eea45 100644 --- a/src/SB/Core/x/xCutscene.h +++ b/src/SB/Core/x/xCutscene.h @@ -2,6 +2,7 @@ #define XCUTSCENE_H #include "xFile.h" +#include "rpworld.h" struct xCutsceneInfo { @@ -92,6 +93,13 @@ struct xCutscene void NoseySet(XCSNNosey* nosey); }; +struct CutsceneShadowModel +{ + RpAtomic* model; + RwMatrixTag* animMat; + U32 shadowBits; +}; + struct xEnt; extern U32 gFrameCount; @@ -103,6 +111,8 @@ U32 iCSFileOpen(xCutscene* csn); xCutscene* xCutscene_Create(U32 id); S32 xCutscene_Destroy(xCutscene* csn); S32 xCutscene_LoadStart(xCutscene* csn); +void xCutscene_SetSpeed(xCutscene* csn, F32 speed); S32 xCutscene_Update(xCutscene* csn, F32 dt); +void CutsceneShadowRender(CutsceneShadowModel* smod); #endif From ccece0a337bc7740b3e0238310bfa222b72710df Mon Sep 17 00:00:00 2001 From: energydrink02 <136357605+energydrink02@users.noreply.github.com> Date: Thu, 15 May 2025 19:37:42 +0200 Subject: [PATCH 3/4] add missing function in header --- src/SB/Core/x/xCutscene.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SB/Core/x/xCutscene.h b/src/SB/Core/x/xCutscene.h index 6337eea45..dc9c9abfe 100644 --- a/src/SB/Core/x/xCutscene.h +++ b/src/SB/Core/x/xCutscene.h @@ -112,6 +112,7 @@ xCutscene* xCutscene_Create(U32 id); S32 xCutscene_Destroy(xCutscene* csn); S32 xCutscene_LoadStart(xCutscene* csn); void xCutscene_SetSpeed(xCutscene* csn, F32 speed); +F32 xCutsceneConvertBreak(float time, xCutsceneBreak* breaklist, U32 breakcount, int idx); S32 xCutscene_Update(xCutscene* csn, F32 dt); void CutsceneShadowRender(CutsceneShadowModel* smod); From 8221a0fe42710af92d70e25ec76d198f6ee6db78 Mon Sep 17 00:00:00 2001 From: energydrink02 <136357605+energydrink02@users.noreply.github.com> Date: Thu, 15 May 2025 20:19:19 +0200 Subject: [PATCH 4/4] more appropriate boolean use --- src/SB/Core/x/xCutscene.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/SB/Core/x/xCutscene.cpp b/src/SB/Core/x/xCutscene.cpp index db0c68cb6..a75e62177 100644 --- a/src/SB/Core/x/xCutscene.cpp +++ b/src/SB/Core/x/xCutscene.cpp @@ -150,7 +150,7 @@ S32 xCutscene_LoadStart(xCutscene* csn) S32 xCutscene_Update(xCutscene *csn, F32 dt) { - if ((csn->SndStarted == 0) && (csn->SndNumChannel != 0)) + if ((csn->SndStarted == FALSE) && (csn->SndNumChannel != 0)) { if (csn->SndNumChannel == 1) { @@ -160,13 +160,13 @@ S32 xCutscene_Update(xCutscene *csn, F32 dt) { xSndStartStereo(csn->SndHandle[0], csn->SndHandle[1], 0.0f); } - csn->SndStarted = 1; + csn->SndStarted = TRUE; } csn->Time = csn->PlaybackSpeed * dt + csn->Time; csn->CamTime = xCutsceneConvertBreak(csn->Time, csn->BreakList, csn->Info->BreakCount, -1); - if ((csn->Time > csn->Play->EndTime) || (csn->BadReadPause != 0)) + if (csn->Time > csn->Play->EndTime || csn->BadReadPause) { if (csn->PlayIndex == csn->Info->NumTime - 1) { @@ -174,9 +174,9 @@ S32 xCutscene_Update(xCutscene *csn, F32 dt) return 0; } - if ((csn->BadReadPause != 0) && (csn->Waiting == 0)) + if (csn->BadReadPause && csn->Waiting == FALSE) { - csn->BadReadPause = 0; + csn->BadReadPause = FALSE; xCutscene_SetSpeed(csn, csn->BadReadSpeed); } @@ -185,16 +185,16 @@ S32 xCutscene_Update(xCutscene *csn, F32 dt) return 1; } - if (csn->Waiting != 0) + if (csn->Waiting) { csn->Time = csn->Play->EndTime; csn->CamTime = xCutsceneConvertBreak(csn->Time, csn->BreakList, csn->Info->BreakCount, -1); - if (csn->BadReadPause == 0) + if (csn->BadReadPause == FALSE) { csn->BadReadSpeed = csn->PlaybackSpeed; xCutscene_SetSpeed(csn, 0.0f); - csn->BadReadPause = 1; + csn->BadReadPause = TRUE; } return 1; @@ -216,7 +216,7 @@ S32 xCutscene_Update(xCutscene *csn, F32 dt) void xCutscene_SetSpeed(xCutscene* csn, F32 speed) { - if (csn->BadReadPause != 0) + if (csn->BadReadPause) return; if (speed > 4.0f)