Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions src/SB/Core/x/xCutscene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
11 changes: 11 additions & 0 deletions src/SB/Core/x/xCutscene.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define XCUTSCENE_H

#include "xFile.h"
#include "rpworld.h"

struct xCutsceneInfo
{
Expand Down Expand Up @@ -92,6 +93,13 @@ struct xCutscene
void NoseySet(XCSNNosey* nosey);
};

struct CutsceneShadowModel
{
RpAtomic* model;
RwMatrixTag* animMat;
U32 shadowBits;
};

struct xEnt;

extern U32 gFrameCount;
Expand All @@ -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
1 change: 1 addition & 0 deletions src/SB/Core/x/xFX.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
87 changes: 58 additions & 29 deletions src/SB/Game/zCutsceneMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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] = {
Expand Down