diff --git a/src/SB/Core/x/xCutscene.cpp b/src/SB/Core/x/xCutscene.cpp index 02bd422dd..a75e62177 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 == FALSE) && (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 = 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) + { + if (csn->PlayIndex == csn->Info->NumTime - 1) + { + csn->Time = csn->Play->EndTime; + return 0; + } + + if (csn->BadReadPause && csn->Waiting == FALSE) + { + csn->BadReadPause = FALSE; + xCutscene_SetSpeed(csn, csn->BadReadSpeed); + } + + if (csn->CamTime != csn->Time) + { + return 1; + } + + if (csn->Waiting) + { + csn->Time = csn->Play->EndTime; + csn->CamTime = xCutsceneConvertBreak(csn->Time, csn->BreakList, csn->Info->BreakCount, -1); + + if (csn->BadReadPause == FALSE) + { + csn->BadReadSpeed = csn->PlaybackSpeed; + xCutscene_SetSpeed(csn, 0.0f); + csn->BadReadPause = TRUE; + } + + 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) + 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..dc9c9abfe 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,9 @@ 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); +F32 xCutsceneConvertBreak(float time, xCutsceneBreak* breaklist, U32 breakcount, int idx); S32 xCutscene_Update(xCutscene* csn, F32 dt); +void CutsceneShadowRender(CutsceneShadowModel* smod); #endif 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] = {