summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorfig02 <fig02srl@gmail.com>2022-12-24 13:55:17 -0500
committerGitHub <noreply@github.com>2022-12-24 13:55:17 -0500
commit7927e7b33007eee68375ca2b940b8d2aa4063406 (patch)
tree66c1c67b8c056b2abf00fb0fc4af138b84825e8b /src/code
parent92e03cf747933ea8dbdea0dd996c5d6ef7635ffe (diff)
z_demo documentation (#1327)
* commit old stuff * progress * progress * progress * progress * more progress, renaming cues next * small changes * enum values added for all actions * hardcoded values removed when possible * commands renamed * first pass of action -> cue * fix some matches * some more cleanup * scriptPtr * forgot one * remove cue rot union * more changes * some more stuff * more stuff * fix matching issues * some more things * progress, starting to rename destinations * small changes * name some destinations * more names * need to switch branch * progress * first pass of destination names * usages fixed * use destination enum * fix csdis * format * command descriptions * revert accidental zap changes * forgot some things * use a single macro for CutsceneCameraPoint (idk why i didnt think of this sooner) * typo * review1 * clarify ruby/sapphire comment * remove endframe for commands that dont use it * some more review * most review, but not all * scriptPtr -> script, and another small change * ocarina action * remove +1 from light settings command, change comment * actionIndex -> cueIdTemp (i guess) * _SetCueX -> _SetXFromCue * format * tweak fade out seq arg names * use spline terminology * more dragorn and engineer review * misc start/end frame note * cleanup StartPosRotFromCue vs PosRotFromCue * cleanup spline terminology * sPrevCamId -> sReturnToCamId * comment on debug cs data address * Cutscene_Init -> Cutscene_InitContext * single point types are not a list * remove todo comment * some more review * rumble struct names * some review * more review * missed one * reword pointer comment * even more review * match transition terminology with z_play * change condition and format * frame count * command specific structs with alignment * anon review * remove unneeded arg from time macro * yeet `CsCmdGeneric` * remove unused from single point types * typo * compromise attempt -- name endFrame everywhere * fixes * fix again * copied the wrong note * cutscene data note * review, format * compat defines * idk whats going on man Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com>
Diffstat (limited to 'src/code')
-rw-r--r--src/code/code_8006C3A0.c18
-rw-r--r--src/code/code_800BB0A0.c3
-rw-r--r--src/code/code_800EC960.c2
-rw-r--r--src/code/db_camera.c14
-rw-r--r--src/code/z_camera.c2
-rw-r--r--src/code/z_demo.c1777
-rw-r--r--src/code/z_kankyo.c6
-rw-r--r--src/code/z_onepointdemo_data.inc.c164
-rw-r--r--src/code/z_parameter.c4
-rw-r--r--src/code/z_play.c35
-rw-r--r--src/code/z_scene.c4
11 files changed, 1160 insertions, 869 deletions
diff --git a/src/code/code_8006C3A0.c b/src/code/code_8006C3A0.c
index 8943d8b93..0057128e2 100644
--- a/src/code/code_8006C3A0.c
+++ b/src/code/code_8006C3A0.c
@@ -1,33 +1,33 @@
#include "global.h"
-void Flags_UnsetAllEnv(PlayState* play) {
+void CutsceneFlags_UnsetAll(PlayState* play) {
u8 i;
- for (i = 0; i < ARRAY_COUNT(play->envFlags); i++) {
- play->envFlags[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(play->cutsceneFlags); i++) {
+ play->cutsceneFlags[i] = 0;
}
}
-void Flags_SetEnv(PlayState* play, s16 flag) {
+void CutsceneFlags_Set(PlayState* play, s16 flag) {
s16 index = flag / 16;
s16 bit = flag % 16;
s16 mask = 1 << bit;
- play->envFlags[index] |= mask;
+ play->cutsceneFlags[index] |= mask;
}
-void Flags_UnsetEnv(PlayState* play, s16 flag) {
+void CutsceneFlags_Unset(PlayState* play, s16 flag) {
s16 index = flag / 16;
s16 bit = flag % 16;
s16 mask = (1 << bit) ^ 0xFFFF;
- play->envFlags[index] &= mask;
+ play->cutsceneFlags[index] &= mask;
}
-s32 Flags_GetEnv(PlayState* play, s16 flag) {
+s32 CutsceneFlags_Get(PlayState* play, s16 flag) {
s16 index = flag / 16;
s16 bit = flag % 16;
s16 mask = 1 << bit;
- return play->envFlags[index] & mask;
+ return play->cutsceneFlags[index] & mask;
}
diff --git a/src/code/code_800BB0A0.c b/src/code/code_800BB0A0.c
index 0f2ee7d74..8dfd375e1 100644
--- a/src/code/code_800BB0A0.c
+++ b/src/code/code_800BB0A0.c
@@ -33,7 +33,8 @@ s32 func_800BB2B4(Vec3f* pos, f32* roll, f32* fov, CutsceneCameraPoint* point, s
progress = 0.0f;
}
- if ((point[key].continueFlag == -1) || (point[key + 1].continueFlag == -1) || (point[key + 2].continueFlag == -1)) {
+ if ((point[key].continueFlag == CS_CAM_STOP) || (point[key + 1].continueFlag == CS_CAM_STOP) ||
+ (point[key + 2].continueFlag == CS_CAM_STOP)) {
return true;
}
diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c
index fb4fd25fe..a5a76016b 100644
--- a/src/code/code_800EC960.c
+++ b/src/code/code_800EC960.c
@@ -2259,7 +2259,7 @@ void AudioOcarina_Update(void) {
AudioOcarina_UpdateRecordingStaff();
}
-void AudioOcarina_PlayLongScarecrowAfterCredits(void) {
+void AudioOcarina_PlayLongScarecrowSong(void) {
static u8 sScarecrowAfterCreditsState = 0;
static u8 sScarecrowAfterCreditsIntrumentId = OCARINA_INSTRUMENT_DEFAULT;
static u16 sScarecrowAfterCreditsTimer = 1200;
diff --git a/src/code/db_camera.c b/src/code/db_camera.c
index 0c50abbc0..80a9eb58d 100644
--- a/src/code/db_camera.c
+++ b/src/code/db_camera.c
@@ -252,7 +252,7 @@ s32 func_800B4088(DbCamera* dbCamera, Camera* cam) {
position = &dbCamera->sub.position[dbCamera->sub.unkIdx];
lookAt = &dbCamera->sub.lookAt[dbCamera->sub.unkIdx];
- position->continueFlag = -1;
+ position->continueFlag = CS_CAM_STOP;
lookAt->continueFlag = position->continueFlag;
position->nextPointFrame = 0;
lookAt->nextPointFrame = 30;
@@ -268,10 +268,10 @@ s32 func_800B4088(DbCamera* dbCamera, Camera* cam) {
}
for (i = 0; i < (dbCamera->sub.nPoints - 2); i++) {
- dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = 0;
+ dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = CS_CAM_CONTINUE;
}
- dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = -1;
+ dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = CS_CAM_STOP;
return dbCamera->sub.unkIdx;
}
@@ -299,7 +299,7 @@ s32 func_800B42C0(DbCamera* dbCamera, Camera* cameraPtr) {
CutsceneCameraPoint* position = &dbCamera->sub.position[dbCamera->sub.unkIdx];
CutsceneCameraPoint* lookAt = &dbCamera->sub.lookAt[dbCamera->sub.unkIdx];
- position->continueFlag = lookAt->continueFlag = 0;
+ position->continueFlag = lookAt->continueFlag = CS_CAM_CONTINUE;
if (dbCamera->sub.mode != 1) {
DbCamera_Vec3FToS(&dbCamera->eye, &position->pos);
@@ -352,10 +352,10 @@ void func_800B44E0(DbCamera* dbCamera, Camera* cam) {
sDbCamAnim.unk_04 = 0;
for (i = 0; i < (dbCamera->sub.nPoints - 2); i++) {
- dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = 0;
+ dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = CS_CAM_CONTINUE;
}
- dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = -1;
+ dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = CS_CAM_STOP;
}
if (dbCamera->sub.nPoints < 6) {
@@ -2155,7 +2155,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
if (CHECK_BTN_ALL(sPlay->state.input[1].press.button, BTN_CRIGHT)) {
- D_8015FCC8 = 0;
+ gUseCutsceneCam = false;
gSaveContext.cutsceneIndex = 0xFFFD;
gSaveContext.cutsceneTrigger = 1;
sDbCamAnim.curFrame = 0.0f;
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index 100783217..e91e4fe8e 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -7716,7 +7716,7 @@ Vec3s Camera_Update(Camera* camera) {
if (gDbgCamEnabled) {
DbgCamera_Enable(&D_8015BD80, camera);
} else if (camera->play->csCtx.state != CS_STATE_IDLE) {
- func_80064534(camera->play, &camera->play->csCtx);
+ Cutscene_StopManual(camera->play, &camera->play->csCtx);
}
}
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index 14f72061a..5fd51a5bd 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -30,27 +30,48 @@
#include "assets/scenes/misc/hakaana_ouke/hakaana_ouke_scene.h"
-u16 D_8011E1C0 = 0;
-u16 D_8011E1C4 = 0;
-
-typedef void (*CutsceneStateHandler)(PlayState*, CutsceneContext*);
-
-void func_80064720(PlayState* play, CutsceneContext* csCtx);
-void func_80064760(PlayState* play, CutsceneContext* csCtx);
-void func_800647C0(PlayState* play, CutsceneContext* csCtx);
-void func_80068C3C(PlayState* play, CutsceneContext* csCtx);
-void func_80068D84(PlayState* play, CutsceneContext* csCtx);
-void func_80068DC0(PlayState* play, CutsceneContext* csCtx);
-
-CutsceneStateHandler sCsStateHandlers1[] = {
- func_80064720, func_80064760, func_80064720, func_80068D84, func_80064720,
+u16 sCurTextId = 0;
+u16 sCurOcarinaAction = 0;
+
+typedef void (*CutsceneHandler)(PlayState*, CutsceneContext*);
+
+void CutsceneHandler_DoNothing(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StartManual(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StartScript(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_RunScript(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StopManual(PlayState* play, CutsceneContext* csCtx);
+void CutsceneHandler_StopScript(PlayState* play, CutsceneContext* csCtx);
+
+CutsceneHandler sManualCutsceneHandlers[] = {
+ CutsceneHandler_DoNothing, // CS_STATE_IDLE
+ CutsceneHandler_StartManual, // CS_STATE_START
+ CutsceneHandler_DoNothing, // CS_STATE_RUN
+ CutsceneHandler_StopManual, // CS_STATE_STOP
+ CutsceneHandler_DoNothing, // CS_STATE_RUN_UNSTOPPABLE
};
-CutsceneStateHandler sCsStateHandlers2[] = {
- func_80064720, func_800647C0, func_80068C3C, func_80068DC0, func_80068C3C,
+CutsceneHandler sScriptedCutsceneHandlers[] = {
+ CutsceneHandler_DoNothing, // CS_STATE_IDLE
+ CutsceneHandler_StartScript, // CS_STATE_START
+ CutsceneHandler_RunScript, // CS_STATE_RUN
+ CutsceneHandler_StopScript, // CS_STATE_STOP
+ CutsceneHandler_RunScript, // CS_STATE_RUN_UNSTOPPABLE
};
-u8 sTitleCsState = 0;
+typedef enum {
+ /* 0 */ TITLE_DEMO_SPIRIT_TEMPLE,
+ /* 1 */ TITLE_DEMO_DEATH_MOUNTAIN_CRATER,
+ /* 2 */ TITLE_DEMO_GANONDORF_HORSE
+} TitleDemoDestination;
+
+u8 sTitleDemoDestination = TITLE_DEMO_SPIRIT_TEMPLE;
+
+typedef struct {
+ /* 0x00 */ u16 entrance; // entrance index upon which the cutscene should trigger
+ /* 0x02 */ u8 ageRestriction; // 0 for adult only, 1 for child only, 2 for both ages
+ /* 0x03 */ u8 flag; // eventChkInf flag bound to the entrance cutscene
+ /* 0x04 */ void* script; // cutscene script that should run
+} EntranceCutscene; // size = 0x8
EntranceCutscene sEntranceCutsceneTable[] = {
{ ENTR_HYRULE_FIELD_3, 2, EVENTCHKINF_A0, gHyruleFieldIntroCs },
@@ -89,22 +110,25 @@ EntranceCutscene sEntranceCutsceneTable[] = {
{ ENTR_KOKIRI_FOREST_12, 2, EVENTCHKINF_C6, gKokiriForestDekuSproutCs },
};
-// Unused, seems to be an early list of dungeon entrance cutscene locations
-void* D_8011E304[] = {
+void* sUnusedEntranceCsList[] = {
gDekuTreeIntroCs, gJabuJabuIntroCs, gDcOpeningCs, gMinuetCs, gIceCavernSerenadeCs, gTowerBarrierCs,
};
-u16 D_8015FCC0;
-u16 D_8015FCC2;
-u16 D_8015FCC4;
+// Stores the frame the relevant cam data was last applied on
+u16 gCamAtSplinePointsAppliedFrame;
+u16 gCamEyePointAppliedFrame;
+u16 gCamAtPointAppliedFrame;
+
+// Cam ID to return to when a scripted cutscene is finished
s16 sReturnToCamId;
-u8 D_8015FCC8;
+
+// Setting this to false will skip applying changes to the camera from the current cutscene script.
+// It is set to true in most normal situations, only changed to false for debugging purposes.
+u8 gUseCutsceneCam;
+
s16 sQuakeIndex;
-u16 D_8015FCCC; // only written to, never read
-char D_8015FCD0[20]; // unreferenced
-u8 D_8015FCE4; // only written to, never read
-void func_80068ECC(PlayState* play, CutsceneContext* csCtx);
+void Cutscene_SetupScripted(PlayState* play, CutsceneContext* csCtx);
void Cutscene_DrawDebugInfo(PlayState* play, Gfx** dlist, CutsceneContext* csCtx) {
GfxPrint printer;
@@ -117,7 +141,7 @@ void Cutscene_DrawDebugInfo(PlayState* play, Gfx** dlist, CutsceneContext* csCtx
GfxPrint_SetColor(&printer, 255, 255, 55, 32);
GfxPrint_Printf(&printer, "%s", "FLAME ");
GfxPrint_SetColor(&printer, 255, 255, 255, 32);
- GfxPrint_Printf(&printer, "%06d", csCtx->frames);
+ GfxPrint_Printf(&printer, "%06d", csCtx->curFrame);
GfxPrint_SetColor(&printer, 50, 255, 255, 60);
GfxPrint_SetPos(&printer, 4, 26);
GfxPrint_Printf(&printer, "%s", "SKIP=(START) or (Cursole Right)");
@@ -126,40 +150,40 @@ void Cutscene_DrawDebugInfo(PlayState* play, Gfx** dlist, CutsceneContext* csCtx
GfxPrint_Destroy(&printer);
}
-void func_8006450C(PlayState* play, CutsceneContext* csCtx) {
+void Cutscene_InitContext(PlayState* play, CutsceneContext* csCtx) {
csCtx->state = CS_STATE_IDLE;
- csCtx->unk_0C = 0.0f;
+ csCtx->timer = 0.0f;
}
-void func_80064520(PlayState* play, CutsceneContext* csCtx) {
- csCtx->state = CS_STATE_SKIPPABLE_INIT;
- csCtx->linkAction = NULL;
+void Cutscene_StartManual(PlayState* play, CutsceneContext* csCtx) {
+ csCtx->state = CS_STATE_START;
+ csCtx->playerCue = NULL;
}
-void func_80064534(PlayState* play, CutsceneContext* csCtx) {
- if (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC) {
- csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
+void Cutscene_StopManual(PlayState* play, CutsceneContext* csCtx) {
+ if (csCtx->state != CS_STATE_RUN_UNSTOPPABLE) {
+ csCtx->state = CS_STATE_STOP;
}
}
-void func_80064558(PlayState* play, CutsceneContext* csCtx) {
+void Cutscene_UpdateManual(PlayState* play, CutsceneContext* csCtx) {
if (gSaveContext.cutsceneIndex < 0xFFF0) {
- sCsStateHandlers1[csCtx->state](play, csCtx);
+ sManualCutsceneHandlers[csCtx->state](play, csCtx);
}
}
-void func_800645A0(PlayState* play, CutsceneContext* csCtx) {
+void Cutscene_UpdateScripted(PlayState* play, CutsceneContext* csCtx) {
Input* input = &play->state.input[0];
if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT) && (csCtx->state == CS_STATE_IDLE) && IS_CUTSCENE_LAYER) {
- D_8015FCC8 = 0;
+ gUseCutsceneCam = false;
gSaveContext.cutsceneIndex = 0xFFFD;
gSaveContext.cutsceneTrigger = 1;
}
if (CHECK_BTN_ALL(input->press.button, BTN_DUP) && (csCtx->state == CS_STATE_IDLE) && IS_CUTSCENE_LAYER &&
!gDbgCamEnabled) {
- D_8015FCC8 = 1;
+ gUseCutsceneCam = true;
gSaveContext.cutsceneIndex = 0xFFFD;
gSaveContext.cutsceneTrigger = 1;
}
@@ -175,85 +199,93 @@ void func_800645A0(PlayState* play, CutsceneContext* csCtx) {
}
if (gSaveContext.cutsceneIndex >= 0xFFF0) {
- func_80068ECC(play, csCtx);
- sCsStateHandlers2[csCtx->state](play, csCtx);
+ Cutscene_SetupScripted(play, csCtx);
+ sScriptedCutsceneHandlers[csCtx->state](play, csCtx);
}
}
-void func_80064720(PlayState* play, CutsceneContext* csCtx) {
+void CutsceneHandler_DoNothing(PlayState* play, CutsceneContext* csCtx) {
}
-u32 func_8006472C(PlayState* play, CutsceneContext* csCtx, f32 target) {
- return Math_StepToF(&csCtx->unk_0C, target, 0.1f);
+u32 Cutscene_StepTimer(PlayState* play, CutsceneContext* csCtx, f32 target) {
+ return Math_StepToF(&csCtx->timer, target, 0.1f);
}
-void func_80064760(PlayState* play, CutsceneContext* csCtx) {
+void CutsceneHandler_StartManual(PlayState* play, CutsceneContext* csCtx) {
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_NOTHING);
Letterbox_SetSizeTarget(32);
- if (func_8006472C(play, csCtx, 1.0f)) {
+ if (Cutscene_StepTimer(play, csCtx, 1.0f)) {
Audio_SetCutsceneFlag(1);
- csCtx->state++;
+ csCtx->state++; // CS_STATE_RUN
}
}
-void func_800647C0(PlayState* play, CutsceneContext* csCtx) {
- func_80068C3C(play, csCtx);
+void CutsceneHandler_StartScript(PlayState* play, CutsceneContext* csCtx) {
+ CutsceneHandler_RunScript(play, csCtx);
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_NOTHING);
Letterbox_SetSizeTarget(32);
- if (func_8006472C(play, csCtx, 1.0f)) {
+ if (Cutscene_StepTimer(play, csCtx, 1.0f)) {
Audio_SetCutsceneFlag(1);
- csCtx->state++;
+ csCtx->state++; // CS_STATE_RUN
}
}
-// Command 3: Misc. Actions
-void func_80064824(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
+void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
Player* player = GET_PLAYER(play);
- f32 temp;
- u8 sp3F = 0;
+ f32 lerp;
+ u8 isFirstFrame = false;
- if ((csCtx->frames < cmd->startFrame) || ((csCtx->frames >= cmd->endFrame) && (cmd->endFrame != cmd->startFrame))) {
+ if (!((csCtx->curFrame >= cmd->startFrame) &&
+ ((csCtx->curFrame < cmd->endFrame) || (cmd->endFrame == cmd->startFrame)))) {
return;
}
- temp = Environment_LerpWeight(cmd->endFrame - 1, cmd->startFrame, csCtx->frames);
+ lerp = Environment_LerpWeight(cmd->endFrame - 1, cmd->startFrame, csCtx->curFrame);
- if (csCtx->frames == cmd->startFrame) {
- sp3F = 1;
+ if (csCtx->curFrame == cmd->startFrame) {
+ isFirstFrame = true;
}
- switch (cmd->base) {
- case 1:
- if (sp3F != 0) {
+ switch (cmd->type) {
+ case CS_MISC_RAIN:
+ if (isFirstFrame) {
Audio_SetNatureAmbienceChannelIO(NATURE_CHANNEL_RAIN, CHANNEL_IO_PORT_4, 0x3F);
Audio_SetNatureAmbienceChannelIO(NATURE_CHANNEL_RAIN, CHANNEL_IO_PORT_1, 1);
play->envCtx.precipitation[PRECIP_RAIN_MAX] = 20;
}
break;
- case 2:
- if (sp3F != 0) {
+
+ case CS_MISC_LIGHTNING:
+ if (isFirstFrame) {
Audio_SetNatureAmbienceChannelIO(NATURE_CHANNEL_LIGHTNING, CHANNEL_IO_PORT_0, 0);
Environment_AddLightningBolts(play, 3);
gLightningStrike.state = LIGHTNING_STRIKE_START;
}
break;
- case 3:
- if (sp3F != 0) {
- Flags_SetEnv(play, 0);
+
+ case CS_MISC_SET_CSFLAG_0:
+ if (isFirstFrame) {
+ CutsceneFlags_Set(play, 0);
+
+ // Because this check uses an entrance index, the Door of Time will only open
+ // after entering Temple of Time from the front entrance.
+ // This is not an issue in the context of normal gameplay.
if (gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0) {
- Flags_SetEnv(play, 2);
+ CutsceneFlags_Set(play, 2);
}
}
break;
- case 6:
+
+ case CS_MISC_LIFT_FOG:
if (play->envCtx.adjZFar < ENV_ZFAR_MAX) {
play->envCtx.adjZFar += 35;
}
break;
- case 7:
- if (sp3F != 0) {
+
+ case CS_MISC_CLOUDY_SKY:
+ if (isFirstFrame) {
play->envCtx.changeSkyboxState = CHANGE_SKYBOX_REQUESTED;
play->envCtx.skyboxConfig = 1;
play->envCtx.changeSkyboxNextConfig = 0;
@@ -264,107 +296,131 @@ void func_80064824(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
play->envCtx.changeLightTimer = play->envCtx.changeDuration = 60;
}
break;
- case 8:
- if (play->roomCtx.unk_74[0] < 0x80) {
+
+ case CS_MISC_FADE_KOKIRI_GRASS_ENV_ALPHA:
+ if (play->roomCtx.unk_74[0] <= 127) {
play->roomCtx.unk_74[0] += 4;
}
break;
- case 9:
+
+ case CS_MISC_SNOW:
play->envCtx.precipitation[PRECIP_SNOW_MAX] = 16;
break;
- case 10:
- Flags_SetEnv(play, 1);
+
+ case CS_MISC_SET_CSFLAG_1:
+ CutsceneFlags_Set(play, 1);
break;
- case 11:
- if (play->roomCtx.unk_74[0] < 0x672) {
- play->roomCtx.unk_74[0] += 0x14;
+
+ case CS_MISC_DEKU_TREE_DEATH:
+ if (play->roomCtx.unk_74[0] < 1650) {
+ play->roomCtx.unk_74[0] += 20;
}
- if (csCtx->frames == 0x30F) {
+
+ if (csCtx->curFrame == 783) {
func_80078884(NA_SE_EV_DEKU_DEATH);
- } else if (csCtx->frames == 0x2CD) {
+ } else if (csCtx->curFrame == 717) {
play->roomCtx.unk_74[0] = 0;
}
break;
- case 12:
- if (sp3F != 0) {
- if (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC) {
- csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
+
+ case CS_MISC_STOP_CUTSCENE:
+ if (isFirstFrame) {
+ if (csCtx->state != CS_STATE_RUN_UNSTOPPABLE) {
+ csCtx->state = CS_STATE_STOP;
}
}
break;
- case 13:
+
+ case CS_MISC_TRIFORCE_FLASH:
if (play->roomCtx.unk_74[1] == 0) {
func_80078884(NA_SE_EV_TRIFORCE_FLASH);
}
- if (play->roomCtx.unk_74[1] < 0xFF) {
+
+ if (play->roomCtx.unk_74[1] < 255) {
play->roomCtx.unk_74[1] += 5;
}
break;
- case 14:
- if (sp3F != 0) {
+
+ case CS_MISC_SET_LOCKED_VIEWPOINT:
+ if (isFirstFrame) {
Play_SetViewpoint(play, VIEWPOINT_LOCKED);
}
break;
- case 15:
- if (sp3F != 0) {
+
+ case CS_MISC_SHOW_TITLE_CARD:
+ if (isFirstFrame) {
TitleCard_InitPlaceName(play, &play->actorCtx.titleCtx, player->giObjectSegment, 160, 120, 144, 24, 20);
}
break;
- case 16:
- if (sp3F != 0) {
+
+ case CS_MISC_QUAKE_START:
+ if (isFirstFrame) {
sQuakeIndex = Quake_Request(GET_ACTIVE_CAM(play), QUAKE_TYPE_6);
Quake_SetSpeed(sQuakeIndex, 0x7FFF);
Quake_SetPerturbations(sQuakeIndex, 4, 0, 1000, 0);
Quake_SetDuration(sQuakeIndex, 800);
}
break;
- case 17:
- if (sp3F != 0) {
+
+ case CS_MISC_QUAKE_STOP:
+ if (isFirstFrame) {
Quake_RemoveRequest(sQuakeIndex);
}
break;
- case 18:
+
+ case CS_MISC_STOP_STORM_AND_ADVANCE_TO_DAY:
play->envCtx.precipitation[PRECIP_RAIN_MAX] = 0;
play->envCtx.stormRequest = STORM_REQUEST_STOP;
+
if (gSaveContext.dayTime < CLOCK_TIME(7, 0)) {
gSaveContext.dayTime += 30;
}
+
if (play->envCtx.precipitation[PRECIP_RAIN_CUR] == 0) {
gWeatherMode = WEATHER_MODE_CLEAR;
Audio_SetNatureAmbienceChannelIO(NATURE_CHANNEL_RAIN, CHANNEL_IO_PORT_1, 0);
}
break;
- case 19:
+
+ case CS_MISC_SET_FLAG_FAST_WINDMILL:
SET_EVENTCHKINF(EVENTCHKINF_65);
break;
- case 20:
+
+ case CS_MISC_SET_FLAG_WELL_DRAINED:
SET_EVENTCHKINF(EVENTCHKINF_67);
break;
- case 21:
+
+ case CS_MISC_SET_FLAG_LAKE_HYLIA_RESTORED:
SET_EVENTCHKINF(EVENTCHKINF_69);
break;
- case 22:
- D_801614B0.r = 255;
- D_801614B0.g = 255;
- D_801614B0.b = 255;
- D_801614B0.a = 255;
+
+ case CS_MISC_VISMONO_BLACK_AND_WHITE:
+ gVisMonoColor.r = 255;
+ gVisMonoColor.g = 255;
+ gVisMonoColor.b = 255;
+ gVisMonoColor.a = 255;
break;
- case 23:
- D_801614B0.r = 255;
- D_801614B0.g = 180;
- D_801614B0.b = 100;
- D_801614B0.a = 255.0f * temp;
+
+ case CS_MISC_VISMONO_SEPIA:
+ gVisMonoColor.r = 255;
+ gVisMonoColor.g = 180;
+ gVisMonoColor.b = 100;
+ gVisMonoColor.a = 255.0f * lerp;
break;
- case 24:
+
+ case CS_MISC_HIDE_ROOM:
play->roomCtx.curRoom.segment = NULL;
break;
- case 25:
+
+ case CS_MISC_TIME_ADVANCE_TO_NIGHT:
gSaveContext.dayTime += 30;
+
if ((gSaveContext.dayTime) >= CLOCK_TIME(19, 0)) {
gSaveContext.dayTime = CLOCK_TIME(19, 0) - 1;
}
break;
- case 26:
+
+ case CS_MISC_SET_TIME_BASED_LIGHT_SETTING:
if ((gSaveContext.dayTime < CLOCK_TIME(4, 30)) || (gSaveContext.dayTime >= CLOCK_TIME(6, 30))) {
if ((gSaveContext.dayTime >= CLOCK_TIME(6, 30)) && (gSaveContext.dayTime < CLOCK_TIME(16, 0))) {
play->envCtx.lightSettingOverride = 1;
@@ -376,7 +432,8 @@ void func_80064824(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
}
}
break;
- case 27:
+
+ case CS_MISC_RED_PULSATING_LIGHTS:
if (play->state.frames & 8) {
if (play->envCtx.adjAmbientColor[0] < 40) {
play->envCtx.adjAmbientColor[0] += 2;
@@ -391,176 +448,190 @@ void func_80064824(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
}
}
break;
- case 28:
- play->unk_11DE9 = true;
+
+ case CS_MISC_HALT_ALL_ACTORS:
+ play->haltAllActors = true;
break;
- case 29:
- play->unk_11DE9 = false;
+
+ case CS_MISC_RESUME_ALL_ACTORS:
+ play->haltAllActors = false;
break;
- case 30:
- Flags_SetEnv(play, 3);
+
+ case CS_MISC_SET_CSFLAG_3:
+ CutsceneFlags_Set(play, 3);
break;
- case 31:
- Flags_SetEnv(play, 4);
+
+ case CS_MISC_SET_CSFLAG_4:
+ CutsceneFlags_Set(play, 4);
break;
- case 32:
- if (sp3F != 0) {
+
+ case CS_MISC_SANDSTORM_FILL:
+ if (isFirstFrame) {
play->envCtx.sandstormState = SANDSTORM_FILL;
}
+
func_800788CC(NA_SE_EV_SAND_STORM - SFX_FLAG);
break;
- case 33:
+
+ case CS_MISC_SUNSSONG_START:
gSaveContext.sunsSongState = SUNSSONG_START;
break;
- case 34:
+
+ case CS_MISC_FREEZE_TIME:
if (IS_DAY) {
gSaveContext.dayTime -= gTimeSpeed;
} else {
+ // doubled to compensate for time moving twice as fast at night
gSaveContext.dayTime -= gTimeSpeed * 2;
}
break;
- case 35:
- AudioOcarina_PlayLongScarecrowAfterCredits();
- csCtx->frames = cmd->startFrame - 1;
+
+ case CS_MISC_LONG_SCARECROW_SONG:
+ AudioOcarina_PlayLongScarecrowSong();
+ csCtx->curFrame = cmd->startFrame - 1; // the cutscene runs forever
break;
}
}
-// Command 4: Set Environment Lighting
-void Cutscene_Command_SetLighting(PlayState* play, CutsceneContext* csCtx, CsCmdEnvLighting* cmd) {
- if (csCtx->frames == cmd->startFrame) {
- play->envCtx.lightSettingOverride = cmd->setting - 1;
+void CutsceneCmd_SetLightSetting(PlayState* play, CutsceneContext* csCtx, CsCmdLightSetting* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ play->envCtx.lightSettingOverride = cmd->settingPlusOne - 1;
play->envCtx.lightBlend = 1.0f;
}
}
-// Command 0x56: Play Background Music
-void Cutscene_Command_PlayBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) {
- if (csCtx->frames == cmd->startFrame) {
- Audio_PlaySequenceInCutscene(cmd->sequence - 1);
+void CutsceneCmd_StartSequence(PlayState* play, CutsceneContext* csCtx, CsCmdStartSeq* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ Audio_PlaySequenceInCutscene(cmd->seqIdPlusOne - 1);
}
}
-// Command 0x57: Stop Background Music
-void Cutscene_Command_StopBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) {
- if (csCtx->frames == cmd->startFrame) {
- Audio_StopSequenceInCutscene(cmd->sequence - 1);
+void CutsceneCmd_StopSequence(PlayState* play, CutsceneContext* csCtx, CsCmdStopSeq* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ Audio_StopSequenceInCutscene(cmd->seqIdPlusOne - 1);
}
}
-// Command 0x7C: Fade Background Music over duration
-void Cutscene_Command_FadeBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicFade* cmd) {
- u8 fadeTimer;
+void CutsceneCmd_FadeOutSequence(PlayState* play, CutsceneContext* csCtx, CsCmdFadeOutSeq* cmd) {
+ u8 fadeOutDuration;
- if ((csCtx->frames == cmd->startFrame) && (csCtx->frames < cmd->endFrame)) {
- fadeTimer = cmd->endFrame - cmd->startFrame;
+ if ((csCtx->curFrame == cmd->startFrame) && (csCtx->curFrame < cmd->endFrame)) {
+ fadeOutDuration = cmd->endFrame - cmd->startFrame;
- if (cmd->type == 3) {
- SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, fadeTimer);
+ if (cmd->seqPlayer == CS_FADE_OUT_FANFARE) {
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, fadeOutDuration);
} else {
- SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, fadeTimer);
+ SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, fadeOutDuration);
}
}
}
-// Command 9: ?
-void Cutscene_Command_09(PlayState* play, CutsceneContext* csCtx, CsCmdUnknown9* cmd) {
- if (csCtx->frames == cmd->startFrame) {
- Rumble_Request(0.0f, cmd->unk_06, cmd->unk_07, cmd->unk_08);
+void CutsceneCmd_RumbleController(PlayState* play, CutsceneContext* csCtx, CsCmdRumble* cmd) {
+ if (csCtx->curFrame == cmd->startFrame) {
+ Rumble_Request(0.0f, cmd->sourceStrength, cmd->duration, cmd->decreaseRate);
}
}
-// Command 0x8C: Set Time of Day & Environment Time
-void func_80065134(PlayState* play, CutsceneContext* csCtx, CsCmdDayTime* cmd) {
- s16 temp1;
- s16 temp2;
+void CutsceneCmd_SetTime(PlayState* play, CutsceneContext* csCtx, CsCmdTime* cmd) {
+ s16 hours;
+ s16 minutes;
- if (csCtx->frames == cmd->startFrame) {
- temp1 = (cmd->hour * 60.0f) / (360.0f / 0x4000);
- temp2 = (cmd->minute + 1) / (360.0f / 0x4000);
+ if (csCtx->curFrame == cmd->startFrame) {
+ hours = (cmd->hour * 60.0f) / (24.0f * 60.0f / 0x10000);
+ minutes = (cmd->minute + 1) / (24.0f * 60.0f / 0x10000);
- gSaveContext.dayTime = temp1 + temp2;
- gSaveContext.skyboxTime = temp1 + temp2;
+ gSaveContext.dayTime = hours + minutes;
+ gSaveContext.skyboxTime = hours + minutes;
}
}
-// Command 0x3E8: Code Execution (& Terminates Cutscene?)
-void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
+void CutsceneCmd_Destination(PlayState* play, CutsceneContext* csCtx, CsCmdDestination* cmd) {
Player* player = GET_PLAYER(play);
- s32 temp = 0;
+ s32 titleDemoSkipped = false;
if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_END_CREDITS) &&
- (play->sceneId != SCENE_HYRULE_FIELD) && (csCtx->frames > 20) &&
+ (play->sceneId != SCENE_HYRULE_FIELD) && (csCtx->curFrame > 20) &&
(CHECK_BTN_ALL(play->state.input[0].press.button, BTN_A) ||
CHECK_BTN_ALL(play->state.input[0].press.button, BTN_B) ||
CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START)) &&
(gSaveContext.fileNum != 0xFEDC) && (play->transitionTrigger == TRANS_TRIGGER_OFF)) {
Audio_PlaySfxGeneral(NA_SE_SY_PIECE_OF_HEART, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
- temp = 1;
+ titleDemoSkipped = true;
}
- if ((csCtx->frames == cmd->startFrame) || (temp != 0) ||
- ((csCtx->frames > 20) && CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START) &&
+ if ((csCtx->curFrame == cmd->startFrame) || titleDemoSkipped ||
+ ((csCtx->curFrame > 20) && CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START) &&
(gSaveContext.fileNum != 0xFEDC))) {
- csCtx->state = CS_STATE_UNSKIPPABLE_EXEC;
+ csCtx->state = CS_STATE_RUN_UNSTOPPABLE;
Audio_SetCutsceneFlag(0);
gSaveContext.cutsceneTransitionControl = 1;
- osSyncPrintf("\n分岐先指定!!=[%d]番", cmd->base); // "Future fork designation=No. [%d]"
+ osSyncPrintf("\n分岐先指定!!=[%d]番", cmd->destination); // "Future fork designation=No. [%d]"
- if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (csCtx->frames != cmd->startFrame)) {
+ // `forceRisingButtonAlphas` has a secondary purpose, which is to signal to the title screen actor
+ // that it should display immediately. This occurs when a title screen cutscene that is not the main
+ // hyrule field scene is skipped.
+ if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (csCtx->curFrame != cmd->startFrame)) {
gSaveContext.forceRisingButtonAlphas = true;
}
gSaveContext.cutsceneIndex = 0;
- switch (cmd->base) {
- case 1:
+ switch (cmd->destination) {
+ case CS_DEST_CUTSCENE_MAP_GANON_HORSE:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 2:
+
+ case CS_DEST_CUTSCENE_MAP_THREE_GODDESSES:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FILL_WHITE;
break;
- case 3:
+
+ case CS_DEST_GERUDO_VALLEY_DIN_PART_1:
play->nextEntranceIndex = ENTR_GERUDO_VALLEY_0;
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FILL_WHITE;
break;
- case 4:
+
+ case CS_DEST_DEATH_MOUNTAIN_TRAIL_NAYRU:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FILL_WHITE;
break;
- case 5:
+
+ case CS_DEST_KOKIRI_FOREST_FARORE:
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FILL_WHITE;
break;
- case 6:
+
+ case CS_DEST_CUTSCENE_MAP_TRIFORCE_CREATION:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FILL_WHITE;
break;
- case 7:
+
+ case CS_DEST_KOKIRI_FOREST_RECEIVE_KOKIRI_EMERALD:
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_INSTANT;
break;
- case 8:
+
+ case CS_DEST_TEMPLE_OF_TIME_FROM_MASTER_SWORD:
gSaveContext.fw.set = 0;
gSaveContext.respawn[RESPAWN_MODE_TOP].data = 0;
+
if (!GET_EVENTCHKINF(EVENTCHKINF_45)) {
SET_EVENTCHKINF(EVENTCHKINF_45);
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
@@ -575,216 +646,252 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
play->linkAgeOnLoad = LINK_AGE_CHILD;
}
}
+
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_2;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
}
break;
- case 9:
+
+ case CS_DEST_GERUDO_VALLEY_DIN_PART_2:
play->nextEntranceIndex = ENTR_GERUDO_VALLEY_0;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FILL_BROWN;
break;
- case 10:
+
+ case CS_DEST_LINKS_HOUSE_INTRO:
play->nextEntranceIndex = ENTR_LINKS_HOUSE_0;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 11:
+
+ case CS_DEST_KOKIRI_FOREST_INTRO:
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0;
gSaveContext.cutsceneIndex = 0xFFF3;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 12:
+
+ case CS_DEST_DEATH_MOUNTAIN_TRAIL_FROM_GORON_RUBY:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_5;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 13:
+
+ case CS_DEST_ZORAS_FOUNTAIN_FROM_ZORAS_SAPPHIRE:
play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 14:
+
+ case CS_DEST_KOKIRI_FOREST_FROM_KOKIRI_EMERALD:
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_11;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 15:
+
+ case CS_DEST_TEMPLE_OF_TIME_KOKIRI_EMERALD_RESTORED:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF4;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 16:
+
+ case CS_DEST_TEMPLE_OF_TIME_GORON_RUBY_RESTORED:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF5;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 17:
+
+ case CS_DEST_TEMPLE_OF_TIME_ZORAS_SAPPHIRE_RESTORED:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF6;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 18:
+
+ case CS_DEST_TEMPLE_OF_TIME_AFTER_LIGHT_MEDALLION:
SET_EVENTCHKINF(EVENTCHKINF_4F);
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_4;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 19:
+
+ case CS_DEST_DEATH_MOUNTAIN_TRAIL:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
gSaveContext.cutsceneIndex = 0x8000;
break;
- case 21:
+
+ case CS_DEST_LAKE_HYLIA_WATER_RESTORED:
play->nextEntranceIndex = ENTR_LAKE_HYLIA_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 22:
+
+ case CS_DEST_DESERT_COLOSSUS_REQUIEM:
Item_Give(play, ITEM_SONG_REQUIEM);
play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 23:
+
+ case CS_DEST_CUTSCENE_MAP_GANONDORF_DEFEATED_CREDITS:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF8;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 24:
+
+ case CS_DEST_JABU_JABU:
play->nextEntranceIndex = ENTR_JABU_JABU_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 25:
+
+ case CS_DEST_CHAMBER_OF_SAGES_LIGHT_MEDALLION:
play->linkAgeOnLoad = LINK_AGE_ADULT;
play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 26:
+
+ case CS_DEST_TEMPLE_OF_TIME_KOKIRI_EMERALD_RESTORED_2:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF4;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 27:
+
+ case CS_DEST_TEMPLE_OF_TIME_GORON_RUBY_RESTORED_2:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF5;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 28:
+
+ case CS_DEST_TEMPLE_OF_TIME_ZORAS_SAPPHIRE_RESTORED_2:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF6;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 29:
+
+ case CS_DEST_CHAMBER_OF_SAGES_FOREST_MEDALLION:
play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.chamberCutsceneNum = 0;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 30:
+
+ case CS_DEST_CHAMBER_OF_SAGES_FIRE_MEDALLION:
play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
Item_Give(play, ITEM_MEDALLION_FIRE);
gSaveContext.chamberCutsceneNum = 1;
break;
- case 31:
+
+ case CS_DEST_CHAMBER_OF_SAGES_WATER_MEDALLION:
play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.chamberCutsceneNum = 2;
break;
- case 32:
+
+ case CS_DEST_HYRULE_FIELD_FLASHBACK:
play->linkAgeOnLoad = LINK_AGE_CHILD;
play->nextEntranceIndex = ENTR_HYRULE_FIELD_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionType = TRANS_TYPE_INSTANT;
break;
- case 33:
+
+ case CS_DEST_HYRULE_FIELD_FROM_ZELDA_ESCAPE:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 34:
+
+ case CS_DEST_CUTSCENE_MAP_GANONDORF_FROM_MASTER_SWORD:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF3;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 35:
+
+ case CS_DEST_HYRULE_FIELD_INTRO_DREAM:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 38:
+
+ case CS_DEST_CUTSCENE_MAP_SHEIKAH_LEGEND:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF4;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 39:
+
+ case CS_DEST_TEMPLE_OF_TIME_ZELDA_REVEAL:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF9;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 40:
+
+ case CS_DEST_TEMPLE_OF_TIME_GET_LIGHT_ARROWS:
play->linkAgeOnLoad = LINK_AGE_ADULT;
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFFA;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 41:
+
+ case CS_DEST_LAKE_HYLIA_FROM_LAKE_RESTORED:
play->nextEntranceIndex = ENTR_LAKE_HYLIA_5;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 42:
+
+ case CS_DEST_KAKARIKO_VILLAGE_DRAIN_WELL:
play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 43:
+
+ case CS_DEST_WINDMILL_FROM_WELL_DRAINED:
play->nextEntranceIndex = ENTR_WINDMILL_AND_DAMPES_GRAVE_2;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 44:
+
+ case CS_DEST_TEMPLE_OF_TIME_FROM_ALL_STONES_RESTORED:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_3;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE_INSTANT;
break;
- case 46:
+
+ case CS_DEST_TEMPLE_OF_TIME_AFTER_LIGHT_MEDALLION_ALT:
SET_EVENTCHKINF(EVENTCHKINF_4F);
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_4;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 47:
+
+ case CS_DEST_KAKARIKO_VILLAGE_NOCTURNE_PART_2:
Item_Give(play, ITEM_SONG_NOCTURNE);
SET_EVENTCHKINF(EVENTCHKINF_54);
play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_0;
@@ -792,40 +899,47 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 48:
+
+ case CS_DEST_DESERT_COLOSSUS_FROM_REQUIEM:
play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_4;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_SANDSTORM_END;
gSaveContext.nextTransitionType = TRANS_TYPE_SANDSTORM_END;
break;
- case 49:
+
+ case CS_DEST_TEMPLE_OF_TIME_FROM_LIGHT_ARROWS:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_5;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
break;
- case 50:
+
+ case CS_DEST_KAKARIKO_VILLAGE_FROM_NOCTURNE:
play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_13;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE_INSTANT;
break;
- case 51:
+
+ case CS_DEST_HYRULE_FIELD_FROM_ZELDAS_COURTYARD:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_0;
gSaveContext.cutsceneIndex = 0xFFF8;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_CIRCLE(TCA_NORMAL, TCC_WHITE, TCS_SLOW);
break;
- case 52:
+
+ case CS_DEST_TEMPLE_OF_TIME_SONG_OF_TIME:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
gSaveContext.cutsceneIndex = 0xFFF7;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_INSTANT;
break;
- case 53:
+
+ case CS_DEST_HYRULE_FIELD_FROM_SONG_OF_TIME:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_16;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 54:
+
+ case CS_DEST_GERUDO_VALLEY_CREDITS:
gSaveContext.gameMode = GAMEMODE_END_CREDITS;
Audio_SetSfxBanksMute(0x6F);
play->linkAgeOnLoad = LINK_AGE_CHILD;
@@ -834,103 +948,120 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 55:
+
+ case CS_DEST_GERUDO_FORTRESS_CREDITS:
play->nextEntranceIndex = ENTR_GERUDOS_FORTRESS_0;
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 56:
+
+ case CS_DEST_KAKARIKO_VILLAGE_CREDITS:
play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_0;
gSaveContext.cutsceneIndex = 0xFFF4;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 57:
+
+ case CS_DEST_DEATH_MOUNTAIN_TRAIL_CREDITS_PART_1:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0;
gSaveContext.cutsceneIndex = 0xFFF3;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 58:
+
+ case CS_DEST_GORON_CITY_CREDITS:
play->nextEntranceIndex = ENTR_GORON_CITY_0;
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 59:
+
+ case CS_DEST_LAKE_HYLIA_CREDITS:
play->nextEntranceIndex = ENTR_LAKE_HYLIA_0;
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 60:
+
+ case CS_DEST_ZORAS_FOUNTAIN_CREDITS:
play->nextEntranceIndex = ENTR_ZORAS_FOUNTAIN_0;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 61:
+
+ case CS_DEST_ZORAS_DOMAIN_CREDITS:
play->nextEntranceIndex = ENTR_ZORAS_DOMAIN_0;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 62:
+
+ case CS_DEST_KOKIRI_FOREST_CREDITS_PART_1:
play->linkAgeOnLoad = LINK_AGE_ADULT;
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0;
gSaveContext.cutsceneIndex = 0xFFF6;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 63:
+
+ case CS_DEST_KOKIRI_FOREST_CREDITS_PART_2:
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0;
gSaveContext.cutsceneIndex = 0xFFF7;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 64:
+
+ case CS_DEST_HYRULE_FIELD_CREDITS:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_0;
gSaveContext.cutsceneIndex = 0xFFF5;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 65:
+
+ case CS_DEST_LON_LON_RANCH_CREDITS_PART_1_ALT:
play->linkAgeOnLoad = LINK_AGE_CHILD;
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 66:
+
+ case CS_DEST_KAKARIKO_VILLAGE_FROM_TRAIL_OWL:
play->nextEntranceIndex = ENTR_KAKARIKO_VILLAGE_14;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 67:
+
+ case CS_DEST_HYRULE_FIELD_FROM_LAKE_HYLIA_OWL:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_9;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 68:
+
+ case CS_DEST_CUTSCENE_MAP_DEKU_SPROUT_PART_2:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF5;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 69:
+
+ case CS_DEST_KOKIRI_FOREST_DEKU_SPROUT_PART_3:
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_12;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 70:
+
+ case CS_DEST_DEATH_MOUNTAIN_TRAIL_CREDITS_PART_2:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF4;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 71:
+
+ case CS_DEST_TEMPLE_OF_TIME_CREDITS:
gSaveContext.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4);
Player_SetEquipmentData(play, player);
gSaveContext.equips.equipment |= EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4);
@@ -941,79 +1072,94 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 72:
+
+ case CS_DEST_ZELDAS_COURTYARD_CREDITS:
play->nextEntranceIndex = ENTR_CASTLE_COURTYARD_ZELDA_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF0;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 73:
+
+ case CS_DEST_LON_LON_RANCH_CREDITS_PART_1:
play->linkAgeOnLoad = LINK_AGE_CHILD;
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 74:
+
+ case CS_DEST_LON_LON_RANCH_CREDITS_PART_2:
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF3;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 75:
+
+ case CS_DEST_LON_LON_RANCH_CREDITS_PART_3:
play->linkAgeOnLoad = LINK_AGE_CHILD;
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF4;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 76:
+
+ case CS_DEST_LON_LON_RANCH_CREDITS_PART_4:
play->linkAgeOnLoad = LINK_AGE_ADULT;
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF5;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 77:
+
+ case CS_DEST_LON_LON_RANCH_CREDITS_PART_5:
play->linkAgeOnLoad = LINK_AGE_CHILD;
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF6;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 78:
+
+ case CS_DEST_LON_LON_RANCH_CREDITS_PART_6:
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF7;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 79:
- case 80:
- case 81:
- case 82:
- case 83:
- case 84:
- case 85:
- case 86:
- case 87:
- case 88:
- case 89:
- case 90:
- case 91:
- case 92:
- case 93:
+
+ case CS_DEST_LON_LON_RANCH_1:
+ case CS_DEST_LON_LON_RANCH_2:
+ case CS_DEST_LON_LON_RANCH_3:
+ case CS_DEST_LON_LON_RANCH_4:
+ case CS_DEST_LON_LON_RANCH_5:
+ case CS_DEST_LON_LON_RANCH_6:
+ case CS_DEST_LON_LON_RANCH_7:
+ case CS_DEST_LON_LON_RANCH_8:
+ case CS_DEST_LON_LON_RANCH_9:
+ case CS_DEST_LON_LON_RANCH_10:
+ case CS_DEST_LON_LON_RANCH_11:
+ case CS_DEST_LON_LON_RANCH_12:
+ case CS_DEST_LON_LON_RANCH_13:
+ case CS_DEST_LON_LON_RANCH_14:
+ case CS_DEST_LON_LON_RANCH_15:
play->nextEntranceIndex = ENTR_LON_LON_RANCH_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 94:
+
+ case CS_DEST_LON_LON_RANCH_FROM_EPONAS_SONG:
play->nextEntranceIndex = ENTR_LON_LON_RANCH_1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 95:
+
+ case CS_DEST_STONES_RESTORED_CONDITIONAL:
+ // At one point in development, Forest, Fire and Water temples blocked the ability to return to child.
+ // Completing each dungeon would "restore" their respective stone, with the Door of Time opening after
+ // all 3 are restored. This cutscene destination sends the player to the correct blue warp destination,
+ // unless all 3 dungeons have been cleared. In that case, the destination is the Temple of Time which
+ // plays a cutscene where the door opens.
if (GET_EVENTCHKINF(EVENTCHKINF_48) && GET_EVENTCHKINF(EVENTCHKINF_49) &&
GET_EVENTCHKINF(EVENTCHKINF_4A)) {
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_0;
@@ -1027,11 +1173,13 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
+
case 9:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_0;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
+
case 10:
play->nextEntranceIndex = ENTR_LAKE_HYLIA_0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -1041,7 +1189,8 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
}
}
break;
- case 96:
+
+ case CS_DEST_DESERT_COLOSSUS_FROM_CHAMBER_OF_SAGES:
if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) {
play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -1055,7 +1204,8 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
}
break;
- case 97:
+
+ case CS_DEST_GRAVEYARD_FROM_CHAMBER_OF_SAGES:
if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) {
play->nextEntranceIndex = ENTR_CHAMBER_OF_THE_SAGES_0;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -1068,133 +1218,154 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
}
break;
- case 98:
+
+ case CS_DEST_DEATH_MOUNTAIN_CRATER_FROM_CHAMBER_OF_SAGES:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_5;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 99:
+
+ case CS_DEST_SACRED_FOREST_MEADOW_WARP_PAD:
play->nextEntranceIndex = ENTR_SACRED_FOREST_MEADOW_3;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 100:
+
+ case CS_DEST_KOKIRI_FOREST_FROM_CHAMBER_OF_SAGES:
play->nextEntranceIndex = ENTR_KOKIRI_FOREST_0;
gSaveContext.cutsceneIndex = 0xFFF8;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 101:
+
+ case CS_DEST_DESERT_COLOSSUS_FROM_NABOORU_CAPTURE:
play->nextEntranceIndex = ENTR_DESERT_COLOSSUS_6;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_SANDSTORM_END;
break;
- case 102:
+
+ case CS_DEST_TEMPLE_OF_TIME_FRONT_OF_PEDESTAL:
play->nextEntranceIndex = ENTR_TEMPLE_OF_TIME_6;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 103:
+
+ case CS_DEST_HYRULE_FIELD_TITLE_SCREEN:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF3;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 104:
- switch (sTitleCsState) {
- case 0:
+
+ case CS_DEST_TITLE_SCREEN_DEMO:
+ switch (sTitleDemoDestination) {
+ case TITLE_DEMO_SPIRIT_TEMPLE:
play->nextEntranceIndex = ENTR_SPIRIT_TEMPLE_BOSS_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF2;
play->transitionType = TRANS_TYPE_FADE_BLACK;
- sTitleCsState++;
+ sTitleDemoDestination++;
break;
- case 1:
+
+ case TITLE_DEMO_DEATH_MOUNTAIN_CRATER:
play->nextEntranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionType = TRANS_TYPE_FADE_BLACK;
- sTitleCsState++;
+ sTitleDemoDestination++;
break;
- case 2:
+
+ case TITLE_DEMO_GANONDORF_HORSE:
play->nextEntranceIndex = ENTR_CUTSCENE_MAP_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF6;
play->transitionType = TRANS_TYPE_FADE_BLACK;
- sTitleCsState = 0;
+ sTitleDemoDestination = TITLE_DEMO_SPIRIT_TEMPLE;
break;
}
break;
- case 105:
+
+ case CS_DEST_GRAVEYARD_SUNS_SONG_PART_2:
play->nextEntranceIndex = ENTR_GRAVEYARD_0;
play->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.cutsceneIndex = 0xFFF1;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 106:
+
+ case CS_DEST_ROYAL_FAMILYS_TOMB_SUNS_SONG_PART_3:
play->nextEntranceIndex = ENTR_ROYAL_FAMILYS_TOMB_1;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 107:
+
+ case CS_DEST_GANONS_CASTLE_DISPEL_FOREST_BEAM:
play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_2;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 108:
+
+ case CS_DEST_GANONS_CASTLE_DISPEL_WATER_BEAM:
play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_3;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 109:
+
+ case CS_DEST_GANONS_CASTLE_DISPEL_SHADOW_BEAM:
play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_4;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 110:
+
+ case CS_DEST_GANONS_CASTLE_DISPEL_FIRE_BEAM:
play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_5;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 111:
+
+ case CS_DEST_GANONS_CASTLE_DISPEL_LIGHT_BEAM:
play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_6;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 112:
+
+ case CS_DEST_GANONS_CASTLE_DISPEL_SPIRIT_BEAM:
play->nextEntranceIndex = ENTR_INSIDE_GANONS_CASTLE_7;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 113:
+
+ case CS_DEST_GANONS_CASTLE_DISPEL_BARRIER_CONDITONAL:
if (Flags_GetEventChkInf(EVENTCHKINF_BB) && Flags_GetEventChkInf(EVENTCHKINF_BC) &&
Flags_GetEventChkInf(EVENTCHKINF_BD) && Flags_GetEventChkInf(EVENTCHKINF_BE) &&
Flags_GetEventChkInf(EVENTCHKINF_BF) && Flags_GetEventChkInf(EVENTCHKINF_AD)) {
- play->csCtx.segment = SEGMENTED_TO_VIRTUAL(gTowerBarrierCs);
- play->csCtx.frames = 0;
+ play->csCtx.script = SEGMENTED_TO_VIRTUAL(gTowerBarrierCs);
+ play->csCtx.curFrame = 0;
gSaveContext.cutsceneTrigger = 1;
gSaveContext.cutsceneIndex = 0xFFFF;
- csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
+ csCtx->state = CS_STATE_STOP;
} else {
gSaveContext.cutsceneIndex = 0xFFFF;
- csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
+ csCtx->state = CS_STATE_STOP;
}
break;
- case 114:
+
+ case CS_DEST_HYRULE_FIELD_FROM_FAIRY_OCARINA:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_3;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 115:
+
+ case CS_DEST_HYRULE_FIELD_FROM_IMPA_ESCORT:
play->nextEntranceIndex = ENTR_HYRULE_FIELD_17;
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_BLACK;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 116:
+
+ case CS_DEST_FROM_RAURU_FINAL_MESSAGE_CONDITIONAL:
if (GET_EVENTCHKINF(EVENTCHKINF_C8)) {
play->nextEntranceIndex = ENTR_GRAVEYARD_8;
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -1204,9 +1375,11 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
}
+
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 117:
+
+ case CS_DEST_HYRULE_FIELD_CREDITS_SKY:
gSaveContext.gameMode = GAMEMODE_END_CREDITS;
Audio_SetSfxBanksMute(0x6F);
play->linkAgeOnLoad = LINK_AGE_ADULT;
@@ -1215,13 +1388,15 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
play->transitionTrigger = TRANS_TRIGGER_START;
play->transitionType = TRANS_TYPE_FADE_WHITE;
break;
- case 118:
+
+ case CS_DEST_GANON_BATTLE_TOWER_COLLAPSE:
gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = ENTR_GANON_BOSS_0;
Play_TriggerVoidOut(play);
gSaveContext.respawnFlag = -2;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
break;
- case 119:
+
+ case CS_DEST_ZELDAS_COURTYARD_RECEIVE_LETTER:
gSaveContext.dayTime = CLOCK_TIME(12, 0);
gSaveContext.skyboxTime = CLOCK_TIME(12, 0);
play->nextEntranceIndex = ENTR_CASTLE_COURTYARD_ZELDA_1;
@@ -1232,684 +1407,787 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
}
}
-// Command 0x2D: Transition Effects
-void Cutscene_Command_TransitionFX(PlayState* play, CutsceneContext* csCtx, CsCmdBase* cmd) {
- f32 temp;
+void CutsceneCmd_Transition(PlayState* play, CutsceneContext* csCtx, CsCmdTransition* cmd) {
+ f32 lerp;
- if ((csCtx->frames >= cmd->startFrame) && (csCtx->frames <= cmd->endFrame)) {
+ if ((csCtx->curFrame >= cmd->startFrame) && (csCtx->curFrame <= cmd->endFrame)) {
play->envCtx.fillScreen = true;
- temp = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->frames);
+ lerp = Environment_LerpWeight(cmd->endFrame, cmd->startFrame, csCtx->curFrame);
- switch (cmd->base) {
- case 1:
- case 5:
+ switch (cmd->type) {
+ case CS_TRANS_GRAY_FILL_IN:
+ case CS_TRANS_GRAY_FILL_OUT:
play->envCtx.screenFillColor[0] = 160;
play->envCtx.screenFillColor[1] = 160;
play->envCtx.screenFillColor[2] = 160;
- if (cmd->base == 1) {
- play->envCtx.screenFillColor[3] = 255.0f * temp;
- if ((temp == 0.0f) && (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0)) {
+
+ if (cmd->type == CS_TRANS_GRAY_FILL_IN) {
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
+
+ if ((lerp == 0.0f) && (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0)) {
Audio_PlaySfxGeneral(NA_SE_SY_WHITE_OUT_S, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
- } else if ((temp == 0.0f) &&
+ } else if ((lerp == 0.0f) &&
((gSaveContext.entranceIndex == ENTR_TEMPLE_OF_TIME_0) ||
(gSaveContext.entranceIndex == ENTR_HYRULE_CASTLE_0) ||
(gSaveContext.entranceIndex == ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_0))) {
Audio_PlaySfxGeneral(NA_SE_EV_WHITE_OUT, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
- } else if ((temp == 0.0f) && (play->sceneId == SCENE_INSIDE_GANONS_CASTLE)) {
+ } else if ((lerp == 0.0f) && (play->sceneId == SCENE_INSIDE_GANONS_CASTLE)) {
func_800788CC(NA_SE_EV_WHITE_OUT);
}
} else {
- play->envCtx.screenFillColor[3] = (1.0f - temp) * 255.0f;
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
}
break;
- case 2:
- case 6:
+ case CS_TRANS_BLUE_FILL_IN:
+ case CS_TRANS_BLUE_FILL_OUT:
play->envCtx.screenFillColor[0] = 0;
play->envCtx.screenFillColor[1] = 0;
play->envCtx.screenFillColor[2] = 255;
- if (cmd->base == 2) {
- play->envCtx.screenFillColor[3] = 255.0f * temp;
+
+ if (cmd->type == CS_TRANS_BLUE_FILL_IN) {
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
} else {
- play->envCtx.screenFillColor[3] = (1.0f - temp) * 255.0f;
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
}
break;
- case 3:
- case 7:
+ case CS_TRANS_RED_FILL_OUT:
+ case CS_TRANS_RED_FILL_IN:
play->envCtx.screenFillColor[0] = 255;
play->envCtx.screenFillColor[1] = 0;
play->envCtx.screenFillColor[2] = 0;
- if (cmd->base == 3) {
- play->envCtx.screenFillColor[3] = (1.0f - temp) * 255.0f;
+
+ if (cmd->type == CS_TRANS_RED_FILL_OUT) {
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
} else {
- play->envCtx.screenFillColor[3] = 255.0f * temp;
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
}
break;
- case 4:
- case 8:
+ case CS_TRANS_GREEN_FILL_OUT:
+ case CS_TRANS_GREEN_FILL_IN:
play->envCtx.screenFillColor[0] = 0;
play->envCtx.screenFillColor[1] = 255;
play->envCtx.screenFillColor[2] = 0;
- if (cmd->base == 4) {
- play->envCtx.screenFillColor[3] = (1.0f - temp) * 255.0f;
+
+ if (cmd->type == CS_TRANS_GREEN_FILL_OUT) {
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
} else {
- play->envCtx.screenFillColor[3] = 255.0f * temp;
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
}
break;
- case 9:
+ case CS_TRANS_TRIGGER_INSTANCE:
gSaveContext.cutsceneTransitionControl = 1;
break;
- case 10:
- case 11:
+ case CS_TRANS_BLACK_FILL_OUT:
+ case CS_TRANS_BLACK_FILL_IN:
play->envCtx.screenFillColor[0] = 0;
play->envCtx.screenFillColor[1] = 0;
play->envCtx.screenFillColor[2] = 0;
- if (cmd->base == 10) {
- play->envCtx.screenFillColor[3] = (1.0f - temp) * 255.0f;
+
+ if (cmd->type == CS_TRANS_BLACK_FILL_OUT) {
+ play->envCtx.screenFillColor[3] = (1.0f - lerp) * 255.0f;
} else {
- play->envCtx.screenFillColor[3] = 255.0f * temp;
+ play->envCtx.screenFillColor[3] = 255.0f * lerp;
}
break;
- case 12:
- gSaveContext.cutsceneTransitionControl = 255.0f - (155.0f * temp);
+ case CS_TRANS_BLACK_FILL_OUT_TO_HALF:
+ gSaveContext.cutsceneTransitionControl = 255.0f - (155.0f * lerp);
break;
- case 13:
+ case CS_TRANS_BLACK_FILL_IN_FROM_HALF:
play->envCtx.screenFillColor[0] = 0;
play->envCtx.screenFillColor[1] = 0;
play->envCtx.screenFillColor[2] = 0;
- play->envCtx.screenFillColor[3] = 255.0f - ((1.0f - temp) * 155.0f);
+ play->envCtx.screenFillColor[3] = 255.0f - ((1.0f - lerp) * 155.0f);
break;
}
}
}
-// Command 0x1 & 0x5: Camera Eye Points
-s32 Cutscene_Command_CameraEyePoints(PlayState* play, CutsceneContext* csCtx, u8* cmd, u8 relativeToLink) {
- s32 shouldContinue = 1;
- CsCmdBase* cmdBase = (CsCmdBase*)cmd;
+s32 CutsceneCmd_UpdateCamEyeSpline(PlayState* play, CutsceneContext* csCtx, u8* script, u8 relativeToPlayer) {
+ s32 shouldContinue = true;
+ CsCmdCam* cmd = (CsCmdCam*)script;
s32 size;
- cmd += 8;
- size = 8;
+ script += sizeof(CsCmdCam);
+ size = sizeof(CsCmdCam);
+
+ if ((csCtx->curFrame > cmd->startFrame) && (csCtx->curFrame < cmd->endFrame) &&
+ ((cmd->startFrame > csCtx->camEyeSplinePointsAppliedFrame) ||
+ (csCtx->camEyeSplinePointsAppliedFrame >= 0xF000))) {
+ csCtx->camEyeReady = true;
+ csCtx->camEyePoints = (CutsceneCameraPoint*)script;
- if ((cmdBase->startFrame < csCtx->frames) && (csCtx->frames < cmdBase->endFrame) &&
- ((csCtx->unk_18 < cmdBase->startFrame) || (csCtx->unk_18 >= 0xF000))) {
- csCtx->unk_1B = 1;
- csCtx->subCamEyePoints = (CutsceneCameraPoint*)cmd;
- if (csCtx->unk_1A != 0) {
- csCtx->unk_18 = cmdBase->startFrame;
- if (D_8015FCC8 != 0) {
+ if (csCtx->camAtReady) {
+ csCtx->camEyeSplinePointsAppliedFrame = cmd->startFrame;
+
+ if (gUseCutsceneCam) {
Play_ChangeCameraSetting(play, csCtx->subCamId, CAM_SET_CS_0);
Play_ChangeCameraStatus(play, sReturnToCamId, CAM_STAT_WAIT);
Play_ChangeCameraStatus(play, csCtx->subCamId, CAM_STAT_ACTIVE);
Camera_ResetAnim(Play_GetCamera(play, csCtx->subCamId));
- Camera_SetCSParams(Play_GetCamera(play, csCtx->subCamId), csCtx->subCamLookAtPoints,
- csCtx->subCamEyePoints, GET_PLAYER(play), relativeToLink);
+ Camera_SetCSParams(Play_GetCamera(play, csCtx->subCamId), csCtx->camAtPoints, csCtx->camEyePoints,
+ GET_PLAYER(play), relativeToPlayer);
}
}
}
while (shouldContinue) {
- if (((CutsceneCameraPoint*)cmd)->continueFlag == CS_CMD_STOP) {
- shouldContinue = 0;
+ if (((CutsceneCameraPoint*)script)->continueFlag == CS_CAM_STOP) {
+ shouldContinue = false;
}
- cmd += 0x10;
- size += 0x10;
+
+ script += sizeof(CutsceneCameraPoint);
+ size += sizeof(CutsceneCameraPoint);
}
return size;
}
-// Command 0x2 & 0x6: Camera At Points
-s32 Cutscene_Command_CameraLookAtPoints(PlayState* play, CutsceneContext* csCtx, u8* cmd, u8 relativeToLink) {
- s32 shouldContinue = 1;
- CsCmdBase* cmdBase = (CsCmdBase*)cmd;
+s32 CutsceneCmd_UpdateCamAtSpline(PlayState* play, CutsceneContext* csCtx, u8* script, u8 relativeToPlayer) {
+ s32 shouldContinue = true;
+ CsCmdCam* cmd = (CsCmdCam*)script;
s32 size;
- cmd += 8;
- size = 8;
+ script += sizeof(CsCmdCam);
+ size = sizeof(CsCmdCam);
+
+ if ((csCtx->curFrame > cmd->startFrame) && (csCtx->curFrame < cmd->endFrame) &&
+ ((cmd->startFrame > gCamAtSplinePointsAppliedFrame) || (gCamAtSplinePointsAppliedFrame >= 0xF000))) {
+ csCtx->camAtReady = true;
+ csCtx->camAtPoints = (CutsceneCameraPoint*)script;
+
+ if (csCtx->camEyeReady) {
+ gCamAtSplinePointsAppliedFrame = cmd->startFrame;
- if ((cmdBase->startFrame < csCtx->frames) && (csCtx->frames < cmdBase->endFrame) &&
- ((D_8015FCC0 < cmdBase->startFrame) || (D_8015FCC0 >= 0xF000))) {
- csCtx->unk_1A = 1;
- csCtx->subCamLookAtPoints = (CutsceneCameraPoint*)cmd;
- if (csCtx->unk_1B != 0) {
- D_8015FCC0 = cmdBase->startFrame;
- if (D_8015FCC8 != 0) {
+ if (gUseCutsceneCam) {
Play_ChangeCameraSetting(play, csCtx->subCamId, CAM_SET_CS_0);
Play_ChangeCameraStatus(play, sReturnToCamId, CAM_STAT_WAIT);
Play_ChangeCameraStatus(play, csCtx->subCamId, CAM_STAT_ACTIVE);
Camera_ResetAnim(Play_GetCamera(play, csCtx->subCamId));
- Camera_SetCSParams(Play_GetCamera(play, csCtx->subCamId), csCtx->subCamLookAtPoints,
- csCtx->subCamEyePoints, GET_PLAYER(play), relativeToLink);
+ Camera_SetCSParams(Play_GetCamera(play, csCtx->subCamId), csCtx->camAtPoints, csCtx->camEyePoints,
+ GET_PLAYER(play), relativeToPlayer);
}
}
}
while (shouldContinue) {
- if (((CutsceneCameraPoint*)cmd)->continueFlag == CS_CMD_STOP) {
- shouldContinue = 0;
+ if (((CutsceneCameraPoint*)script)->continueFlag == CS_CAM_STOP) {
+ shouldContinue = false;
}
- cmd += 0x10;
- size += 0x10;
+
+ script += sizeof(CutsceneCameraPoint);
+ size += sizeof(CutsceneCameraPoint);
}
return size;
}
-// Command 0x7: ? (Related to camera positons)
-s32 Cutscene_Command_07(PlayState* play, CutsceneContext* csCtx, u8* cmd, u8 unused) {
- CsCmdBase* cmdBase = (CsCmdBase*)cmd;
+s32 CutsceneCmd_SetCamEye(PlayState* play, CutsceneContext* csCtx, u8* script, u8 unused) {
+ CsCmdCam* cmd = (CsCmdCam*)script;
s32 size;
- Vec3f sp3C;
- Vec3f sp30;
+ Vec3f at;
+ Vec3f eye;
Camera* subCam;
- f32 sp28;
-
- cmd += 8;
- size = 8;
-
- if ((cmdBase->startFrame < csCtx->frames) && (csCtx->frames < cmdBase->endFrame) &&
- ((D_8015FCC2 < cmdBase->startFrame) || (D_8015FCC2 >= 0xF000))) {
- csCtx->unk_1B = 1;
- csCtx->subCamEyePoints = (CutsceneCameraPoint*)cmd;
- if (csCtx->unk_1A != 0) {
- D_8015FCC2 = cmdBase->startFrame;
- if (D_8015FCC8 != 0) {
+ f32 roll;
+
+ script += sizeof(CsCmdCam);
+ size = sizeof(CsCmdCam);
+
+ if ((csCtx->curFrame > cmd->startFrame) && (csCtx->curFrame < cmd->endFrame) &&
+ ((cmd->startFrame > gCamEyePointAppliedFrame) || (gCamEyePointAppliedFrame >= 0xF000))) {
+ csCtx->camEyeReady = true;
+ csCtx->camEyePoints = (CutsceneCameraPoint*)script;
+
+ if (csCtx->camAtReady) {
+ gCamEyePointAppliedFrame = cmd->startFrame;
+
+ if (gUseCutsceneCam) {
subCam = Play_GetCamera(play, csCtx->subCamId);
subCam->player = NULL;
+
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STAT_WAIT);
Play_ChangeCameraStatus(play, csCtx->subCamId, CAM_STAT_ACTIVE);
Play_ChangeCameraSetting(play, csCtx->subCamId, CAM_SET_FREE0);
- sp28 = csCtx->subCamLookAtPoints->cameraRoll * 1.40625f;
- Camera_SetViewParam(subCam, CAM_VIEW_ROLL, &sp28);
- sp3C.x = csCtx->subCamLookAtPoints->pos.x;
- sp3C.y = csCtx->subCamLookAtPoints->pos.y;
- sp3C.z = csCtx->subCamLookAtPoints->pos.z;
- sp30.x = csCtx->subCamEyePoints->pos.x;
- sp30.y = csCtx->subCamEyePoints->pos.y;
- sp30.z = csCtx->subCamEyePoints->pos.z;
- Play_SetCameraAtEye(play, csCtx->subCamId, &sp3C, &sp30);
- Play_SetCameraFov(play, csCtx->subCamId, csCtx->subCamEyePoints->viewAngle);
+
+ roll = csCtx->camAtPoints->cameraRoll * 1.40625f;
+ Camera_SetViewParam(subCam, CAM_VIEW_ROLL, &roll);
+
+ at.x = csCtx->camAtPoints->pos.x;
+ at.y = csCtx->camAtPoints->pos.y;
+ at.z = csCtx->camAtPoints->pos.z;
+
+ eye.x = csCtx->camEyePoints->pos.x;
+ eye.y = csCtx->camEyePoints->pos.y;
+ eye.z = csCtx->camEyePoints->pos.z;
+
+ Play_SetCameraAtEye(play, csCtx->subCamId, &at, &eye);
+ Play_SetCameraFov(play, csCtx->subCamId, csCtx->camEyePoints->viewAngle);
}
}
}
- size += 0x10;
+ size += sizeof(CutsceneCameraPoint);
return size;
}
-// Command 0x8: ? (Related to camera focus points)
-s32 Cutscene_Command_08(PlayState* play, CutsceneContext* csCtx, u8* cmd, u8 unused) {
- CsCmdBase* cmdBase = (CsCmdBase*)cmd;
+s32 CutsceneCmd_SetCamAt(PlayState* play, CutsceneContext* csCtx, u8* script, u8 unused) {
+ CsCmdCam* cmd = (CsCmdCam*)script;
s32 size;
- Vec3f sp3C;
- Vec3f sp30;
+ Vec3f at;
+ Vec3f eye;
Camera* subCam;
- f32 sp28;
-
- cmd += 8;
- size = 8;
-
- if ((cmdBase->startFrame < csCtx->frames) && (csCtx->frames < cmdBase->endFrame) &&
- ((D_8015FCC4 < cmdBase->startFrame) || (D_8015FCC4 >= 0xF000))) {
- csCtx->unk_1A = 1;
- csCtx->subCamLookAtPoints = (CutsceneCameraPoint*)cmd;
- if (csCtx->unk_1B != 0) {
- D_8015FCC4 = cmdBase->startFrame;
- if (D_8015FCC8 != 0) {
+
+ script += sizeof(CsCmdCam);
+ size = sizeof(CsCmdCam);
+
+ if ((csCtx->curFrame > cmd->startFrame) && (csCtx->curFrame < cmd->endFrame) &&
+ ((cmd->startFrame > gCamAtPointAppliedFrame) || (gCamAtPointAppliedFrame >= 0xF000))) {
+ csCtx->camAtReady = true;
+ csCtx->camAtPoints = (CutsceneCameraPoint*)script;
+
+ if (csCtx->camEyeReady) {
+ gCamAtPointAppliedFrame = cmd->startFrame;
+
+ if (gUseCutsceneCam) {
subCam = Play_GetCamera(play, csCtx->subCamId);
subCam->player = NULL;
+
Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STAT_WAIT);
Play_ChangeCameraStatus(play, csCtx->subCamId, CAM_STAT_ACTIVE);
Play_ChangeCameraSetting(play, csCtx->subCamId, CAM_SET_FREE0);
- sp3C.x = csCtx->subCamLookAtPoints->pos.x;
- sp3C.y = csCtx->subCamLookAtPoints->pos.y;
- sp3C.z = csCtx->subCamLookAtPoints->pos.z;
- sp30.x = csCtx->subCamEyePoints->pos.x;
- sp30.y = csCtx->subCamEyePoints->pos.y;
- sp30.z = csCtx->subCamEyePoints->pos.z;
- Play_SetCameraAtEye(play, csCtx->subCamId, &sp3C, &sp30);
- Play_SetCameraFov(play, csCtx->subCamId, csCtx->subCamEyePoints->viewAngle);
+
+ at.x = csCtx->camAtPoints->pos.x;
+ at.y = csCtx->camAtPoints->pos.y;
+ at.z = csCtx->camAtPoints->pos.z;
+
+ eye.x = csCtx->camEyePoints->pos.x;
+ eye.y = csCtx->camEyePoints->pos.y;
+ eye.z = csCtx->camEyePoints->pos.z;
+
+ Play_SetCameraAtEye(play, csCtx->subCamId, &at, &eye);
+ Play_SetCameraFov(play, csCtx->subCamId, csCtx->camEyePoints->viewAngle);
}
}
}
- size += 0x10;
+ size += sizeof(CutsceneCameraPoint);
return size;
}
-// Command 0x13: Textbox
-void Cutscene_Command_Textbox(PlayState* play, CutsceneContext* csCtx, CsCmdTextbox* cmd) {
+void CutsceneCmd_Text(PlayState* play, CutsceneContext* csCtx, CsCmdText* cmd) {
u8 dialogState;
- s16 originalCsFrames;
-
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- if (cmd->type != 2) {
- if (D_8011E1C0 != cmd->base) {
- D_8011E1C0 = cmd->base;
- if ((cmd->type == 3) && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)) {
- Message_StartTextbox(play, cmd->textId1, NULL);
- } else if ((cmd->type == 4) && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) {
- Message_StartTextbox(play, cmd->textId1, NULL);
+ s16 endFrame;
+
+ if ((csCtx->curFrame > cmd->startFrame) && (csCtx->curFrame <= cmd->endFrame)) {
+ if (cmd->type != CS_TEXT_OCARINA_ACTION) {
+ if (sCurTextId != cmd->textId) {
+ sCurTextId = cmd->textId;
+
+ if ((cmd->type == CS_TEXT_GORON_RUBY) && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)) {
+ Message_StartTextbox(play, cmd->altTextId1, NULL);
+ } else if ((cmd->type == CS_TEXT_ZORA_SAPPHIRE) && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) {
+ Message_StartTextbox(play, cmd->altTextId1, NULL);
} else {
- Message_StartTextbox(play, cmd->base, NULL);
+ Message_StartTextbox(play, cmd->textId, NULL);
}
return;
}
} else {
- if (D_8011E1C4 != cmd->base) {
- D_8011E1C4 = cmd->base;
- Message_StartOcarina(play, cmd->base);
+ if (sCurOcarinaAction != cmd->textId) {
+ sCurOcarinaAction = cmd->textId;
+ Message_StartOcarina(play, cmd->textId);
return;
}
}
- if (csCtx->frames >= cmd->endFrame) {
- originalCsFrames = csCtx->frames;
+ if (csCtx->curFrame >= cmd->endFrame) {
+ endFrame = csCtx->curFrame;
dialogState = Message_GetState(&play->msgCtx);
if ((dialogState != TEXT_STATE_CLOSING) && (dialogState != TEXT_STATE_NONE) &&
(dialogState != TEXT_STATE_SONG_DEMO_DONE) && (dialogState != TEXT_STATE_8)) {
- csCtx->frames--;
+ csCtx->curFrame--;
if ((dialogState == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
if (play->msgCtx.choiceIndex == 0) {
- if (cmd->textId1 != 0xFFFF) {
- Message_ContinueTextbox(play, cmd->textId1);
+ if (cmd->altTextId1 != CS_TEXT_ID_NONE) {
+ Message_ContinueTextbox(play, cmd->altTextId1);
} else {
- csCtx->frames++;
+ csCtx->curFrame++;
}
} else {
- if (cmd->textId2 != 0xFFFF) {
- Message_ContinueTextbox(play, cmd->textId2);
+ if (cmd->altTextId2 != CS_TEXT_ID_NONE) {
+ Message_ContinueTextbox(play, cmd->altTextId2);
} else {
- csCtx->frames++;
+ csCtx->curFrame++;
}
}
}
if (dialogState == TEXT_STATE_9) {
- if (cmd->textId1 != 0xFFFF) {
- Message_ContinueTextbox(play, cmd->textId1);
+ if (cmd->altTextId1 != CS_TEXT_ID_NONE) {
+ Message_ContinueTextbox(play, cmd->altTextId1);
} else {
- csCtx->frames++;
+ csCtx->curFrame++;
}
}
if (dialogState == TEXT_STATE_EVENT) {
if (Message_ShouldAdvance(play)) {
- Message_StartOcarina(play, cmd->base);
+ Message_StartOcarina(play, cmd->textId);
}
}
}
- if (csCtx->frames == originalCsFrames) {
+ if (csCtx->curFrame == endFrame) {
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_NOTHING);
- D_8011E1C0 = 0;
- D_8011E1C4 = 0;
+ sCurTextId = 0;
+ sCurOcarinaAction = 0;
}
}
}
}
-void Cutscene_ProcessCommands(PlayState* play, CutsceneContext* csCtx, u8* cutscenePtr) {
+void Cutscene_ProcessScript(PlayState* play, CutsceneContext* csCtx, u8* script) {
s16 i;
s32 totalEntries;
s32 cmdType;
s32 cmdEntries;
- CsCmdBase* cmd;
- s32 cutsceneEndFrame;
+ void* cmd;
+ s32 csFrameCount;
s16 j;
- MemCpy(&totalEntries, cutscenePtr, 4);
- cutscenePtr += 4;
- MemCpy(&cutsceneEndFrame, cutscenePtr, 4);
- cutscenePtr += 4;
+ MemCpy(&totalEntries, script, sizeof(totalEntries));
+ script += sizeof(totalEntries);
+
+ MemCpy(&csFrameCount, script, sizeof(csFrameCount));
+ script += sizeof(csFrameCount);
- if ((cutsceneEndFrame < csCtx->frames) && (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC)) {
- csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
+ if ((csCtx->curFrame > csFrameCount) && (csCtx->state != CS_STATE_RUN_UNSTOPPABLE)) {
+ csCtx->state = CS_STATE_STOP;
return;
}
if (CHECK_BTN_ALL(play->state.input[0].press.button, BTN_DRIGHT)) {
- csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
+ csCtx->state = CS_STATE_STOP;
return;
}
for (i = 0; i < totalEntries; i++) {
- MemCpy(&cmdType, cutscenePtr, 4);
- cutscenePtr += 4;
+ MemCpy(&cmdType, script, sizeof(cmdType));
+ script += sizeof(cmdType);
- if (cmdType == -1) {
+ if (cmdType == CS_CAM_STOP) {
return;
}
switch (cmdType) {
case CS_CMD_MISC:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- func_80064824(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 0x30;
+ CutsceneCmd_Misc(play, csCtx, (void*)script);
+ script += sizeof(CsCmdMisc);
}
break;
- case CS_CMD_SET_LIGHTING:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_LIGHT_SETTING:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_SetLighting(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 0x30;
+ CutsceneCmd_SetLightSetting(play, csCtx, (void*)script);
+ script += sizeof(CsCmdLightSetting);
}
break;
- case CS_CMD_PLAYBGM:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_START_SEQ:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_PlayBGM(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 0x30;
+ CutsceneCmd_StartSequence(play, csCtx, (void*)script);
+ script += sizeof(CsCmdStartSeq);
}
break;
- case CS_CMD_STOPBGM:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_STOP_SEQ:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_StopBGM(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 0x30;
+ CutsceneCmd_StopSequence(play, csCtx, (void*)script);
+ script += sizeof(CsCmdStopSeq);
}
break;
- case CS_CMD_FADEBGM:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_FADE_OUT_SEQ:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_FadeBGM(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 0x30;
+ CutsceneCmd_FadeOutSequence(play, csCtx, (void*)script);
+ script += sizeof(CsCmdFadeOutSeq);
}
break;
- case CS_CMD_09:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_RUMBLE_CONTROLLER:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- Cutscene_Command_09(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 0xC;
+ CutsceneCmd_RumbleController(play, csCtx, (void*)script);
+ script += sizeof(CsCmdRumble);
}
break;
- case CS_CMD_SETTIME:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_TIME:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- func_80065134(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 0xC;
+ CutsceneCmd_SetTime(play, csCtx, (void*)script);
+ script += sizeof(CsCmdTime);
}
break;
- case CS_CMD_SET_PLAYER_ACTION:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_PLAYER_CUE:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->linkAction = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->playerCue = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_1:
- case 17:
- case 18:
- case 23:
- case 34:
- case 39:
- case 46:
- case 76:
- case 85:
- case 93:
- case 105:
- case 107:
- case 110:
- case 119:
- case 123:
- case 138:
- case 139:
- case 144:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_0_0:
+ case CS_CMD_ACTOR_CUE_0_1:
+ case CS_CMD_ACTOR_CUE_0_2:
+ case CS_CMD_ACTOR_CUE_0_3:
+ case CS_CMD_ACTOR_CUE_0_4:
+ case CS_CMD_ACTOR_CUE_0_5:
+ case CS_CMD_ACTOR_CUE_0_6:
+ case CS_CMD_ACTOR_CUE_0_7:
+ case CS_CMD_ACTOR_CUE_0_8:
+ case CS_CMD_ACTOR_CUE_0_9:
+ case CS_CMD_ACTOR_CUE_0_10:
+ case CS_CMD_ACTOR_CUE_0_11:
+ case CS_CMD_ACTOR_CUE_0_12:
+ case CS_CMD_ACTOR_CUE_0_13:
+ case CS_CMD_ACTOR_CUE_0_14:
+ case CS_CMD_ACTOR_CUE_0_15:
+ case CS_CMD_ACTOR_CUE_0_16:
+ case CS_CMD_ACTOR_CUE_0_17:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[0] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[0] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_2:
- case 16:
- case 24:
- case 35:
- case 40:
- case 48:
- case 64:
- case 68:
- case 70:
- case 78:
- case 80:
- case 94:
- case 116:
- case 118:
- case 120:
- case 125:
- case 131:
- case 141:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_1_0:
+ case CS_CMD_ACTOR_CUE_1_1:
+ case CS_CMD_ACTOR_CUE_1_2:
+ case CS_CMD_ACTOR_CUE_1_3:
+ case CS_CMD_ACTOR_CUE_1_4:
+ case CS_CMD_ACTOR_CUE_1_5:
+ case CS_CMD_ACTOR_CUE_1_6:
+ case CS_CMD_ACTOR_CUE_1_7:
+ case CS_CMD_ACTOR_CUE_1_8:
+ case CS_CMD_ACTOR_CUE_1_9:
+ case CS_CMD_ACTOR_CUE_1_10:
+ case CS_CMD_ACTOR_CUE_1_11:
+ case CS_CMD_ACTOR_CUE_1_12:
+ case CS_CMD_ACTOR_CUE_1_13:
+ case CS_CMD_ACTOR_CUE_1_14:
+ case CS_CMD_ACTOR_CUE_1_15:
+ case CS_CMD_ACTOR_CUE_1_16:
+ case CS_CMD_ACTOR_CUE_1_17:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[1] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[1] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_3:
- case 36:
- case 41:
- case 50:
- case 67:
- case 69:
- case 72:
- case 74:
- case 81:
- case 106:
- case 117:
- case 121:
- case 126:
- case 132:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_2_0:
+ case CS_CMD_ACTOR_CUE_2_1:
+ case CS_CMD_ACTOR_CUE_2_2:
+ case CS_CMD_ACTOR_CUE_2_3:
+ case CS_CMD_ACTOR_CUE_2_4:
+ case CS_CMD_ACTOR_CUE_2_5:
+ case CS_CMD_ACTOR_CUE_2_6:
+ case CS_CMD_ACTOR_CUE_2_7:
+ case CS_CMD_ACTOR_CUE_2_8:
+ case CS_CMD_ACTOR_CUE_2_9:
+ case CS_CMD_ACTOR_CUE_2_10:
+ case CS_CMD_ACTOR_CUE_2_11:
+ case CS_CMD_ACTOR_CUE_2_12:
+ case CS_CMD_ACTOR_CUE_2_13:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[2] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[2] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_4:
- case 37:
- case 42:
- case 51:
- case 53:
- case 63:
- case 65:
- case 66:
- case 75:
- case 82:
- case 108:
- case 127:
- case 133:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_3_0:
+ case CS_CMD_ACTOR_CUE_3_1:
+ case CS_CMD_ACTOR_CUE_3_2:
+ case CS_CMD_ACTOR_CUE_3_3:
+ case CS_CMD_ACTOR_CUE_3_4:
+ case CS_CMD_ACTOR_CUE_3_5:
+ case CS_CMD_ACTOR_CUE_3_6:
+ case CS_CMD_ACTOR_CUE_3_7:
+ case CS_CMD_ACTOR_CUE_3_8:
+ case CS_CMD_ACTOR_CUE_3_9:
+ case CS_CMD_ACTOR_CUE_3_10:
+ case CS_CMD_ACTOR_CUE_3_11:
+ case CS_CMD_ACTOR_CUE_3_12:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[3] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[3] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_5:
- case 38:
- case 43:
- case 47:
- case 54:
- case 79:
- case 83:
- case 128:
- case 135:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_4_0:
+ case CS_CMD_ACTOR_CUE_4_1:
+ case CS_CMD_ACTOR_CUE_4_2:
+ case CS_CMD_ACTOR_CUE_4_3:
+ case CS_CMD_ACTOR_CUE_4_4:
+ case CS_CMD_ACTOR_CUE_4_5:
+ case CS_CMD_ACTOR_CUE_4_6:
+ case CS_CMD_ACTOR_CUE_4_7:
+ case CS_CMD_ACTOR_CUE_4_8:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[4] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[4] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_6:
- case 55:
- case 77:
- case 84:
- case 90:
- case 129:
- case 136:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_5_0:
+ case CS_CMD_ACTOR_CUE_5_1:
+ case CS_CMD_ACTOR_CUE_5_2:
+ case CS_CMD_ACTOR_CUE_5_3:
+ case CS_CMD_ACTOR_CUE_5_4:
+ case CS_CMD_ACTOR_CUE_5_5:
+ case CS_CMD_ACTOR_CUE_5_6:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[5] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[5] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_7:
- case 52:
- case 57:
- case 58:
- case 88:
- case 115:
- case 130:
- case 137:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_6_0:
+ case CS_CMD_ACTOR_CUE_6_1:
+ case CS_CMD_ACTOR_CUE_6_2:
+ case CS_CMD_ACTOR_CUE_6_3:
+ case CS_CMD_ACTOR_CUE_6_4:
+ case CS_CMD_ACTOR_CUE_6_5:
+ case CS_CMD_ACTOR_CUE_6_6:
+ case CS_CMD_ACTOR_CUE_6_7:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[6] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[6] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_8:
- case 60:
- case 89:
- case 111:
- case 114:
- case 134:
- case 142:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_7_0:
+ case CS_CMD_ACTOR_CUE_7_1:
+ case CS_CMD_ACTOR_CUE_7_2:
+ case CS_CMD_ACTOR_CUE_7_3:
+ case CS_CMD_ACTOR_CUE_7_4:
+ case CS_CMD_ACTOR_CUE_7_5:
+ case CS_CMD_ACTOR_CUE_7_6:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[7] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[7] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_9:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_8_0:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[8] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[8] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_SET_ACTOR_ACTION_10:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_ACTOR_CUE_9_0:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame)) {
- csCtx->npcActions[9] = (void*)cutscenePtr;
+ cmd = script;
+
+ if ((csCtx->curFrame > ((CsCmdActorCue*)cmd)->startFrame) &&
+ (csCtx->curFrame <= ((CsCmdActorCue*)cmd)->endFrame)) {
+ csCtx->actorCues[9] = (void*)script;
}
- cutscenePtr += 0x30;
+
+ script += sizeof(CsCmdActorCue);
}
break;
- case CS_CMD_CAM_EYE:
- cutscenePtr += Cutscene_Command_CameraEyePoints(play, csCtx, (void*)cutscenePtr, 0);
+
+ case CS_CMD_CAM_EYE_SPLINE:
+ script += CutsceneCmd_UpdateCamEyeSpline(play, csCtx, (void*)script, false);
break;
- case CS_CMD_CAM_EYE_REL_TO_PLAYER:
- cutscenePtr += Cutscene_Command_CameraEyePoints(play, csCtx, (void*)cutscenePtr, 1);
+
+ case CS_CMD_CAM_EYE_SPLINE_REL_TO_PLAYER:
+ script += CutsceneCmd_UpdateCamEyeSpline(play, csCtx, (void*)script, true);
break;
- case CS_CMD_CAM_AT:
- cutscenePtr += Cutscene_Command_CameraLookAtPoints(play, csCtx, (void*)cutscenePtr, 0);
+
+ case CS_CMD_CAM_AT_SPLINE:
+ script += CutsceneCmd_UpdateCamAtSpline(play, csCtx, (void*)script, false);
break;
- case CS_CMD_CAM_AT_REL_TO_PLAYER:
- cutscenePtr += Cutscene_Command_CameraLookAtPoints(play, csCtx, (void*)cutscenePtr, 1);
+
+ case CS_CMD_CAM_AT_SPLINE_REL_TO_PLAYER:
+ script += CutsceneCmd_UpdateCamAtSpline(play, csCtx, (void*)script, true);
break;
- case CS_CMD_07:
- cutscenePtr += Cutscene_Command_07(play, csCtx, (void*)cutscenePtr, 0);
+
+ case CS_CMD_CAM_EYE:
+ script += CutsceneCmd_SetCamEye(play, csCtx, (void*)script, 0);
break;
- case CS_CMD_08:
- cutscenePtr += Cutscene_Command_08(play, csCtx, (void*)cutscenePtr, 0);
+
+ case CS_CMD_CAM_AT:
+ script += CutsceneCmd_SetCamAt(play, csCtx, (void*)script, 0);
break;
- case CS_CMD_TERMINATOR:
- cutscenePtr += 4;
- Cutscene_Command_Terminator(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 8;
+
+ case CS_CMD_DESTINATION:
+ script += sizeof(cmdEntries);
+ CutsceneCmd_Destination(play, csCtx, (void*)script);
+ script += sizeof(CsCmdDestination);
break;
- case CS_CMD_TEXTBOX:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+
+ case CS_CMD_TEXT:
+ MemCpy(&cmdEntries, script, sizeof(cmdEntries));
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cmd = (CsCmdBase*)cutscenePtr;
- if (cmd->base != 0xFFFF) {
- Cutscene_Command_Textbox(play, csCtx, (void*)cutscenePtr);
+ cmd = script;
+
+ if (((CsCmdText*)cmd)->textId != CS_TEXT_ID_NONE) {
+ CutsceneCmd_Text(play, csCtx, (void*)script);
}
- cutscenePtr += 0xC;
+
+ script += sizeof(CsCmdText);
}
break;
- case CS_CMD_SCENE_TRANS_FX:
- cutscenePtr += 4;
- Cutscene_Command_TransitionFX(play, csCtx, (void*)cutscenePtr);
- cutscenePtr += 8;
+
+ case CS_CMD_TRANSITION:
+ script += sizeof(cmdEntries);
+ CutsceneCmd_Transition(play, csCtx, (void*)script);
+ script += sizeof(CsCmdTransition);
break;
+
default:
- MemCpy(&cmdEntries, cutscenePtr, 4);
- cutscenePtr += 4;
+ MemCpy(&cmdEntries, script, 4);
+ script += sizeof(cmdEntries);
+
for (j = 0; j < cmdEntries; j++) {
- cutscenePtr += 0x30;
+ script += 0x30;
}
break;
}
}
}
-void func_80068C3C(PlayState* play, CutsceneContext* csCtx) {
+void CutsceneHandler_RunScript(PlayState* play, CutsceneContext* csCtx) {
Gfx* displayList;
Gfx* prevDisplayList;
@@ -1932,42 +2210,44 @@ void func_80068C3C(PlayState* play, CutsceneContext* csCtx) {
CLOSE_DISPS(play->state.gfxCtx, "../z_demo.c", 4108);
}
- csCtx->frames++;
- if (dREG(95) != 0) {
- Cutscene_ProcessCommands(play, csCtx, D_8012D1F0);
+ csCtx->curFrame++;
+
+ if (R_USE_DEBUG_CUTSCENE) {
+ Cutscene_ProcessScript(play, csCtx, gDebugCutsceneScript);
} else {
- Cutscene_ProcessCommands(play, csCtx, play->csCtx.segment);
+ Cutscene_ProcessScript(play, csCtx, play->csCtx.script);
}
}
}
-void func_80068D84(PlayState* play, CutsceneContext* csCtx) {
- if (func_8006472C(play, csCtx, 0.0f)) {
+void CutsceneHandler_StopManual(PlayState* play, CutsceneContext* csCtx) {
+ if (Cutscene_StepTimer(play, csCtx, 0.0f)) {
Audio_SetCutsceneFlag(0);
csCtx->state = CS_STATE_IDLE;
}
}
-void func_80068DC0(PlayState* play, CutsceneContext* csCtx) {
+void CutsceneHandler_StopScript(PlayState* play, CutsceneContext* csCtx) {
s16 i;
- if (func_8006472C(play, csCtx, 0.0f)) {
- csCtx->linkAction = NULL;
+ if (Cutscene_StepTimer(play, csCtx, 0.0f)) {
+ csCtx->playerCue = NULL;
- for (i = 0; i < 10; i++) {
- csCtx->npcActions[i] = NULL;
+ for (i = 0; i < ARRAY_COUNT(csCtx->actorCues); i++) {
+ csCtx->actorCues[i] = NULL;
}
osSyncPrintf("\n\n\n\n\nやっぱりここかいな"); // "Right here, huh"
+
gSaveContext.cutsceneIndex = 0;
gSaveContext.gameMode = GAMEMODE_NORMAL;
- if (D_8015FCC8 != 0) {
+ if (gUseCutsceneCam) {
switch (gSaveContext.entranceIndex) {
- case 0x028A:
- case 0x028E:
- case 0x0292:
- case 0x0476:
+ case ENTR_HYRULE_FIELD_11:
+ case ENTR_HYRULE_FIELD_12:
+ case ENTR_HYRULE_FIELD_13:
+ case ENTR_HYRULE_FIELD_15:
Play_CopyCamera(play, sReturnToCamId, csCtx->subCamId);
}
@@ -1981,7 +2261,7 @@ void func_80068DC0(PlayState* play, CutsceneContext* csCtx) {
}
}
-void func_80068ECC(PlayState* play, CutsceneContext* csCtx) {
+void Cutscene_SetupScripted(PlayState* play, CutsceneContext* csCtx) {
u8 i;
if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_IDLE) && !Player_InCsMode(play)) {
@@ -1989,32 +2269,35 @@ void func_80068ECC(PlayState* play, CutsceneContext* csCtx) {
}
if ((gSaveContext.cutsceneIndex >= 0xFFF0) && (csCtx->state == CS_STATE_IDLE)) {
- Flags_UnsetEnv(play, 0);
+ CutsceneFlags_Unset(play, 0);
- D_8011E1C0 = 0;
- D_8011E1C4 = 0;
+ sCurTextId = 0;
+ sCurOcarinaAction = 0;
csCtx->unk_12 = 0;
- csCtx->linkAction = NULL;
+ csCtx->playerCue = NULL;
- for (i = 0; i < 10; i++) {
- csCtx->npcActions[i] = NULL;
+ for (i = 0; i < ARRAY_COUNT(csCtx->actorCues); i++) {
+ csCtx->actorCues[i] = NULL;
}
- csCtx->state++;
+ csCtx->state++; // CS_STATE_START
- if (csCtx->state == CS_STATE_SKIPPABLE_INIT) {
+ if (csCtx->state == CS_STATE_START) {
Audio_SetCutsceneFlag(1);
- csCtx->frames = 0xFFFF;
- csCtx->unk_18 = 0xFFFF;
- D_8015FCC0 = 0xFFFF;
- D_8015FCC2 = 0xFFFF;
- D_8015FCC4 = 0xFFFF;
- csCtx->unk_1A = 0;
- csCtx->unk_1B = 0;
+ csCtx->curFrame = 0xFFFF;
+
+ csCtx->camEyeSplinePointsAppliedFrame = CS_CAM_DATA_NOT_APPLIED;
+ gCamAtSplinePointsAppliedFrame = CS_CAM_DATA_NOT_APPLIED;
+ gCamEyePointAppliedFrame = CS_CAM_DATA_NOT_APPLIED;
+ gCamAtPointAppliedFrame = CS_CAM_DATA_NOT_APPLIED;
+
+ csCtx->camAtReady = false;
+ csCtx->camEyeReady = false;
+
sReturnToCamId = play->activeCamId;
- if (D_8015FCC8 != 0) {
+ if (gUseCutsceneCam) {
csCtx->subCamId = Play_CreateSubCamera(play);
}
@@ -2022,16 +2305,20 @@ void func_80068ECC(PlayState* play, CutsceneContext* csCtx) {
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_NOTHING);
Letterbox_SetSizeTarget(32);
Letterbox_SetSize(32);
- csCtx->state++;
+ csCtx->state++; // CS_STATE_RUN
}
- func_80068C3C(play, csCtx);
+ CutsceneHandler_RunScript(play, csCtx);
}
gSaveContext.cutsceneTrigger = 0;
}
}
+u16 D_8015FCCC;
+char D_8015FCD0[20]; // unreferenced
+u8 D_8015FCE4; // only written to, never read
+
void func_80069048(PlayState* play) {
s16 i;
@@ -2055,8 +2342,8 @@ void Cutscene_HandleEntranceTriggers(PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sEntranceCutsceneTable); i++) {
entranceCutscene = &sEntranceCutsceneTable[i];
-
requiredAge = entranceCutscene->ageRestriction;
+
if (requiredAge == 2) {
requiredAge = gSaveContext.linkAge;
}
@@ -2066,7 +2353,7 @@ void Cutscene_HandleEntranceTriggers(PlayState* play) {
(gSaveContext.cutsceneIndex < 0xFFF0) && ((u8)gSaveContext.linkAge == requiredAge) &&
(gSaveContext.respawnFlag <= 0)) {
Flags_SetEventChkInf(entranceCutscene->flag);
- Cutscene_SetSegment(play, entranceCutscene->segAddr);
+ Cutscene_SetScript(play, entranceCutscene->script);
gSaveContext.cutsceneTrigger = 2;
gSaveContext.showTitleCard = false;
break;
@@ -2108,10 +2395,10 @@ void Cutscene_HandleConditionalTriggers(PlayState* play) {
}
}
-void Cutscene_SetSegment(PlayState* play, void* segment) {
- if (SEGMENT_NUMBER(segment) != 0) {
- play->csCtx.segment = SEGMENTED_TO_VIRTUAL(segment);
+void Cutscene_SetScript(PlayState* play, void* script) {
+ if (SEGMENT_NUMBER(script) != 0) {
+ play->csCtx.script = SEGMENTED_TO_VIRTUAL(script);
} else {
- play->csCtx.segment = segment;
+ play->csCtx.script = script;
}
}
diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c
index 1384948cb..84b4558e7 100644
--- a/src/code/z_kankyo.c
+++ b/src/code/z_kankyo.c
@@ -417,7 +417,7 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 unused)
cREG(12) = 0;
cREG(13) = 0;
cREG(14) = 0;
- D_8015FCC8 = 1;
+ gUseCutsceneCam = true;
for (i = 0; i < ARRAY_COUNT(sLightningBolts); i++) {
sLightningBolts[i].state = LIGHTNING_BOLT_INACTIVE;
@@ -426,8 +426,8 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 unused)
play->roomCtx.unk_74[0] = 0;
play->roomCtx.unk_74[1] = 0;
- for (i = 0; i < ARRAY_COUNT(play->csCtx.npcActions); i++) {
- play->csCtx.npcActions[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(play->csCtx.actorCues); i++) {
+ play->csCtx.actorCues[i] = NULL;
}
if (Object_GetIndex(&play->objectCtx, OBJECT_GAMEPLAY_FIELD_KEEP) < 0 && !play->envCtx.sunMoonDisabled) {
diff --git a/src/code/z_onepointdemo_data.inc.c b/src/code/z_onepointdemo_data.inc.c
index 047d65b22..ca8b2ad2a 100644
--- a/src/code/z_onepointdemo_data.inc.c
+++ b/src/code/z_onepointdemo_data.inc.c
@@ -1,118 +1,118 @@
#include "global.h"
static CutsceneCameraPoint D_8012013C[14] = {
- { CS_CMD_CONTINUE, 25, 40, 70.79991f, { -1814, 533, -1297 } },
- { CS_CMD_CONTINUE, 20, 40, 70.99991f, { -1805, 434, -1293 } },
- { CS_CMD_CONTINUE, 10, 30, 60.0f, { -1794, 323, -1280 } },
- { CS_CMD_CONTINUE, 5, 25, 60.0f, { -1817, 218, -1270 } },
- { CS_CMD_CONTINUE, 3, 20, 60.0f, { -1836, 168, -1243 } },
- { CS_CMD_CONTINUE, 0, 20, 60.0f, { -1905, 115, -1193 } },
- { CS_CMD_CONTINUE, 0, 30, 55.0f, { -1969, 58, -1212 } },
- { CS_CMD_CONTINUE, 0, 30, 55.0f, { -1969, 31, -1164 } },
- { CS_CMD_CONTINUE, 0, 30, 60.0f, { -1969, 54, -1209 } },
- { CS_CMD_CONTINUE, 0, 30, 60.0f, { -1973, 35, -1206 } },
- { CS_CMD_CONTINUE, 0, 50, 60.0f, { -1974, 12, -1179 } },
- { CS_CMD_CONTINUE, 0, 50, 60.0f, { -1974, 12, -1179 } },
- { CS_CMD_STOP, 0, 50, 60.0f, { -1974, 12, -1179 } },
- { CS_CMD_STOP, 0, 30, 60.0f, { -1974, 12, -1179 } },
+ { CS_CAM_CONTINUE, 25, 40, 70.79991f, { -1814, 533, -1297 } },
+ { CS_CAM_CONTINUE, 20, 40, 70.99991f, { -1805, 434, -1293 } },
+ { CS_CAM_CONTINUE, 10, 30, 60.0f, { -1794, 323, -1280 } },
+ { CS_CAM_CONTINUE, 5, 25, 60.0f, { -1817, 218, -1270 } },
+ { CS_CAM_CONTINUE, 3, 20, 60.0f, { -1836, 168, -1243 } },
+ { CS_CAM_CONTINUE, 0, 20, 60.0f, { -1905, 115, -1193 } },
+ { CS_CAM_CONTINUE, 0, 30, 55.0f, { -1969, 58, -1212 } },
+ { CS_CAM_CONTINUE, 0, 30, 55.0f, { -1969, 31, -1164 } },
+ { CS_CAM_CONTINUE, 0, 30, 60.0f, { -1969, 54, -1209 } },
+ { CS_CAM_CONTINUE, 0, 30, 60.0f, { -1973, 35, -1206 } },
+ { CS_CAM_CONTINUE, 0, 50, 60.0f, { -1974, 12, -1179 } },
+ { CS_CAM_CONTINUE, 0, 50, 60.0f, { -1974, 12, -1179 } },
+ { CS_CAM_STOP, 0, 50, 60.0f, { -1974, 12, -1179 } },
+ { CS_CAM_STOP, 0, 30, 60.0f, { -1974, 12, -1179 } },
};
static CutsceneCameraPoint D_8012021C[14] = {
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1751, 604, -1233 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1752, 516, -1233 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1751, 417, -1233 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1767, 306, -1219 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1776, 257, -1205 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1881, 147, -1149 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1969, 72, -1077 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1969, 7, -1048 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1969, 1, -1030 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { -1987, 17, -1076 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { -2007, 10, -1004 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { -2007, 10, -1004 } },
- { CS_CMD_STOP, 0, 0, 60.0f, { -2007, 10, -1004 } }, { CS_CMD_STOP, 0, 0, 60.0f, { -2007, 10, -1004 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1751, 604, -1233 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1752, 516, -1233 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1751, 417, -1233 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1767, 306, -1219 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1776, 257, -1205 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1881, 147, -1149 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1969, 72, -1077 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1969, 7, -1048 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1969, 1, -1030 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { -1987, 17, -1076 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { -2007, 10, -1004 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { -2007, 10, -1004 } },
+ { CS_CAM_STOP, 0, 0, 60.0f, { -2007, 10, -1004 } }, { CS_CAM_STOP, 0, 0, 60.0f, { -2007, 10, -1004 } },
};
static s16 D_801202FC = 13;
static s16 D_80120300 = 210;
static s16 D_80120304 = 0;
static CutsceneCameraPoint sCrawlspaceAtPoints[9] = {
- { CS_CMD_CONTINUE, 0, 10, 40.0f, { 0, 4, 0 } }, { CS_CMD_CONTINUE, 0, 10, 40.000004f, { 0, 4, 0 } },
- { CS_CMD_CONTINUE, 0, 10, 50.0f, { 0, 9, 0 } }, { CS_CMD_CONTINUE, 0, 12, 55.0f, { 0, 12, 0 } },
- { CS_CMD_CONTINUE, 0, 15, 61.0f, { 0, 18, 0 } }, { CS_CMD_CONTINUE, 0, 20, 65.0f, { 0, 29, 0 } },
- { CS_CMD_CONTINUE, 0, 40, 60.0f, { 0, 34, 0 } }, { CS_CMD_STOP, 0, 40, 60.0f, { 0, 34, 0 } },
- { CS_CMD_STOP, 0, 10, 60.0f, { 0, 34, 0 } },
+ { CS_CAM_CONTINUE, 0, 10, 40.0f, { 0, 4, 0 } }, { CS_CAM_CONTINUE, 0, 10, 40.000004f, { 0, 4, 0 } },
+ { CS_CAM_CONTINUE, 0, 10, 50.0f, { 0, 9, 0 } }, { CS_CAM_CONTINUE, 0, 12, 55.0f, { 0, 12, 0 } },
+ { CS_CAM_CONTINUE, 0, 15, 61.0f, { 0, 18, 0 } }, { CS_CAM_CONTINUE, 0, 20, 65.0f, { 0, 29, 0 } },
+ { CS_CAM_CONTINUE, 0, 40, 60.0f, { 0, 34, 0 } }, { CS_CAM_STOP, 0, 40, 60.0f, { 0, 34, 0 } },
+ { CS_CAM_STOP, 0, 10, 60.0f, { 0, 34, 0 } },
};
static CutsceneCameraPoint sCrawlspaceForwardsEyePoints[9] = {
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 9, 45 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 8, 50 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 17, 58 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 21, 78 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 46, 109 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 58, 118 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 63, 119 } }, { CS_CMD_STOP, 0, 0, 60.0f, { 0, 62, 119 } },
- { CS_CMD_STOP, 0, 0, 60.0f, { 0, 62, 119 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 9, 45 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 8, 50 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 17, 58 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 21, 78 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 46, 109 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 58, 118 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 63, 119 } }, { CS_CAM_STOP, 0, 0, 60.0f, { 0, 62, 119 } },
+ { CS_CAM_STOP, 0, 0, 60.0f, { 0, 62, 119 } },
};
static s16 sCrawlspaceUnused = 9;
static s16 sCrawlspaceTimer = 90;
static s16 sCrawlspaceActionParam = 1;
static CutsceneCameraPoint sCrawlspaceBackwardsEyePoints[10] = {
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 9, -45 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 9, -45 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 8, -50 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 17, -58 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 21, -78 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 46, -109 } },
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 58, -118 } }, { CS_CMD_CONTINUE, 0, 0, 60.0f, { 0, 63, -119 } },
- { CS_CMD_STOP, 0, 0, 60.0f, { 0, 62, -119 } }, { CS_CMD_STOP, 0, 0, 60.0f, { 0, 62, -119 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 9, -45 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 9, -45 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 8, -50 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 17, -58 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 21, -78 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 46, -109 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 58, -118 } }, { CS_CAM_CONTINUE, 0, 0, 60.0f, { 0, 63, -119 } },
+ { CS_CAM_STOP, 0, 0, 60.0f, { 0, 62, -119 } }, { CS_CAM_STOP, 0, 0, 60.0f, { 0, 62, -119 } },
};
static CutsceneCameraPoint D_801204D4[14] = {
- { CS_CMD_CONTINUE, -15, 40, 80.600006f, { -60, 332, 183 } },
- { CS_CMD_CONTINUE, -22, 30, 80.600006f, { -60, 332, 183 } },
- { CS_CMD_CONTINUE, -20, 38, 80.600006f, { -118, 344, 41 } },
- { CS_CMD_CONTINUE, -18, 32, 80.600006f, { -80, 251, -8 } },
- { CS_CMD_CONTINUE, -12, 28, 80.600006f, { -64, 259, -28 } },
- { CS_CMD_CONTINUE, -8, 22, 80.600006f, { -79, 200, -342 } },
- { CS_CMD_CONTINUE, -5, 10, 65.80005f, { -110, 140, -549 } },
- { CS_CMD_CONTINUE, -2, 8, 65.2f, { -74, 109, -507 } },
- { CS_CMD_CONTINUE, 0, 10, 65.80002f, { -32, 78, -680 } },
- { CS_CMD_CONTINUE, 0, 20, 85.199936f, { 25, 127, -950 } },
- { CS_CMD_CONTINUE, 0, 30, 85.199936f, { 25, 127, -950 } },
- { CS_CMD_CONTINUE, 0, 40, 85.199936f, { 25, 127, -950 } },
- { CS_CMD_STOP, 6, 30, 85.199936f, { 25, 127, -950 } },
- { CS_CMD_STOP, 0, 30, 85.199936f, { 25, 127, -950 } },
+ { CS_CAM_CONTINUE, -15, 40, 80.600006f, { -60, 332, 183 } },
+ { CS_CAM_CONTINUE, -22, 30, 80.600006f, { -60, 332, 183 } },
+ { CS_CAM_CONTINUE, -20, 38, 80.600006f, { -118, 344, 41 } },
+ { CS_CAM_CONTINUE, -18, 32, 80.600006f, { -80, 251, -8 } },
+ { CS_CAM_CONTINUE, -12, 28, 80.600006f, { -64, 259, -28 } },
+ { CS_CAM_CONTINUE, -8, 22, 80.600006f, { -79, 200, -342 } },
+ { CS_CAM_CONTINUE, -5, 10, 65.80005f, { -110, 140, -549 } },
+ { CS_CAM_CONTINUE, -2, 8, 65.2f, { -74, 109, -507 } },
+ { CS_CAM_CONTINUE, 0, 10, 65.80002f, { -32, 78, -680 } },
+ { CS_CAM_CONTINUE, 0, 20, 85.199936f, { 25, 127, -950 } },
+ { CS_CAM_CONTINUE, 0, 30, 85.199936f, { 25, 127, -950 } },
+ { CS_CAM_CONTINUE, 0, 40, 85.199936f, { 25, 127, -950 } },
+ { CS_CAM_STOP, 6, 30, 85.199936f, { 25, 127, -950 } },
+ { CS_CAM_STOP, 0, 30, 85.199936f, { 25, 127, -950 } },
};
static CutsceneCameraPoint D_801205B4[14] = {
- { CS_CMD_CONTINUE, 0, 0, 60.0f, { -225, 785, -242 } },
- { CS_CMD_CONTINUE, -21, 0, 80.600006f, { -245, 784, -242 } },
- { CS_CMD_CONTINUE, -21, 0, 80.600006f, { -288, 485, -379 } },
- { CS_CMD_CONTINUE, -21, 0, 80.600006f, { -250, 244, -442 } },
- { CS_CMD_CONTINUE, -21, 0, 80.600006f, { -163, 21, -415 } },
- { CS_CMD_CONTINUE, -21, 0, 80.600006f, { -98, 86, -520 } },
- { CS_CMD_CONTINUE, -21, 0, 80.600006f, { -86, 31, -816 } },
- { CS_CMD_CONTINUE, -21, 0, 80.600006f, { -74, 18, -931 } },
- { CS_CMD_CONTINUE, 1, 0, 80.600006f, { -91, 80, -1220 } },
- { CS_CMD_CONTINUE, 0, 0, 85.199936f, { 14, 153, -1340 } },
- { CS_CMD_CONTINUE, 0, 0, 85.199936f, { 28, 125, -1340 } },
- { CS_CMD_CONTINUE, 0, 0, 85.199936f, { 48, 124, -1340 } },
- { CS_CMD_STOP, 0, 0, 85.199936f, { 48, 124, -1502 } },
- { CS_CMD_STOP, 0, 0, 85.199936f, { 48, 124, -1262 } },
+ { CS_CAM_CONTINUE, 0, 0, 60.0f, { -225, 785, -242 } },
+ { CS_CAM_CONTINUE, -21, 0, 80.600006f, { -245, 784, -242 } },
+ { CS_CAM_CONTINUE, -21, 0, 80.600006f, { -288, 485, -379 } },
+ { CS_CAM_CONTINUE, -21, 0, 80.600006f, { -250, 244, -442 } },
+ { CS_CAM_CONTINUE, -21, 0, 80.600006f, { -163, 21, -415 } },
+ { CS_CAM_CONTINUE, -21, 0, 80.600006f, { -98, 86, -520 } },
+ { CS_CAM_CONTINUE, -21, 0, 80.600006f, { -86, 31, -816 } },
+ { CS_CAM_CONTINUE, -21, 0, 80.600006f, { -74, 18, -931 } },
+ { CS_CAM_CONTINUE, 1, 0, 80.600006f, { -91, 80, -1220 } },
+ { CS_CAM_CONTINUE, 0, 0, 85.199936f, { 14, 153, -1340 } },
+ { CS_CAM_CONTINUE, 0, 0, 85.199936f, { 28, 125, -1340 } },
+ { CS_CAM_CONTINUE, 0, 0, 85.199936f, { 48, 124, -1340 } },
+ { CS_CAM_STOP, 0, 0, 85.199936f, { 48, 124, -1502 } },
+ { CS_CAM_STOP, 0, 0, 85.199936f, { 48, 124, -1262 } },
};
static s16 D_80120694 = 14;
static s16 D_80120698 = 190;
static s16 D_8012069C = 8;
static CutsceneCameraPoint D_801206A0[12] = {
- { CS_CMD_CONTINUE, 6, 20, 80.0f, { -96, 40, 170 } }, { CS_CMD_CONTINUE, 6, 20, 80.0f, { -96, 40, 170 } },
- { CS_CMD_CONTINUE, 6, 20, 70.0f, { -70, 35, 150 } }, { CS_CMD_CONTINUE, 5, 10, 60.0f, { -57, 34, 133 } },
- { CS_CMD_CONTINUE, 4, 25, 65.0f, { -22, 32, 110 } }, { CS_CMD_CONTINUE, 3, 12, 60.0f, { -9, 33, 98 } },
- { CS_CMD_CONTINUE, 3, 5, 65.0f, { -3, 29, 87 } }, { CS_CMD_CONTINUE, 2, 10, 65.0f, { -1, 15, 84 } },
- { CS_CMD_CONTINUE, 1, 200, 65.0f, { 0, 17, 82 } }, { CS_CMD_CONTINUE, 1, 500, 65.0f, { 0, 18, 82 } },
- { CS_CMD_STOP, 8, 50, 65.0f, { 0, 18, 82 } }, { CS_CMD_STOP, 11, 60, 65.0f, { 0, 18, 82 } },
+ { CS_CAM_CONTINUE, 6, 20, 80.0f, { -96, 40, 170 } }, { CS_CAM_CONTINUE, 6, 20, 80.0f, { -96, 40, 170 } },
+ { CS_CAM_CONTINUE, 6, 20, 70.0f, { -70, 35, 150 } }, { CS_CAM_CONTINUE, 5, 10, 60.0f, { -57, 34, 133 } },
+ { CS_CAM_CONTINUE, 4, 25, 65.0f, { -22, 32, 110 } }, { CS_CAM_CONTINUE, 3, 12, 60.0f, { -9, 33, 98 } },
+ { CS_CAM_CONTINUE, 3, 5, 65.0f, { -3, 29, 87 } }, { CS_CAM_CONTINUE, 2, 10, 65.0f, { -1, 15, 84 } },
+ { CS_CAM_CONTINUE, 1, 200, 65.0f, { 0, 17, 82 } }, { CS_CAM_CONTINUE, 1, 500, 65.0f, { 0, 18, 82 } },
+ { CS_CAM_STOP, 8, 50, 65.0f, { 0, 18, 82 } }, { CS_CAM_STOP, 11, 60, 65.0f, { 0, 18, 82 } },
};
static CutsceneCameraPoint D_80120760[12] = {
- { CS_CMD_CONTINUE, 6, 0, 80.0f, { -50, 10, 180 } }, { CS_CMD_CONTINUE, 6, 0, 80.0f, { -50, 20, 180 } },
- { CS_CMD_CONTINUE, 6, 0, 70.0f, { -40, 30, 177 } }, { CS_CMD_CONTINUE, 5, 0, 65.0f, { 0, 35, 172 } },
- { CS_CMD_CONTINUE, 4, 0, 65.0f, { 34, 35, 162 } }, { CS_CMD_CONTINUE, 3, 0, 65.0f, { 61, 32, 147 } },
- { CS_CMD_CONTINUE, 3, 0, 65.0f, { 72, 30, 128 } }, { CS_CMD_CONTINUE, 2, 0, 65.0f, { 74, 20, 125 } },
- { CS_CMD_CONTINUE, 1, 0, 65.0f, { 75, 18, 123 } }, { CS_CMD_CONTINUE, 1, 0, 65.0f, { 75, 10, 123 } },
- { CS_CMD_STOP, 0, 0, 65.0f, { 75, 10, 122 } }, { CS_CMD_STOP, 0, 0, 65.0f, { 75, 10, 122 } },
+ { CS_CAM_CONTINUE, 6, 0, 80.0f, { -50, 10, 180 } }, { CS_CAM_CONTINUE, 6, 0, 80.0f, { -50, 20, 180 } },
+ { CS_CAM_CONTINUE, 6, 0, 70.0f, { -40, 30, 177 } }, { CS_CAM_CONTINUE, 5, 0, 65.0f, { 0, 35, 172 } },
+ { CS_CAM_CONTINUE, 4, 0, 65.0f, { 34, 35, 162 } }, { CS_CAM_CONTINUE, 3, 0, 65.0f, { 61, 32, 147 } },
+ { CS_CAM_CONTINUE, 3, 0, 65.0f, { 72, 30, 128 } }, { CS_CAM_CONTINUE, 2, 0, 65.0f, { 74, 20, 125 } },
+ { CS_CAM_CONTINUE, 1, 0, 65.0f, { 75, 18, 123 } }, { CS_CAM_CONTINUE, 1, 0, 65.0f, { 75, 10, 123 } },
+ { CS_CAM_STOP, 0, 0, 65.0f, { 75, 10, 122 } }, { CS_CAM_STOP, 0, 0, 65.0f, { 75, 10, 122 } },
};
static CutsceneCameraPoint D_80120820[12] = {
- { CS_CMD_CONTINUE, 6, 0, 80.0f, { 85, 5, 170 } }, { CS_CMD_CONTINUE, 6, 0, 80.0f, { 85, 10, 170 } },
- { CS_CMD_CONTINUE, 6, 0, 70.0f, { 80, 20, 167 } }, { CS_CMD_CONTINUE, 5, 0, 65.0f, { 74, 25, 165 } },
- { CS_CMD_CONTINUE, 4, 0, 65.0f, { 63, 30, 162 } }, { CS_CMD_CONTINUE, 3, 0, 65.0f, { 66, 34, 147 } },
- { CS_CMD_CONTINUE, 3, 0, 65.0f, { 72, 34, 128 } }, { CS_CMD_CONTINUE, 2, 0, 65.0f, { 74, 20, 125 } },
- { CS_CMD_CONTINUE, 1, 0, 65.0f, { 75, 18, 123 } }, { CS_CMD_CONTINUE, 1, 0, 65.0f, { 75, 10, 123 } },
- { CS_CMD_STOP, 0, 0, 65.0f, { 75, 10, 122 } }, { CS_CMD_STOP, 0, 0, 65.0f, { 75, 10, 122 } },
+ { CS_CAM_CONTINUE, 6, 0, 80.0f, { 85, 5, 170 } }, { CS_CAM_CONTINUE, 6, 0, 80.0f, { 85, 10, 170 } },
+ { CS_CAM_CONTINUE, 6, 0, 70.0f, { 80, 20, 167 } }, { CS_CAM_CONTINUE, 5, 0, 65.0f, { 74, 25, 165 } },
+ { CS_CAM_CONTINUE, 4, 0, 65.0f, { 63, 30, 162 } }, { CS_CAM_CONTINUE, 3, 0, 65.0f, { 66, 34, 147 } },
+ { CS_CAM_CONTINUE, 3, 0, 65.0f, { 72, 34, 128 } }, { CS_CAM_CONTINUE, 2, 0, 65.0f, { 74, 20, 125 } },
+ { CS_CAM_CONTINUE, 1, 0, 65.0f, { 75, 18, 123 } }, { CS_CAM_CONTINUE, 1, 0, 65.0f, { 75, 10, 123 } },
+ { CS_CAM_STOP, 0, 0, 65.0f, { 75, 10, 122 } }, { CS_CAM_STOP, 0, 0, 65.0f, { 75, 10, 122 } },
};
static s16 D_801208E0 = 12;
static s16 D_801208E4 = 90;
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index b8e7a0a8d..e7c64cfe7 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -4301,12 +4301,12 @@ void Interface_Update(PlayState* play) {
gSaveContext.nextDayTime = NEXT_TIME_NIGHT;
play->transitionType = TRANS_TYPE_FADE_BLACK_FAST;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK;
- play->unk_11DE9 = true;
+ play->haltAllActors = true;
} else {
gSaveContext.nextDayTime = NEXT_TIME_DAY;
play->transitionType = TRANS_TYPE_FADE_WHITE_FAST;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
- play->unk_11DE9 = true;
+ play->haltAllActors = true;
}
if (play->sceneId == SCENE_HAUNTED_WASTELAND) {
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 8e0552497..cf2690c1f 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -2,17 +2,17 @@
#include "quake.h"
#include "terminal.h"
-void* D_8012D1F0 = NULL;
+void* gDebugCutsceneScript = NULL;
UNK_TYPE D_8012D1F4 = 0; // unused
Input* D_8012D1F8 = NULL;
TransitionUnk sTrnsnUnk;
s32 gTrnsnUnkState;
VisMono D_80161498;
-Color_RGBA8_u32 D_801614B0;
+Color_RGBA8_u32 gVisMonoColor;
FaultClient D_801614B8;
s16 sTransitionFillTimer;
-u64 D_801614D0[0xA00];
+u64 sDebugCutsceneScriptBuf[0xA00];
void Play_SpawnScene(PlayState* this, s32 sceneId, s32 spawn);
@@ -266,7 +266,7 @@ void Play_Init(GameState* thisx) {
EffectSs_InitInfo(this, 0x55);
CollisionCheck_InitContext(this, &this->colChkCtx);
AnimationContext_Reset(&this->animationCtx);
- func_8006450C(this, &this->csCtx);
+ Cutscene_InitContext(this, &this->csCtx);
if (gSaveContext.nextCutsceneIndex != 0xFFEF) {
gSaveContext.cutsceneIndex = gSaveContext.nextCutsceneIndex;
@@ -371,7 +371,7 @@ void Play_Init(GameState* thisx) {
this->transitionTrigger = TRANS_TRIGGER_END;
this->unk_11E16 = 0xFF;
this->unk_11E18 = 0;
- this->unk_11DE9 = false;
+ this->haltAllActors = false;
if (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN) {
if (gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT) {
@@ -391,8 +391,8 @@ void Play_Init(GameState* thisx) {
TransitionFade_SetColor(&this->transitionFadeFlash, RGBA8(160, 160, 160, 255));
TransitionFade_Start(&this->transitionFadeFlash);
VisMono_Init(&D_80161498);
- D_801614B0.a = 0;
- Flags_UnsetAllEnv(this);
+ gVisMonoColor.a = 0;
+ CutsceneFlags_UnsetAll(this);
osSyncPrintf("ZELDA ALLOC SIZE=%x\n", THA_GetRemaining(&this->state.tha));
zAllocSize = THA_GetRemaining(&this->state.tha);
@@ -436,10 +436,13 @@ void Play_Init(GameState* thisx) {
AnimationContext_Update(this, &this->animationCtx);
gSaveContext.respawnFlag = 0;
- if (dREG(95) != 0) {
- D_8012D1F0 = D_801614D0;
- osSyncPrintf("\nkawauso_data=[%x]", D_8012D1F0);
- DmaMgr_DmaRomToRam(0x03FEB000, D_8012D1F0, sizeof(D_801614D0));
+ if (R_USE_DEBUG_CUTSCENE) {
+ gDebugCutsceneScript = sDebugCutsceneScriptBuf;
+ osSyncPrintf("\nkawauso_data=[%x]", gDebugCutsceneScript);
+
+ // This hardcoded ROM address extends past the end of the ROM file.
+ // Presumably the ROM was larger at a previous point in development when this debug feature was used.
+ DmaMgr_DmaRomToRam(0x03FEB000, gDebugCutsceneScript, sizeof(sDebugCutsceneScriptBuf));
}
}
@@ -888,15 +891,15 @@ void Play_Update(PlayState* this) {
PLAY_LOG(3637);
- if (!this->unk_11DE9) {
+ if (!this->haltAllActors) {
Actor_UpdateAll(this, &this->actorCtx);
}
PLAY_LOG(3643);
- func_80064558(this, &this->csCtx);
+ Cutscene_UpdateManual(this, &this->csCtx);
PLAY_LOG(3648);
- func_800645A0(this, &this->csCtx);
+ Cutscene_UpdateScripted(this, &this->csCtx);
PLAY_LOG(3651);
Effect_UpdateAll(this);
@@ -1096,8 +1099,8 @@ void Play_Draw(PlayState* this) {
TransitionFade_Draw(&this->transitionFadeFlash, &gfxP);
- if (D_801614B0.a > 0) {
- D_80161498.primColor.rgba = D_801614B0.rgba;
+ if (gVisMonoColor.a > 0) {
+ D_80161498.primColor.rgba = gVisMonoColor.rgba;
VisMono_Draw(&D_80161498, &gfxP);
}
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index 0deabe136..91763d623 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -443,8 +443,8 @@ void Scene_CommandAlternateHeaderList(PlayState* play, SceneCmd* cmd) {
}
void Scene_CommandCutsceneData(PlayState* play, SceneCmd* cmd) {
- osSyncPrintf("\ngame_play->demo_play.data=[%x]", play->csCtx.segment);
- play->csCtx.segment = SEGMENTED_TO_VIRTUAL(cmd->cutsceneData.data);
+ osSyncPrintf("\ngame_play->demo_play.data=[%x]", play->csCtx.script);
+ play->csCtx.script = SEGMENTED_TO_VIRTUAL(cmd->cutsceneData.data);
}
// Camera & World Map Area