1
0
mirror of https://github.com/zeldaret/oot.git synced 2024-09-22 21:35:27 +00:00
oot/src/code/z_demo.c

2212 lines
77 KiB
C
Raw Normal View History

2020-03-17 04:31:30 +00:00
#include <ultra64.h>
#include <global.h>
u16 D_8011E1C0 = 0;
u16 D_8011E1C4 = 0;
typedef void (*CutsceneStateHandler)(GlobalContext*, CutsceneContext*);
void func_80064720(GlobalContext* globalCtx, CutsceneContext* csCtx);
void func_80064760(GlobalContext* globalCtx, CutsceneContext* csCtx);
void func_800647C0(GlobalContext* globalCtx, CutsceneContext* csCtx);
void func_80068C3C(GlobalContext* globalCtx, CutsceneContext* csCtx);
void func_80068D84(GlobalContext* globalCtx, CutsceneContext* csCtx);
void func_80068DC0(GlobalContext* globalCtx, CutsceneContext* csCtx);
CutsceneStateHandler sCsStateHandlers1[] =
{
func_80064720,
func_80064760,
func_80064720,
func_80068D84,
func_80064720,
};
CutsceneStateHandler sCsStateHandlers2[] =
{
func_80064720,
func_800647C0,
func_80068C3C,
func_80068DC0,
func_80068C3C,
};
u8 sTitleCsState = 0;
// TODO: use symbols for these cutscene locations once scenes and rooms are in C
EntranceCutscene sEntranceCutsceneTable[] =
{
{ 0x0185, 2, 0xA0, 0x02013AA0 },
{ 0x013D, 2, 0xA1, 0x02007EA0 },
{ 0x00DB, 2, 0xA3, 0x0200A540 },
{ 0x0108, 2, 0xA4, 0x02003D70 },
{ 0x0138, 1, 0xA5, 0x02003F40 },
{ 0x014D, 2, 0xA6, 0x02008400 },
{ 0x0053, 2, 0xA7, 0x0200CE00 },
{ 0x0000, 2, 0xA8, 0x0200B650 },
{ 0x028A, 0, 0x18, 0x0200F9E0 },
{ 0x0292, 0, 0x18, 0x0200FF00 },
{ 0x028E, 0, 0x18, 0x02010550 },
{ 0x0476, 0, 0x18, 0x02010B30 },
{ 0x050F, 1, 0xA9, 0x0200BB80 },
{ 0x0102, 2, 0xB1, 0x02007A30 },
{ 0x0117, 2, 0xB2, 0x020031E0 },
{ 0x0129, 2, 0xB3, 0x02006490 },
{ 0x0157, 2, 0xB4, 0x02005BD0 },
{ 0x0028, 2, 0xB5, 0x02015600 },
{ 0x00E4, 2, 0xB6, 0x020070C0 },
{ 0x0225, 2, 0xB7, 0x02004A80 },
{ 0x0123, 2, 0xB8, 0x02007990 },
{ 0x0147, 2, 0xB9, 0x020076D0 },
{ 0x0138, 0, 0xBA, 0x02004280 },
{ 0x0574, 2, 0x5A, 0x020028E0 },
{ 0x0538, 2, 0xBB, 0x0201E790 },
{ 0x053C, 2, 0xBC, 0x0201EF70 },
{ 0x0540, 2, 0xBD, 0x02021380 },
{ 0x0544, 2, 0xBE, 0x0201E3E0 },
{ 0x0548, 2, 0xBF, 0x0201DF90 },
{ 0x054C, 2, 0xAD, 0x0201EB40 },
{ 0x008D, 0, 0xC0, 0x02002BB0 },
{ 0x03B4, 0, 0xC7, 0x020055C0 },
{ 0x0246, 2, 0xB9, 0x020076D0 },
{ 0x05E8, 2, 0xC6, 0x0200C9D0 },
};
// Unused, seems to be an early list of dungeon entrance cutscene locations
u32 D_8011E304[] =
{
0x0200B650, 0x02015600, 0x02014F80, 0x02003F80, 0x02000330, 0x0201DA50
};
u16 D_8015FCC0;
u16 D_8015FCC2;
u16 D_8015FCC4;
s16 D_8015FCC6;
u8 D_8015FCC8;
s16 D_8015FCCA;
u16 D_8015FCCC; // only written to, never read
s8 D_8015FCD0[20]; // unreferenced
u8 D_8015FCE4; // only written to, never read
void func_80068ECC(GlobalContext* globalCtx, CutsceneContext* csCtx);
void Cutscene_DrawDebugInfo(GlobalContext* globalCtx, Gfx** dlist, CutsceneContext* csCtx)
{
u8 pad[0x1C];
GfxPrint printer;
u8 pad2[8];
GfxPrint_Ctor(&printer);
GfxPrint_Open(&printer, *dlist);
GfxPrint_SetPos(&printer, 22, 25);
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_SetColor(&printer, 50, 255, 255, 60);
GfxPrint_SetPos(&printer, 4, 26);
GfxPrint_Printf(&printer, "%s", "SKIP=(START) or (Cursole Right)");
*dlist = GfxPrint_Close(&printer);
GfxPrint_Dtor(&printer);
}
void func_8006450C(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
csCtx->state = CS_STATE_IDLE;
csCtx->unk_0C = 0.0f;
}
void func_80064520(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
csCtx->state = CS_STATE_SKIPPABLE_INIT;
csCtx->linkAction = NULL;
}
void func_80064534(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
if (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC)
csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
}
void func_80064558(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
if (gSaveContext.cutscene_index < 0xFFF0)
sCsStateHandlers1[csCtx->state](globalCtx, csCtx);
}
#ifdef NON_MATCHING
// minor ordering and regalloc differences
void func_800645A0(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
CutsceneStateHandler handler;
if (!~(globalCtx->state.input[0].padPressed | -0x201) && (csCtx->state == CS_STATE_IDLE) &&
(gSaveContext.scene_setup_index >= 4))
{
D_8015FCC8 = 0;
gSaveContext.cutscene_index = 0xFFFD;
gSaveContext.cutscene_trigger = 1;
}
if (!~(globalCtx->state.input[0].padPressed | -0x801) && (csCtx->state == CS_STATE_IDLE) &&
(gSaveContext.scene_setup_index >= 4) && (D_8011D394 == 0))
{
D_8015FCC8 = 1;
gSaveContext.cutscene_index = 0xFFFD;
gSaveContext.cutscene_trigger = 1;
}
if ((gSaveContext.cutscene_trigger != 0) && (globalCtx->sceneLoadFlag == 0x14))
gSaveContext.cutscene_trigger = 0;
if ((gSaveContext.cutscene_trigger != 0) && (csCtx->state == CS_STATE_IDLE))
{
// Translates to: "CUTSCENE START REQUEST ANNOUNCEMENT!"
osSyncPrintf("\nデモ開始要求 発令!");
gSaveContext.cutscene_index = 0xFFFD;
gSaveContext.cutscene_trigger = 1;
}
if (gSaveContext.cutscene_index >= 0xFFF0)
{
func_80068ECC(globalCtx, csCtx);
handler = sCsStateHandlers2[csCtx->state];
handler(globalCtx, csCtx);
}
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_demo/func_800645A0.s")
#endif
void func_80064720(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
}
u32 func_8006472C(GlobalContext* globalCtx, CutsceneContext* csCtx, f32 target)
{
return Math_ApproxF(&csCtx->unk_0C, target, 0.1f);
}
void func_80064760(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
Interface_ChangeAlpha(1);
func_800B3840(0x20);
if (func_8006472C(globalCtx, csCtx, 1.0f))
{
func_800F68BC(1);
csCtx->state++;
}
}
void func_800647C0(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
func_80068C3C(globalCtx, csCtx);
Interface_ChangeAlpha(1);
func_800B3840(0x20);
if (func_8006472C(globalCtx, csCtx, 1.0f))
{
func_800F68BC(1);
csCtx->state++;
}
}
// Command 3: Misc. Actions
#ifdef NON_MATCHING
// regalloc and minor ordering differences
void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase* cmd)
{
Player* player = PLAYER;
f32 temp;
u8 sp3F;
sp3F = 0;
if ((csCtx->frames < cmd->startFrame) ||
(csCtx->frames >= cmd->endFrame) && (cmd->endFrame != cmd->startFrame))
return;
temp = func_8006F93C(cmd->endFrame - 1, cmd->startFrame, csCtx->frames);
if (csCtx->frames == cmd->startFrame)
sp3F = 1;
switch (cmd->base)
{
case 1:
if (sp3F != 0)
{
func_800F6D58(0xE, 4, 0x3F);
func_800F6D58(0xE, 1, 1);
globalCtx->unk_10B12[0] = 0x14;
}
break;
case 2:
if (sp3F != 0)
{
func_800F6D58(0xF, 0, 0);
func_800753C4(globalCtx, 3);
D_8015FD70 = 1;
}
break;
case 3:
if (sp3F != 0)
{
func_8006C3D0(globalCtx, 0);
if (gSaveContext.entrance_index == 0x0053)
func_8006C3D0(globalCtx, 2);
}
break;
case 6:
if (globalCtx->unk_10AC4 < 0x3200)
globalCtx->unk_10AC4 += 0x23;
break;
case 7:
if (sp3F != 0)
{
globalCtx->unk_10A3D = 1;
globalCtx->gloomySky = 1;
globalCtx->unk_10A3C = 0;
globalCtx->unk_10A3E = 0x3C;
globalCtx->unk_10A45 = 1;
globalCtx->unk_10A43 = 0;
globalCtx->unk_10A44 = 1;
globalCtx->unk_10A46 = globalCtx->unk_10A48 = 0x3C;
}
break;
case 8:
if (globalCtx->unk_11D30[0] < 0x80)
globalCtx->unk_11D30[0] += 4;
break;
case 9:
globalCtx->unk_10B12[3] = 0x10;
break;
case 10:
func_8006C3D0(globalCtx, 1);
break;
case 11:
if (globalCtx->unk_11D30[0] < 0x672)
globalCtx->unk_11D30[0] += 0x14;
if (csCtx->frames == 0x30F)
func_80078884(NA_SE_EV_DEKU_DEATH);
else if (csCtx->frames == 0x2CD)
globalCtx->unk_11D30[0] = 0;
break;
case 12:
if (sp3F != 0)
{
if (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC)
csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
}
break;
case 13:
if (globalCtx->unk_11D30[1] == 0)
func_80078884(NA_SE_EV_TRIFORCE_FLASH);
if (globalCtx->unk_11D30[1] < 0xFF)
globalCtx->unk_11D30[1] += 5;
break;
case 14:
if (sp3F != 0)
func_800BC490(globalCtx, 1);
break;
case 15:
if (sp3F != 0)
TitleCard_InitPlaceName(globalCtx, &globalCtx->actorCtx.titleCtx, player->unk_1B0,
0xA0, 0x78, 0x90, 0x18, 0x14);
break;
case 16:
if (sp3F != 0)
{
D_8015FCCA = func_80092F88(globalCtx->cameraCtx.activeCameraPtrs[globalCtx->cameraCtx.unk_5C0], 6);
func_80092DAC(D_8015FCCA, 0x7FFF);
func_80092E70(D_8015FCCA, 4, 0, 1000, 0);
func_80092DF0(D_8015FCCA, 800);
}
break;
case 17:
if (sp3F != 0)
func_80092FAC(D_8015FCCA);
break;
case 18:
globalCtx->unk_10B12[0] = 0;
globalCtx->gloomySkyEvent = 2;
if (gSaveContext.day_time < 0x4AAB)
gSaveContext.day_time += 30;
if (globalCtx->unk_10B12[1] == 0)
{
D_8011FB30 = 0;
func_800F6D58(14, 1, 0);
}
break;
case 19:
gSaveContext.event_chk_inf[6] |= 0x0020;
break;
case 20:
gSaveContext.event_chk_inf[6] |= 0x0080;
break;
case 21:
gSaveContext.event_chk_inf[6] |= 0x0200;
break;
case 22:
D_801614B0.r = 0xFF;
D_801614B0.g = 0xFF;
D_801614B0.b = 0xFF;
D_801614B0.a = 0xFF;
break;
case 23:
D_801614B0.r = 0xFF;
D_801614B0.g = 0xB4;
D_801614B0.b = 0x64;
D_801614B0.a = 255.0f * temp;
break;
case 24:
globalCtx->roomCtx.curRoom.segment = NULL;
break;
case 25:
gSaveContext.day_time += 30;
if ((gSaveContext.day_time & 0xFFFF) > 0xCAAA)
gSaveContext.day_time = 0xCAAA;
break;
case 26:
if ((gSaveContext.day_time < 0x3000) || (gSaveContext.day_time >= 0x4555))
{
if ((gSaveContext.day_time >= 0x4555) && (gSaveContext.day_time < 0xAAAB))
globalCtx->unk_10AE3 = 1;
else if ((gSaveContext.day_time >= 0xAAAB) && (gSaveContext.day_time < 0xC556))
globalCtx->unk_10AE3 = 2;
else
globalCtx->unk_10AE3 = 3;
}
break;
case 27:
if (globalCtx->state.frames & 8)
{
if (globalCtx->unk_10AB0[0] < 40)
{
globalCtx->unk_10AB0[0] += 2;
globalCtx->unk_10AB0[4] -= 3;
globalCtx->unk_10AB0[5] -= 3;
}
}
else
{
if (globalCtx->unk_10AB0[0] > 2)
{
globalCtx->unk_10AB0[0] -= 2;
globalCtx->unk_10AB0[4] += 3;
globalCtx->unk_10AB0[5] += 3;
}
}
break;
case 28:
globalCtx->unk_11DE9 = 1;
break;
case 29:
globalCtx->unk_11DE9 = 0;
break;
case 30:
func_8006C3D0(globalCtx, 3);
break;
case 31:
func_8006C3D0(globalCtx, 4);
break;
case 32:
if (sp3F != 0)
globalCtx->unk_10B0A = 1;
func_800788CC(0x20C0);
break;
case 33:
gSaveContext.unk_1422 = 1;
break;
case 34:
if (!gSaveContext.night_flag)
gSaveContext.day_time -= D_8011FB40;
else
gSaveContext.day_time -= D_8011FB40 * 2;
break;
case 35:
func_800EE824(csCtx);
csCtx->frames = cmd->startFrame - 1;
break;
}
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_demo/func_80064824.s")
#endif
// Command 4: Set Environment Lighting
void Cutscene_Command_SetLighting(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdEnvLighting* cmd)
{
if (csCtx->frames == cmd->startFrame)
{
globalCtx->unk_10AE3 = cmd->setting - 1;
globalCtx->unk_10AFC = 1.0f;
}
}
// Command 0x56: Play Background Music
void Cutscene_Command_PlayBGM(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdMusicChange* cmd)
{
if (csCtx->frames == cmd->startFrame)
func_800F595C(cmd->sequence - 1);
}
// Command 0x57: Stop Background Music
void Cutscene_Command_StopBGM(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdMusicChange* cmd)
{
if (csCtx->frames == cmd->startFrame)
func_800F59E8(cmd->sequence - 1);
}
// Command 0x7C: Fade Background Music over duration
void Cutscene_Command_FadeBGM(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdMusicFade* cmd)
{
u8 var1;
if ((csCtx->frames == cmd->startFrame) && (csCtx->frames < cmd->endFrame))
{
var1 = cmd->endFrame - cmd->startFrame;
if (cmd->type == 3)
Audio_SetBGM(var1 << 0x10 | 0x110000FF);
else
Audio_SetBGM(var1 << 0x10 | 0x100000FF);
}
}
// Command 9: ?
void Cutscene_Command_09(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdUnknown9* cmd)
{
if (csCtx->frames == cmd->startFrame)
func_800AA000(0.0f, cmd->unk_06, cmd->unk_07, cmd->unk_08);
}
// Command 0x8C: Set Time of Day & Environment Time
#ifdef NON_MATCHING
// regalloc differences
void func_80065134(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdDayTime* cmd)
{
s16 temp1;
s16 temp2;
if (csCtx->frames == cmd->startFrame)
{
temp1 = (cmd->hour * 60.0f) / 0.021972656f;
temp2 = (cmd->minute + 1) / 0.021972656f;
gSaveContext.environment_time = gSaveContext.day_time = temp1 + temp2;
}
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_demo/func_80065134.s")
#endif
// Command 0x3E8: Code Execution (& Terminates Cutscene?)
void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase* cmd)
{
Player* player = PLAYER;
s32 temp = 0;
if ((gSaveContext.game_mode != 0) && (gSaveContext.game_mode != 3) &&
(globalCtx->sceneNum != SCENE_SPOT00) && (csCtx->frames > 20) &&
(!~(globalCtx->state.input[0].padPressed | 0xFFFF7FFF) ||
!~(globalCtx->state.input[0].padPressed | -0x4001) ||
!~(globalCtx->state.input[0].padPressed | -0x1001)) &&
(gSaveContext.file_num != 0xFEDC) && (globalCtx->sceneLoadFlag == 0))
{
Audio_PlaySoundGeneral(NA_SE_SY_PIECE_OF_HEART, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
temp = 1;
}
if ((csCtx->frames == cmd->startFrame) || (temp != 0) ||
((csCtx->frames > 20) && (!~(globalCtx->state.input[0].padPressed | -0x1001)) && (gSaveContext.file_num != 0xFEDC)))
{
csCtx->state = CS_STATE_UNSKIPPABLE_EXEC;
func_800F68BC(0);
gSaveContext.unk_1410 = 1;
// Translates to: "FUTURE FORK DESIGNATION=No. [%d]"
osSyncPrintf("\n分岐先指定!!=[%d]番", cmd->base);
if ((gSaveContext.game_mode != 0) && (csCtx->frames != cmd->startFrame))
gSaveContext.unk_13E7 = 1;
gSaveContext.cutscene_index = 0;
switch (cmd->base)
{
case 1:
globalCtx->nextEntranceIndex = 0x00A0;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 2:
globalCtx->nextEntranceIndex = 0x00A0;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xA;
break;
case 3:
globalCtx->nextEntranceIndex = 0x0117;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xA;
break;
case 4:
globalCtx->nextEntranceIndex = 0x013D;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xA;
break;
case 5:
globalCtx->nextEntranceIndex = 0x00EE;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xA;
break;
case 6:
globalCtx->nextEntranceIndex = 0x00A0;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xA;
break;
case 7:
globalCtx->nextEntranceIndex = 0x00EE;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xB;
break;
case 8:
gSaveContext.fw.set = 0;
gSaveContext.respawn[RESPAWN_MODE_TOP].data = 0;
if (!(gSaveContext.event_chk_inf[4] & 0x20))
{
gSaveContext.event_chk_inf[4] |= 0x20;
globalCtx->nextEntranceIndex = 0x00A0;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF3;
globalCtx->fadeOutTransition = 0xB;
}
else
{
if (gSaveContext.scene_setup_index < 4)
{
if (LINK_IS_CHILD)
globalCtx->linkAgeOnLoad = 0;
else
globalCtx->linkAgeOnLoad = 1;
}
globalCtx->nextEntranceIndex = 0x02CA;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
gSaveContext.transition_type = 3;
}
break;
case 9:
globalCtx->nextEntranceIndex = 0x0117;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xc;
break;
case 10:
globalCtx->nextEntranceIndex = 0x00BB;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 11:
globalCtx->nextEntranceIndex = 0x00EE;
gSaveContext.cutscene_index = 0xFFF3;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
break;
case 12:
globalCtx->nextEntranceIndex = 0x047A;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 13:
globalCtx->nextEntranceIndex = 0x010E;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
gSaveContext.transition_type = 2;
break;
case 14:
globalCtx->nextEntranceIndex = 0x0457;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 15:
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF4;
globalCtx->fadeOutTransition = 3;
break;
case 16:
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF5;
globalCtx->fadeOutTransition = 3;
break;
case 17:
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF6;
globalCtx->fadeOutTransition = 3;
break;
case 18:
gSaveContext.event_chk_inf[4] |= 0x8000;
globalCtx->nextEntranceIndex = 0x0324;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
gSaveContext.transition_type = 2;
break;
case 19:
globalCtx->nextEntranceIndex = 0x013D;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 4;
gSaveContext.cutscene_index = 0x8000;
break;
case 21:
globalCtx->nextEntranceIndex = 0x0102;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->fadeOutTransition = 3;
break;
case 22:
Item_Give(globalCtx, ITEM_SONG_REQUIEM);
globalCtx->nextEntranceIndex = 0x0123;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->fadeOutTransition = 3;
break;
case 23:
globalCtx->nextEntranceIndex = 0x00A0;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF8;
globalCtx->fadeOutTransition = 3;
break;
case 24:
globalCtx->nextEntranceIndex = 0x0028;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 25:
globalCtx->linkAgeOnLoad = 0;
globalCtx->nextEntranceIndex = 0x006B;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->fadeOutTransition = 3;
break;
case 26:
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF4;
globalCtx->fadeOutTransition = 3;
break;
case 27:
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF5;
globalCtx->fadeOutTransition = 3;
break;
case 28:
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF6;
globalCtx->fadeOutTransition = 3;
break;
case 29:
globalCtx->nextEntranceIndex = 0x006B;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.chamber_cutscene_num = 0;
globalCtx->fadeOutTransition = 3;
break;
case 30:
globalCtx->nextEntranceIndex = 0x006B;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
Item_Give(globalCtx, ITEM_MEDALLION_FIRE);
gSaveContext.chamber_cutscene_num = 1;
break;
case 31:
globalCtx->nextEntranceIndex = 0x006B;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
gSaveContext.chamber_cutscene_num = 2;
break;
case 32:
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x00CD;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->fadeOutTransition = 0xb;
break;
case 33:
globalCtx->nextEntranceIndex = 0x00CD;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
break;
case 34:
globalCtx->nextEntranceIndex = 0x00A0;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF3;
globalCtx->fadeOutTransition = 3;
break;
case 35:
globalCtx->nextEntranceIndex = 0x00CD;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->fadeOutTransition = 4;
break;
case 38:
globalCtx->nextEntranceIndex = 0x00A0;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF4;
globalCtx->fadeOutTransition = 4;
break;
case 39:
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF9;
globalCtx->fadeOutTransition = 4;
break;
case 40:
globalCtx->linkAgeOnLoad = 0;
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFFA;
globalCtx->fadeOutTransition = 4;
break;
case 41:
globalCtx->nextEntranceIndex = 0x04E6;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 42:
globalCtx->nextEntranceIndex = 0x00DB;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->fadeOutTransition = 4;
break;
case 43:
globalCtx->nextEntranceIndex = 0x0503;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 4;
break;
case 44:
globalCtx->nextEntranceIndex = 0x0320;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0x11;
break;
case 46:
gSaveContext.event_chk_inf[4] |= 0x8000;
globalCtx->nextEntranceIndex = 0x0324;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 4;
break;
case 47:
Item_Give(globalCtx, ITEM_SONG_NOCTURNE);
gSaveContext.event_chk_inf[5] |= 0x10;
globalCtx->nextEntranceIndex = 0x00DB;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->fadeOutTransition = 4;
break;
case 48:
globalCtx->nextEntranceIndex = 0x01ED;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xF;
gSaveContext.transition_type = 0xF;
break;
case 49:
globalCtx->nextEntranceIndex = 0x058C;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 4;
break;
case 50:
globalCtx->nextEntranceIndex = 0x0513;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0x11;
break;
case 51:
globalCtx->nextEntranceIndex = 0x00CD;
gSaveContext.cutscene_index = 0xFFF8;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0x29;
break;
case 52:
globalCtx->nextEntranceIndex = 0x0053;
gSaveContext.cutscene_index = 0xFFF7;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xb;
break;
case 53:
globalCtx->nextEntranceIndex = 0x050F;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
break;
case 54:
gSaveContext.game_mode = 3;
func_800F7260(0x6F);
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x0117;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 55:
globalCtx->nextEntranceIndex = 0x0129;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 56:
globalCtx->nextEntranceIndex = 0x00DB;
gSaveContext.cutscene_index = 0xFFF4;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 57:
globalCtx->nextEntranceIndex = 0x013D;
gSaveContext.cutscene_index = 0xFFF3;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 58:
globalCtx->nextEntranceIndex = 0x014D;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 59:
globalCtx->nextEntranceIndex = 0x0102;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 60:
globalCtx->nextEntranceIndex = 0x010E;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 61:
globalCtx->nextEntranceIndex = 0x0108;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 62:
globalCtx->linkAgeOnLoad = 0;
globalCtx->nextEntranceIndex = 0x00EE;
gSaveContext.cutscene_index = 0xFFF6;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 63:
globalCtx->nextEntranceIndex = 0x00EE;
gSaveContext.cutscene_index = 0xFFF7;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 64:
globalCtx->nextEntranceIndex = 0x00CD;
gSaveContext.cutscene_index = 0xFFF5;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 65:
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x0157;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 66:
globalCtx->nextEntranceIndex = 0x0554;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 67:
globalCtx->nextEntranceIndex = 0x027E;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 68:
globalCtx->nextEntranceIndex = 0x00A0;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF5;
globalCtx->fadeOutTransition = 2;
break;
case 69:
globalCtx->nextEntranceIndex = 0x05E8;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 70:
globalCtx->nextEntranceIndex = 0x013D;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF4;
globalCtx->fadeOutTransition = 2;
gSaveContext.transition_type = 2;
break;
case 71:
gSaveContext.equips.equipment |= 0x0100;
func_8008ECAC(globalCtx, player);
gSaveContext.equips.equipment |= 0x1000;
func_8008ECAC(globalCtx, player);
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->fadeOutTransition = 2;
break;
case 72:
globalCtx->nextEntranceIndex = 0x0400;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->fadeOutTransition = 2;
gSaveContext.transition_type = 2;
break;
case 73:
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x0157;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->fadeOutTransition = 2;
break;
case 74:
globalCtx->nextEntranceIndex = 0x0157;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF3;
globalCtx->fadeOutTransition = 3;
gSaveContext.transition_type = 3;
break;
case 75:
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x0157;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF4;
globalCtx->fadeOutTransition = 2;
break;
case 76:
globalCtx->linkAgeOnLoad = 0;
globalCtx->nextEntranceIndex = 0x0157;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF5;
globalCtx->fadeOutTransition = 2;
break;
case 77:
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x0157;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF6;
globalCtx->fadeOutTransition = 2;
break;
case 78:
globalCtx->nextEntranceIndex = 0x0157;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF7;
globalCtx->fadeOutTransition = 2;
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:
globalCtx->nextEntranceIndex = 0x0157;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 94:
globalCtx->nextEntranceIndex = 0x02AE;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
break;
case 95:
if ((gSaveContext.event_chk_inf[4] & 0x100) &&
(gSaveContext.event_chk_inf[4] & 0x200) &&
(gSaveContext.event_chk_inf[4] & 0x400))
{
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF3;
globalCtx->fadeOutTransition = 2;
}
else
{
switch (gSaveContext.scene_setup_index)
{
case 8:
globalCtx->nextEntranceIndex = 0x00FC;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 9:
globalCtx->nextEntranceIndex = 0x0147;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 10:
globalCtx->nextEntranceIndex = 0x0102;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF0;
globalCtx->fadeOutTransition = 3;
break;
}
}
break;
case 96:
if (gBitFlags[4] & gSaveContext.quest_items)
{
globalCtx->nextEntranceIndex = 0x006B;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->fadeOutTransition = 5;
}
else
{
gSaveContext.event_chk_inf[12] |= 0x100;
globalCtx->nextEntranceIndex = 0x0610;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
gSaveContext.transition_type = 3;
}
break;
case 97:
if (gBitFlags[3] & gSaveContext.quest_items)
{
globalCtx->nextEntranceIndex = 0x006B;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->fadeOutTransition = 5;
}
else
{
globalCtx->nextEntranceIndex = 0x0580;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
gSaveContext.transition_type = 3;
}
break;
case 98:
globalCtx->nextEntranceIndex = 0x0564;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
gSaveContext.transition_type = 3;
break;
case 99:
globalCtx->nextEntranceIndex = 0x0608;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
gSaveContext.transition_type = 2;
break;
case 100:
globalCtx->nextEntranceIndex = 0x00EE;
gSaveContext.cutscene_index = 0xFFF8;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
gSaveContext.transition_type = 3;
break;
case 101:
globalCtx->nextEntranceIndex = 0x01F5;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 0xF;
break;
case 102:
globalCtx->nextEntranceIndex = 0x0590;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 103:
globalCtx->nextEntranceIndex = 0x00CD;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF3;
globalCtx->fadeOutTransition = 2;
break;
case 104:
switch (sTitleCsState)
{
case 0:
globalCtx->nextEntranceIndex = 0x008D;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF2;
globalCtx->fadeOutTransition = 2;
sTitleCsState++;
break;
case 1:
globalCtx->nextEntranceIndex = 0x0147;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->fadeOutTransition = 2;
sTitleCsState++;
break;
case 2:
globalCtx->nextEntranceIndex = 0x00A0;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF6;
globalCtx->fadeOutTransition = 2;
sTitleCsState = 0;
break;
}
break;
case 105:
globalCtx->nextEntranceIndex = 0x00E4;
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.cutscene_index = 0xFFF1;
globalCtx->fadeOutTransition = 2;
break;
case 106:
globalCtx->nextEntranceIndex = 0x0574;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 107:
globalCtx->nextEntranceIndex = 0x0538;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 108:
globalCtx->nextEntranceIndex = 0x053C;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 109:
globalCtx->nextEntranceIndex = 0x0540;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 110:
globalCtx->nextEntranceIndex = 0x0544;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 111:
globalCtx->nextEntranceIndex = 0x0548;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 112:
globalCtx->nextEntranceIndex = 0x054C;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 113:
if (Flags_GetEventChkInf(0xBB) && Flags_GetEventChkInf(0xBC) && Flags_GetEventChkInf(0xBD) &&
Flags_GetEventChkInf(0xBE) && Flags_GetEventChkInf(0xBF) && Flags_GetEventChkInf(0xAD))
{
globalCtx->csCtx.segment = SEGMENTED_TO_VIRTUAL(&D_0201DA50);
globalCtx->csCtx.frames = 0;
gSaveContext.cutscene_trigger = 1;
gSaveContext.cutscene_index = 0xFFFF;
csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
}
else
{
gSaveContext.cutscene_index = 0xFFFF;
csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
}
break;
case 114:
globalCtx->nextEntranceIndex = 0x0185;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
break;
case 115:
globalCtx->nextEntranceIndex = 0x0594;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 2;
gSaveContext.transition_type = 2;
break;
case 116:
if (gSaveContext.event_chk_inf[12] & 0x100)
{
globalCtx->nextEntranceIndex = 0x0580;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
}
else
{
globalCtx->nextEntranceIndex = 0x0610;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
}
gSaveContext.transition_type = 3;
break;
case 117:
gSaveContext.game_mode = 3;
func_800F7260(0x6F);
globalCtx->linkAgeOnLoad = 0;
globalCtx->nextEntranceIndex = 0x00CD;
gSaveContext.cutscene_index = 0xFFF7;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
break;
case 118:
gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance_index = 0x0517;
func_800C0B60(globalCtx);
gSaveContext.respawn_flag = -2;
gSaveContext.transition_type = 2;
break;
case 119:
gSaveContext.day_time = 0x8000;
gSaveContext.environment_time = 0x8000;
globalCtx->nextEntranceIndex = 0x05F0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->fadeOutTransition = 3;
break;
}
}
}
// Command 0x2D: Transition Effects
void Cutscene_Command_TransitionFX(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase* cmd)
{
f32 temp;
if ((csCtx->frames >= cmd->startFrame) && (csCtx->frames <= cmd->endFrame))
{
globalCtx->unk_10B05 = 1;
temp = func_8006F93C(cmd->endFrame, cmd->startFrame, csCtx->frames);
switch (cmd->base)
{
case 1:
case 5:
globalCtx->unk_10B06[0] = 0xA0;
globalCtx->unk_10B06[1] = 0xA0;
globalCtx->unk_10B06[2] = 0xA0;
if (cmd->base == 1)
{
globalCtx->unk_10B06[3] = 255.0f * temp;
if ((temp == 0.0f) && (gSaveContext.entrance_index == 0x006B))
Audio_PlaySoundGeneral(NA_SE_SY_WHITE_OUT_S, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
else if ((temp == 0.0f) &&
((gSaveContext.entrance_index == 0x0053) ||
(gSaveContext.entrance_index == 0x0138) ||
(gSaveContext.entrance_index == 0x0371)))
Audio_PlaySoundGeneral(NA_SE_EV_WHITE_OUT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
else if ((temp == 0.0f) && (globalCtx->sceneNum == SCENE_GANONTIKA))
func_800788CC(NA_SE_EV_WHITE_OUT);
}
else
globalCtx->unk_10B06[3] = (1.0f - temp) * 255.0f;
break;
case 2:
case 6:
globalCtx->unk_10B06[0] = 0;
globalCtx->unk_10B06[1] = 0;
globalCtx->unk_10B06[2] = 0xFF;
if (cmd->base == 2)
globalCtx->unk_10B06[3] = 255.0f * temp;
else
globalCtx->unk_10B06[3] = (1.0f - temp) * 255.0f;
break;
case 3:
case 7:
globalCtx->unk_10B06[0] = 0xFF;
globalCtx->unk_10B06[1] = 0;
globalCtx->unk_10B06[2] = 0;
if (cmd->base == 3)
globalCtx->unk_10B06[3] = (1.0f - temp) * 255.0f;
else
globalCtx->unk_10B06[3] = 255.0f * temp;
break;
case 4:
case 8:
globalCtx->unk_10B06[0] = 0;
globalCtx->unk_10B06[1] = 0xFF;
globalCtx->unk_10B06[2] = 0;
if (cmd->base == 4)
globalCtx->unk_10B06[3] = (1.0f - temp) * 255.0f;
else
globalCtx->unk_10B06[3] = 255.0f * temp;
break;
case 9:
gSaveContext.unk_1410 = 1;
break;
case 10:
case 11:
globalCtx->unk_10B06[0] = 0;
globalCtx->unk_10B06[1] = 0;
globalCtx->unk_10B06[2] = 0;
if (cmd->base == 10)
globalCtx->unk_10B06[3] = (1.0f - temp) * 255.0f;
else
globalCtx->unk_10B06[3] = 255.0f * temp;
break;
case 12:
gSaveContext.unk_1410 = 255.0f - (155.0f * temp);
break;
case 13:
globalCtx->unk_10B06[0] = 0;
globalCtx->unk_10B06[1] = 0;
globalCtx->unk_10B06[2] = 0;
globalCtx->unk_10B06[3] = 255.0f - ((1.0f - temp) * 155.0f);
break;
}
}
}
// Command 0x1 & 0x5: Camera Positions
s32 Cutscene_Command_CameraPositions(GlobalContext* globalCtx, CutsceneContext* csCtx, u8* cmd, u8 relativeToLink)
{
s32 shouldContinue = 1;
CsCmdBase* cmdBase = (CsCmdBase*)cmd;
s32 size;
cmd += 8;
size = 8;
if ((cmdBase->startFrame < csCtx->frames) && (csCtx->frames < cmdBase->endFrame) &&
((csCtx->unk_18 < cmdBase->startFrame) || (csCtx->unk_18 >= 0xF000)))
{
csCtx->unk_1B = 1;
csCtx->cameraPosition = (CutsceneCameraPoint*)cmd;
if (csCtx->unk_1A != 0)
{
csCtx->unk_18 = cmdBase->startFrame;
if (D_8015FCC8 != 0)
{
func_800C0874(globalCtx, csCtx->unk_16, 0x25);
func_800C0314(globalCtx, D_8015FCC6, 1);
func_800C0314(globalCtx, csCtx->unk_16, 7);
func_8005AC60(func_800C04A4(globalCtx, csCtx->unk_16));
func_8005AC6C(func_800C04A4(globalCtx, csCtx->unk_16), csCtx->cameraFocus, csCtx->cameraPosition,
PLAYER, relativeToLink);
}
}
}
while (shouldContinue)
{
if (((CutsceneCameraPoint*)cmd)->continueFlag == -1)
shouldContinue = 0;
cmd += 0x10;
size += 0x10;
}
return size;
}
// Command 0x2 & 0x6: Camera Focus Points
s32 Cutscene_Command_CameraFocus(GlobalContext* globalCtx, CutsceneContext* csCtx, u8* cmd, u8 relativeToLink)
{
s32 shouldContinue = 1;
CsCmdBase* cmdBase = (CsCmdBase*)cmd;
s32 size;
cmd += 8;
size = 8;
if ((cmdBase->startFrame < csCtx->frames) && (csCtx->frames < cmdBase->endFrame) &&
((D_8015FCC0 < cmdBase->startFrame) || (D_8015FCC0 >= 0xF000)))
{
csCtx->unk_1A = 1;
csCtx->cameraFocus = (CutsceneCameraPoint*)cmd;
if (csCtx->unk_1B != 0)
{
D_8015FCC0 = cmdBase->startFrame;
if (D_8015FCC8 != 0)
{
func_800C0874(globalCtx, csCtx->unk_16, 0x25);
func_800C0314(globalCtx, D_8015FCC6, 1);
func_800C0314(globalCtx, csCtx->unk_16, 7);
func_8005AC60(func_800C04A4(globalCtx, csCtx->unk_16));
func_8005AC6C(func_800C04A4(globalCtx, csCtx->unk_16), csCtx->cameraFocus, csCtx->cameraPosition,
PLAYER, relativeToLink);
}
}
}
while (shouldContinue)
{
if (((CutsceneCameraPoint*)cmd)->continueFlag == -1)
shouldContinue = 0;
cmd += 0x10;
size += 0x10;
}
return size;
}
// Command 0x7: ? (Related to camera positons)
s32 Cutscene_Command_07(GlobalContext* globalCtx, CutsceneContext* csCtx, u8* cmd, u8 unused)
{
CsCmdBase* cmdBase = (CsCmdBase*)cmd;
s32 size;
Vec3f sp3C;
Vec3f sp30;
Camera* sp2C;
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->cameraPosition = (CutsceneCameraPoint*)cmd;
if (csCtx->unk_1A != 0)
{
D_8015FCC2 = cmdBase->startFrame;
if (D_8015FCC8 != 0)
{
sp2C = func_800C04A4(globalCtx, csCtx->unk_16);
sp2C->player = NULL;
func_800C0314(globalCtx, 0, 1);
func_800C0314(globalCtx, csCtx->unk_16, 7);
func_800C0874(globalCtx, csCtx->unk_16, 0x21);
sp28 = csCtx->cameraFocus->cameraRoll * 1.40625f;
func_8005AA90(sp2C, 64, &sp28);
sp3C.x = csCtx->cameraFocus->pos.x;
sp3C.y = csCtx->cameraFocus->pos.y;
sp3C.z = csCtx->cameraFocus->pos.z;
sp30.x = csCtx->cameraPosition->pos.x;
sp30.y = csCtx->cameraPosition->pos.y;
sp30.z = csCtx->cameraPosition->pos.z;
func_800C04D8(globalCtx, csCtx->unk_16, &sp3C, &sp30);
func_800C0704(globalCtx, csCtx->unk_16, csCtx->cameraPosition->viewAngle);
}
}
}
size += 0x10;
return size;
}
// Command 0x8: ? (Related to camera focus points)
s32 Cutscene_Command_08(GlobalContext* globalCtx, CutsceneContext* csCtx, u8* cmd, u8 unused)
{
CsCmdBase* cmdBase = (CsCmdBase*)cmd;
s32 size;
Vec3f sp3C;
Vec3f sp30;
Camera* sp2C;
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->cameraFocus = (CutsceneCameraPoint*)cmd;
if (csCtx->unk_1B != 0)
{
D_8015FCC4 = cmdBase->startFrame;
if (D_8015FCC8 != 0)
{
sp2C = func_800C04A4(globalCtx, csCtx->unk_16);
sp2C->player = NULL;
func_800C0314(globalCtx, 0, 1);
func_800C0314(globalCtx, csCtx->unk_16, 7);
func_800C0874(globalCtx, csCtx->unk_16, 0x21);
sp3C.x = csCtx->cameraFocus->pos.x;
sp3C.y = csCtx->cameraFocus->pos.y;
sp3C.z = csCtx->cameraFocus->pos.z;
sp30.x = csCtx->cameraPosition->pos.x;
sp30.y = csCtx->cameraPosition->pos.y;
sp30.z = csCtx->cameraPosition->pos.z;
func_800C04D8(globalCtx, csCtx->unk_16, &sp3C, &sp30);
func_800C0704(globalCtx, csCtx->unk_16, csCtx->cameraPosition->viewAngle);
}
}
}
size += 0x10;
return size;
}
// Command 0x13: Textbox
void Cutscene_Command_Textbox(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdTextbox* 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) && (gBitFlags[20] & gSaveContext.quest_items))
func_8010B680(globalCtx, cmd->textId1, 0);
else if ((cmd->type == 4) && (gBitFlags[19] & gSaveContext.quest_items))
func_8010B680(globalCtx, cmd->textId1, 0);
else
func_8010B680(globalCtx, cmd->base, 0);
return;
}
}
else
{
if (D_8011E1C4 != cmd->base)
{
D_8011E1C4 = cmd->base;
func_8010BD58(globalCtx, cmd->base);
return;
}
}
if (csCtx->frames >= cmd->endFrame)
{
originalCsFrames = csCtx->frames;
dialogState = func_8010BDBC(&globalCtx->msgCtx);
if ((dialogState != 2) && (dialogState != 0) && (dialogState != 7) && (dialogState != 8))
{
csCtx->frames--;
if ((dialogState == 4) && (func_80106BC8(globalCtx) != 0))
{
if (globalCtx->msgCtx.choiceIndex == 0)
{
if (cmd->textId1 != 0xFFFF)
func_8010B720(globalCtx, cmd->textId1);
else
csCtx->frames++;
}
else
{
if (cmd->textId2 != 0xFFFF)
func_8010B720(globalCtx, cmd->textId2);
else
csCtx->frames++;
}
}
if (dialogState == 9)
{
if (cmd->textId1 != 0xFFFF)
func_8010B720(globalCtx, cmd->textId1);
else
csCtx->frames++;
}
if (dialogState == 5)
{
if (func_80106BC8(globalCtx) != 0)
func_8010BD58(globalCtx, cmd->base);
}
}
if (csCtx->frames == originalCsFrames)
{
Interface_ChangeAlpha(1);
D_8011E1C0 = 0;
D_8011E1C4 = 0;
}
}
}
}
void Cutscene_ProcessCommands(GlobalContext* globalCtx, CutsceneContext* csCtx, u8* cutscenePtr)
{
s16 i;
s32 totalEntries;
s32 cmdType;
s32 cmdEntries;
CsCmdBase* cmd;
s32 cutsceneEndFrame;
s16 j;
MemCopy(&totalEntries, cutscenePtr, 4);
cutscenePtr += 4;
MemCopy(&cutsceneEndFrame, cutscenePtr, 4);
cutscenePtr += 4;
if ((cutsceneEndFrame < csCtx->frames) && (csCtx->state != CS_STATE_UNSKIPPABLE_EXEC))
{
csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
return;
}
if (!~(globalCtx->state.input[0].padPressed | -0x101))
{
csCtx->state = CS_STATE_UNSKIPPABLE_INIT;
return;
}
for (i = 0; i < totalEntries; i++)
{
MemCopy(&cmdType, cutscenePtr, 4);
cutscenePtr += 4;
if (cmdType == -1)
return;
switch (cmdType)
{
case CS_CMD_MISC:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
func_80064824(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0x30;
}
break;
case CS_CMD_SET_LIGHTING:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
Cutscene_Command_SetLighting(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0x30;
}
break;
case CS_CMD_PLAYBGM:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
Cutscene_Command_PlayBGM(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0x30;
}
break;
case CS_CMD_STOPBGM:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
Cutscene_Command_StopBGM(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0x30;
}
break;
case CS_CMD_FADEBGM:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
Cutscene_Command_FadeBGM(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0x30;
}
break;
case CS_CMD_09:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
Cutscene_Command_09(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0xC;
}
break;
case CS_CMD_SETTIME:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
func_80065134(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0xC;
}
break;
case CS_CMD_SET_ACTOR_ACTION_0:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->linkAction = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
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:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[0] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 14:
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:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[1] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 25:
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:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[2] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 29:
case 37:
case 42:
case 51:
case 53:
case 63:
case 65:
case 66:
case 75:
case 82:
case 108:
case 127:
case 133:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[3] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 30:
case 38:
case 43:
case 47:
case 54:
case 79:
case 83:
case 128:
case 135:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[4] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 44:
case 55:
case 77:
case 84:
case 90:
case 129:
case 136:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[5] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 31:
case 52:
case 57:
case 58:
case 88:
case 115:
case 130:
case 137:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[6] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 49:
case 60:
case 89:
case 111:
case 114:
case 134:
case 142:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[7] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case 62:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[8] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case CS_CMD_SET_ACTOR_ACTION_10:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if ((cmd->startFrame < csCtx->frames) && (csCtx->frames <= cmd->endFrame))
csCtx->actorActions[9] = (void*)cutscenePtr;
cutscenePtr += 0x30;
}
break;
case CS_CMD_CAMERA_POS:
cutscenePtr += Cutscene_Command_CameraPositions(globalCtx, csCtx, (void*)cutscenePtr, 0);
break;
case CS_CMD_CAMERA_POS_LINK:
cutscenePtr += Cutscene_Command_CameraPositions(globalCtx, csCtx, (void*)cutscenePtr, 1);
break;
case CS_CMD_CAMERA_FOCUS:
cutscenePtr += Cutscene_Command_CameraFocus(globalCtx, csCtx, (void*)cutscenePtr, 0);
break;
case CS_CMD_CAMERA_FOCUS_LINK:
cutscenePtr += Cutscene_Command_CameraFocus(globalCtx, csCtx, (void*)cutscenePtr, 1);
break;
case CS_CMD_07:
cutscenePtr += Cutscene_Command_07(globalCtx, csCtx, (void*)cutscenePtr, 0);
break;
case CS_CMD_08:
cutscenePtr += Cutscene_Command_08(globalCtx, csCtx, (void*)cutscenePtr, 0);
break;
case CS_CMD_TERMINATOR:
cutscenePtr += 4;
Cutscene_Command_Terminator(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 8;
break;
case CS_CMD_TEXTBOX:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
{
cmd = (CsCmdBase*)cutscenePtr;
if (cmd->base != 0xFFFF)
Cutscene_Command_Textbox(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 0xC;
}
break;
case CS_CMD_SCENE_TRANS_FX:
cutscenePtr += 4;
Cutscene_Command_TransitionFX(globalCtx, csCtx, (void*)cutscenePtr);
cutscenePtr += 8;
break;
default:
MemCopy(&cmdEntries, cutscenePtr, 4);
cutscenePtr += 4;
for (j = 0; j < cmdEntries; j++)
cutscenePtr += 0x30;
break;
}
}
}
void func_80068C3C(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
Gfx* displayList;
Gfx* prevDisplayList;
GraphicsContext* gfxCtx;
Gfx* gfxArr[4];
if (0) ; // Necessary to match
if (gSaveContext.cutscene_index >= 0xFFF0)
{
if (0) ; // Also necessary to match
if (BREG(0) != 0)
{
gfxCtx = globalCtx->state.gfxCtx;
func_800C6AC4(gfxArr, globalCtx->state.gfxCtx, "../z_demo.c", 4101);
prevDisplayList = gfxCtx->polyOpa.p;
displayList = func_800C6C20(gfxCtx->polyOpa.p);
gSPDisplayList(gfxCtx->overlay.p++, displayList);
Cutscene_DrawDebugInfo(globalCtx, &displayList, csCtx);
gSPEndDisplayList(displayList++);
func_800C6C28(prevDisplayList, displayList);
gfxCtx->polyOpa.p = displayList;
func_800C6B54(gfxArr, globalCtx->state.gfxCtx, "../z_demo.c", 4108);
}
csCtx->frames++;
if (dREG(95) != 0)
Cutscene_ProcessCommands(globalCtx, csCtx, D_8012D1F0);
else
Cutscene_ProcessCommands(globalCtx, csCtx, globalCtx->csCtx.segment);
}
}
void func_80068D84(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
if (func_8006472C(globalCtx, csCtx, 0.0f))
{
func_800F68BC(0);
csCtx->state = CS_STATE_IDLE;
}
}
void func_80068DC0(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
s16 i;
if (func_8006472C(globalCtx, csCtx, 0.0f))
{
csCtx->linkAction = NULL;
for (i = 0; i < 10; i++)
csCtx->actorActions[i] = NULL;
// Translates to: "RIGHT HERE, HUH"
osSyncPrintf("\n\n\n\n\nやっぱりここかいな");
gSaveContext.cutscene_index = 0;
gSaveContext.game_mode = 0;
if (D_8015FCC8 != 0)
{
switch (gSaveContext.entrance_index)
{
case 0x028A:
case 0x028E:
case 0x0292:
case 0x0476:
func_800C078C(globalCtx, D_8015FCC6, csCtx->unk_16);
}
func_800C0314(globalCtx, D_8015FCC6, 7);
func_800C0384(globalCtx, csCtx->unk_16);
func_8005B1A4(globalCtx->cameraCtx.activeCameraPtrs[D_8015FCC6]);
}
func_800F68BC(0);
csCtx->state = CS_STATE_IDLE;
}
}
void func_80068ECC(GlobalContext* globalCtx, CutsceneContext* csCtx)
{
u8 i;
if ((gSaveContext.cutscene_trigger != 0) && (csCtx->state == CS_STATE_IDLE) && !func_8008E988(globalCtx))
gSaveContext.cutscene_index = 0xFFFD;
if ((gSaveContext.cutscene_index >= 0xFFF0) && (csCtx->state == CS_STATE_IDLE))
{
func_8006C438(globalCtx, 0);
D_8011E1C0 = 0;
D_8011E1C4 = 0;
csCtx->unk_12 = 0;
csCtx->linkAction = NULL;
for (i = 0; i < 10; i++)
csCtx->actorActions[i] = NULL;
csCtx->state++;
if (csCtx->state == CS_STATE_SKIPPABLE_INIT)
{
func_800F68BC(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;
D_8015FCC6 = globalCtx->cameraCtx.unk_5C0;
if (D_8015FCC8 != 0)
csCtx->unk_14_all = func_800C0230(globalCtx);
if (gSaveContext.cutscene_trigger == 0)
{
Interface_ChangeAlpha(1);
func_800B3840(0x20);
func_800B38A4(0x20);
csCtx->state++;
}
func_80068C3C(globalCtx, csCtx);
}
gSaveContext.cutscene_trigger = 0;
}
}
void func_80069048(GlobalContext* globalCtx)
{
s16 i;
D_8015FCCC = 0;
for (i = 0; i < 20; i++) ; // Empty Loop
D_8015FCE4 = 0;
}
void func_8006907C(GlobalContext* globalCtx)
{
if (D_8015FCCC != 0)
D_8015FCCC = 0;
}
void Cutscene_HandleEntranceTriggers(GlobalContext* globalCtx)
{
EntranceCutscene* entranceCutscene;
u8 requiredAge;
s16 i;
for (i = 0; i < ARRAY_COUNT(sEntranceCutsceneTable); i++)
{
entranceCutscene = &sEntranceCutsceneTable[i];
requiredAge = entranceCutscene->ageRestriction;
if (requiredAge == 2)
requiredAge = gSaveContext.link_age;
if ((gSaveContext.entrance_index == entranceCutscene->entrance) &&
(!Flags_GetEventChkInf(entranceCutscene->flag) || (entranceCutscene->flag == 0x18)) &&
(gSaveContext.cutscene_index < 0xFFF0) &&
((u8)gSaveContext.link_age == requiredAge) &&
(gSaveContext.respawn_flag <= 0))
{
Flags_SetEventChkInf(entranceCutscene->flag);
Cutscene_SetSegment(globalCtx, entranceCutscene->segAddr);
gSaveContext.cutscene_trigger = 2;
gSaveContext.unk_13C7 = 0;
break;
}
}
}
#ifdef NON_MATCHING
// regalloc differences
void Cutscene_HandleConditionalTriggers(GlobalContext* globalCtx)
{
osSyncPrintf("\ngame_info.mode=[%d] restart_flag", gSaveContext.respawn_flag);
if ((gSaveContext.game_mode == 0) && (gSaveContext.respawn_flag <= 0) && (gSaveContext.cutscene_index < 0xFFF0))
{
if ((gSaveContext.entrance_index == 0x01E1) && !Flags_GetEventChkInf(0xAC))
{
Flags_SetEventChkInf(0xAC);
gSaveContext.entrance_index = 0x0123;
gSaveContext.cutscene_index = 0xFFF0;
}
else if ((gSaveContext.entrance_index == 0x00DB) && LINK_IS_ADULT &&
(gSaveContext.event_chk_inf[4] & 0x0100) && (gSaveContext.event_chk_inf[4] & 0x0200) &&
(gSaveContext.event_chk_inf[4] & 0x0400) && !Flags_GetEventChkInf(0xAA))
{
Flags_SetEventChkInf(0xAA);
gSaveContext.cutscene_index = 0xFFF0;
}
else if ((gSaveContext.entrance_index == 0x05E0) && !Flags_GetEventChkInf(0xC1))
{
Flags_SetEventChkInf(0xC1);
Item_Give(globalCtx, ITEM_OCARINA_FAIRY);
gSaveContext.entrance_index = 0x011E;
gSaveContext.cutscene_index = 0xFFF0;
}
else if ((gBitFlags[3] & gSaveContext.quest_items) && (gBitFlags[4] & gSaveContext.quest_items) &&
LINK_IS_ADULT && !Flags_GetEventChkInf(0xC4) &&
(gEntranceTable[gSaveContext.entrance_index].scene == 67))
{
Flags_SetEventChkInf(0xC4);
gSaveContext.entrance_index = 0x0053;
gSaveContext.cutscene_index = 0xFFF8;
}
else if (!Flags_GetEventChkInf(0xC7) && (gEntranceTable[gSaveContext.entrance_index].scene == 79))
{
Flags_SetEventChkInf(0xC7);
gSaveContext.entrance_index = 0x0517;
gSaveContext.cutscene_index = 0xFFF0;
}
}
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_demo/Cutscene_HandleConditionalTriggers.s")
#endif
void Cutscene_SetSegment(GlobalContext* globalCtx, u32 segment)
{
if (SEGMENT_NUMBER(segment) != 0)
globalCtx->csCtx.segment = SEGMENTED_TO_VIRTUAL(segment);
else
globalCtx->csCtx.segment = (void*)segment;
}