Shipwright/soh/src/code/z_onepointdemo.c

1378 lines
52 KiB
C
Raw Normal View History

#include "global.h"
#include "vt.h"
#include "overlays/actors/ovl_En_Sw/z_en_sw.h"
static s16 sDisableAttention = false;
static s16 sUnused = -1;
2022-05-12 13:28:24 -04:00
s32 sPrevFrameCs1100 = -4096;
2022-05-12 13:28:24 -04:00
#include "z_onepointdemo_data.inc"
void OnePointCutscene_AddVecSphToVec3f(Vec3f* dst, Vec3f* src, VecSph* vecSph) {
Vec3f out;
Vec3f vec;
OLib_VecSphGeoToVec3f(&vec, vecSph);
out.x = src->x + vec.x;
out.y = src->y + vec.y;
out.z = src->z + vec.z;
if (dst) {}
*dst = out;
}
s16 OnePointCutscene_Vec3fYaw(Vec3f* vec1, Vec3f* vec2) {
return DEGF_TO_BINANG(RADF_TO_DEGF(Math_FAtan2F(vec2->x - vec1->x, vec2->z - vec1->z)));
}
void OnePointCutscene_Vec3sToVec3f(Vec3f* src, Vec3s* dst) {
dst->x = src->x;
dst->y = src->y;
dst->z = src->z;
}
s32 OnePointCutscene_BgCheckLineTest(CollisionContext* colCtx, Vec3f* vec1, Vec3f* vec2) {
Vec3f posResult;
s32 bgId;
CollisionPoly* outPoly = NULL;
return BgCheck_CameraLineTest1(colCtx, vec1, vec2, &posResult, &outPoly, true, true, true, false, &bgId);
}
f32 OnePointCutscene_RaycastFloor(CollisionContext* colCtx, Vec3f* pos) {
CollisionPoly* outPoly;
s32 bgId;
return BgCheck_EntityRaycastFloor3(colCtx, &outPoly, &bgId, pos);
}
void OnePointCutscene_SetCsCamPoints(Camera* camera, s16 actionParameters, s16 initTimer, CutsceneCameraPoint* atPoints,
CutsceneCameraPoint* eyePoints) {
OnePointCsCamera* onePointCamData = (OnePointCsCamera*)&camera->paramData;
onePointCamData->atPoints = atPoints;
onePointCamData->eyePoints = eyePoints;
onePointCamData->actionParameters = actionParameters;
onePointCamData->initTimer = initTimer;
}
s32 OnePointCutscene_SetInfo(GlobalContext* globalCtx, s16 camIdx, s16 csId, Actor* actor, s16 timer) {
Camera* csCam = globalCtx->cameraPtrs[camIdx];
Camera* childCam = globalCtx->cameraPtrs[csCam->childCamIdx];
Camera* mainCam = globalCtx->cameraPtrs[MAIN_CAM];
Player* player = mainCam->player;
VecSph spD0;
s32 i;
Vec3f spC0;
Vec3f spB4;
PosRot spA0;
PosRot sp8C;
f32 tempRand;
Unique9OnePointCs* csInfo = ONEPOINT_CS_INFO(csCam);
switch (csId) {
case 1020:
if (timer < 20) {
timer = 20;
}
D_801208EC[0].atTargetInit = globalCtx->view.lookAt;
D_801208EC[0].eyeTargetInit = globalCtx->view.eye;
D_801208EC[0].fovTargetInit = globalCtx->view.fovy;
D_801208EC[1].atTargetInit = mainCam->at;
D_801208EC[1].eyeTargetInit = mainCam->eye;
D_801208EC[1].fovTargetInit = mainCam->fov;
D_801208EC[1].timerInit = timer - 1;
csCam->timer = timer + 1;
D_801208EC[1].lerpStepScale = 1.0f / (0.5f * timer);
csInfo->keyFrames = D_801208EC;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 1030:
D_80120964[0].atTargetInit = globalCtx->view.lookAt;
D_80120964[0].eyeTargetInit = globalCtx->view.eye;
D_80120964[0].fovTargetInit = globalCtx->view.fovy;
OLib_Vec3fDiffToVecSphGeo(&spD0, &mainCam->at, &mainCam->eye);
D_80120964[1].eyeTargetInit.y = BINANG_TO_DEGF(spD0.yaw);
D_80120964[1].timerInit = timer - 1;
csInfo->keyFrames = D_80120964;
csInfo->keyFrameCnt = 2;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 5000:
D_801209B4[0].atTargetInit = D_801209B4[1].atTargetInit = globalCtx->view.lookAt;
D_801209B4[0].eyeTargetInit = globalCtx->view.eye;
D_801209B4[0].fovTargetInit = D_801209B4[2].fovTargetInit = globalCtx->view.fovy;
OLib_Vec3fDiffToVecSphGeo(&spD0, &actor->focus.pos, &mainCam->at);
spD0.r = mainCam->dist;
OnePointCutscene_AddVecSphToVec3f(&D_801209B4[1].eyeTargetInit, &D_801209B4[1].atTargetInit, &spD0);
D_801209B4[1].atTargetInit.y += 20.0f;
csInfo->keyFrames = D_801209B4;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 5010:
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_ATTENTION);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &mainCam->at, &mainCam->eye);
csCam->roll = 0;
break;
case 9500:
csInfo->keyFrames = D_80120A54;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 2260:
D_80120ACC[0].atTargetInit.x = D_80120ACC[2].atTargetInit.x =
((mainCam->globalCtx->state.frames & 1) ? -10.0f : 10.0f) + (Rand_ZeroOne() * 8.0f);
D_80120ACC[0].eyeTargetInit.x = D_80120ACC[2].eyeTargetInit.x =
((mainCam->globalCtx->state.frames & 1) ? 20.0f : -20.0f) + (Rand_ZeroOne() * 5.0f);
csInfo->keyFrames = D_80120ACC;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 2270:
csInfo->keyFrames = D_80120B94;
csInfo->keyFrameCnt = 11;
for (i = 0; i < csInfo->keyFrameCnt - 3; i++) {
if (D_80120B94[i].actionFlags != 0x8F) {
D_80120B94[i].atTargetInit.x = Rand_ZeroOne() * 5.0f;
D_80120B94[i].atTargetInit.z = (Rand_ZeroOne() * 30.0f) + 10.0f;
D_80120B94[i].eyeTargetInit.x = (Rand_ZeroOne() * 100.0f) + 20.0f;
D_80120B94[i].eyeTargetInit.z = (Rand_ZeroOne() * 80.0f) + 50.0f;
}
}
D_80120B94[camIdx - 1].eyeTargetInit.y =
((mainCam->globalCtx->state.frames & 1) ? 3.0f : -3.0f) + Rand_ZeroOne();
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 5);
Quake_SetSpeed(i, 400);
Quake_SetQuakeValues(i, 4, 5, 40, 0x3C);
Quake_SetCountdown(i, 1600);
break;
case 2280:
csInfo->keyFrames = D_80120D4C;
csInfo->keyFrameCnt = 7;
for (i = 0; i < csInfo->keyFrameCnt - 3; i++) {
if (D_80120D4C[i].actionFlags != 0x8F) {
D_80120D4C[i].atTargetInit.x = Rand_ZeroOne() * 20.0f;
D_80120D4C[i].atTargetInit.z = (Rand_ZeroOne() * 40.0f) + 10.0f;
D_80120D4C[i].eyeTargetInit.x = (Rand_ZeroOne() * 40.0f) + 60.0f;
D_80120D4C[i].eyeTargetInit.z = (Rand_ZeroOne() * 40.0f) + 80.0f;
}
}
D_80120D4C[camIdx - 1].eyeTargetInit.y =
((mainCam->globalCtx->state.frames & 1) ? 3.0f : -3.0f) + Rand_ZeroOne();
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 5);
Quake_SetSpeed(i, 400);
Quake_SetQuakeValues(i, 2, 3, 200, 0x32);
Quake_SetCountdown(i, 9999);
break;
case 2220:
csInfo->keyFrames = D_80120E64;
csInfo->keyFrameCnt = 8;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 5);
Quake_SetSpeed(i, 400);
Quake_SetQuakeValues(i, 2, 2, 50, 0);
Quake_SetCountdown(i, 280);
break;
case 2230:
if (player->actor.world.pos.z < 1000.0f) {
D_80120FA4[0].eyeTargetInit.x = -D_80120FA4[0].eyeTargetInit.x;
D_80120FA4[2].eyeTargetInit.x = -D_80120FA4[2].eyeTargetInit.x;
}
csInfo->keyFrames = D_80120FA4;
csInfo->keyFrameCnt = 6;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 2340:
csInfo->keyFrames = D_80121094;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 5);
Quake_SetSpeed(i, 400);
Quake_SetQuakeValues(i, 2, 2, 50, 0);
Quake_SetCountdown(i, 60);
break;
case 2350:
csInfo->keyFrames = D_8012110C;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 2200: {
s16 sp82;
s16 sp80;
s16 sp7E;
s16 sp7C;
Actor_GetScreenPos(globalCtx, &player->actor, &sp82, &sp7E);
Actor_GetScreenPos(globalCtx, actor, &sp80, &sp7C);
if ((sp82 > 0) && (sp82 < 320) && (sp7E > 0) && (sp7E < 240) && (sp80 > 0) && (sp80 < 320) && (sp7C > 0) &&
(sp7C < 240) &&
!OnePointCutscene_BgCheckLineTest(&globalCtx->colCtx, &actor->focus.pos, &player->actor.focus.pos)) {
D_80121184[0].atTargetInit.x = (globalCtx->view.lookAt.x + actor->focus.pos.x) * 0.5f;
D_80121184[0].atTargetInit.y = (globalCtx->view.lookAt.y + actor->focus.pos.y) * 0.5f;
D_80121184[0].atTargetInit.z = (globalCtx->view.lookAt.z + actor->focus.pos.z) * 0.5f;
D_80121184[0].eyeTargetInit = globalCtx->view.eye;
D_80121184[0].eyeTargetInit.y = player->actor.focus.pos.y + 20.0f;
D_80121184[0].fovTargetInit = mainCam->fov * 0.75f;
csInfo->keyFrames = D_80121184;
csInfo->keyFrameCnt = 2;
} else {
D_801211D4[0].atTargetInit.x = actor->focus.pos.x;
D_801211D4[0].atTargetInit.y = actor->focus.pos.y - 5.0f;
D_801211D4[0].atTargetInit.z = actor->focus.pos.z;
spC0 = ((EnSw*)actor)->unk_364;
osSyncPrintf("%s(%d): xyz_t: %s (%f %f %f)\n", "../z_onepointdemo.c", 1671, "&cp", spC0.x, spC0.y,
spC0.z);
D_801211D4[0].eyeTargetInit.x = (actor->focus.pos.x + (120.0f * spC0.x)) - (Rand_ZeroOne() * 20.0f);
D_801211D4[0].eyeTargetInit.y = actor->focus.pos.y + (120.0f * spC0.y) + 20.0f;
D_801211D4[0].eyeTargetInit.z = (actor->focus.pos.z + (120.0f * spC0.z)) - (Rand_ZeroOne() * 20.0f);
csInfo->keyFrames = D_801211D4;
csInfo->keyFrameCnt = 2;
}
Gameplay_ChangeCameraStatus(globalCtx, MAIN_CAM, CAM_STAT_UNK3);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
} break;
case 2290: {
Actor* rideActor = player->rideActor;
func_8002DF54(globalCtx, NULL, 8);
if (rideActor != NULL) {
rideActor->freezeTimer = 180;
}
csInfo->keyFrames = D_80121224;
csInfo->keyFrameCnt = 6;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
} break;
case 5120:
func_8002DF54(globalCtx, NULL, 8);
csInfo->keyFrames = D_80121314;
csInfo->keyFrameCnt = 1;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4510:
D_8012133C[0].eyeTargetInit = actor->world.pos;
D_8012133C[0].eyeTargetInit.y = player->actor.world.pos.y + 40.0f;
func_8002DF54(globalCtx, NULL, 8);
csInfo->keyFrames = D_8012133C;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4500:
Actor_GetFocus(&spA0, actor);
spC0 = spA0.pos;
spC0.y = OnePointCutscene_RaycastFloor(&globalCtx->colCtx, &spC0) + 40.0f;
spD0.r = 150.0f;
spD0.yaw = spA0.rot.y;
spD0.pitch = 0x3E8;
OnePointCutscene_AddVecSphToVec3f(&spB4, &spC0, &spD0);
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
func_8002DF54(globalCtx, NULL, 8);
csCam->roll = 0;
csCam->fov = 50.0f;
if (csCam->childCamIdx != SUBCAM_FREE) {
OnePointCutscene_EndCutscene(globalCtx, csCam->childCamIdx);
}
break;
case 2210:
OLib_Vec3fDiffToVecSphGeo(&spD0, &player->actor.world.pos, &actor->world.pos);
D_801213B4[0].eyeTargetInit.y = D_801213B4[1].eyeTargetInit.y = D_801213B4[2].eyeTargetInit.y =
D_801213B4[2].atTargetInit.y = BINANG_TO_DEGF(spD0.yaw);
if (Rand_ZeroOne() < 0.0f) {
D_801213B4[3].eyeTargetInit.x = -D_801213B4[3].eyeTargetInit.x;
}
func_8002DF54(globalCtx, NULL, 8);
csInfo->keyFrames = D_801213B4;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 1010:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &childCam->at, &childCam->eye);
Gameplay_CameraSetFov(globalCtx, camIdx, childCam->fov);
Gameplay_SetCameraRoll(globalCtx, camIdx, childCam->roll);
break;
case 9601:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_CS_3);
Gameplay_CameraChangeSetting(globalCtx, MAIN_CAM, mainCam->prevSetting);
OnePointCutscene_SetCsCamPoints(csCam, D_80120430 | 0x1000, D_8012042C, D_80120308, D_80120398);
break;
case 9602:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_CS_3);
Gameplay_CameraChangeSetting(globalCtx, MAIN_CAM, mainCam->prevSetting);
OnePointCutscene_SetCsCamPoints(csCam, D_80120430 | 0x1000, D_8012042C, D_80120308, D_80120434);
break;
case 4175:
csInfo->keyFrames = D_8012147C;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4180:
spC0.x = -1881.0f;
spC0.y = 766.0f;
spC0.z = -330.0f;
spB4.x = -1979.0f;
spB4.y = 703.0f;
spB4.z = -269.0f;
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 6;
csCam->fov = 75.0f;
func_8002DF54(globalCtx, NULL, 8);
break;
case 3040:
func_8002DF54(globalCtx, NULL, 8);
D_8012151C[0].timerInit = timer - 1;
csInfo->keyFrames = D_8012151C;
csInfo->keyFrameCnt = 2;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3020:
D_8012156C[1].timerInit = timer - 1;
if (mainCam->globalCtx->state.frames & 1) {
D_8012156C[0].atTargetInit.x = -D_8012156C[0].atTargetInit.x;
D_8012156C[0].eyeTargetInit.x = -D_8012156C[0].eyeTargetInit.x;
D_8012156C[1].atTargetInit.x = -D_8012156C[1].atTargetInit.x;
D_8012156C[1].eyeTargetInit.x = -D_8012156C[1].eyeTargetInit.x;
}
tempRand = Rand_ZeroOne() * 15.0f;
D_8012156C[0].eyeTargetInit.x += tempRand;
D_8012156C[1].eyeTargetInit.x += tempRand;
csInfo->keyFrames = D_8012156C;
csInfo->keyFrameCnt = 2;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
func_8002DF54(globalCtx, NULL, 8);
break;
case 3010:
D_801215BC[0].timerInit = timer;
csInfo->keyFrames = D_801215BC;
csInfo->keyFrameCnt = 1;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3070:
csInfo->keyFrames = D_801215E4;
csInfo->keyFrameCnt = 10;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 3);
Quake_SetSpeed(i, 22000);
Quake_SetQuakeValues(i, 2, 0, 200, 0);
Quake_SetCountdown(i, 10);
break;
case 3080:
csInfo->keyFrames = D_80121774;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3090:
func_8002DF54(globalCtx, NULL, 8);
csInfo->keyFrames = D_80121814;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3100:
VEC_SET(spB4, 0.0f, -280.0f, -1400.0f);
Actor_GetFocus(&spA0, actor);
spC0 = spA0.pos;
func_800C0808(globalCtx, camIdx, player, CAM_SET_PIVOT_VERTICAL);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 0;
csCam->fov = 70.0f;
func_8002DF54(globalCtx, NULL, 8);
break;
case 3380:
case 3065:
csInfo->keyFrames = D_801218B4;
csInfo->keyFrameCnt = 2;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 24000);
Quake_SetQuakeValues(i, 2, 0, 0, 0);
Quake_SetCountdown(i, 160);
break;
case 3060:
csInfo->keyFrames = D_80121904;
csInfo->keyFrameCnt = 2;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3050:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_CS_3);
func_8002DF54(globalCtx, &player->actor, 5);
OnePointCutscene_SetCsCamPoints(csCam, D_80120304 | 0x2000, D_80120300, D_8012013C, D_8012021C);
func_80078884(NA_SE_SY_CORRECT_CHIME);
OnePointCutscene_Vec3sToVec3f(&mainCam->at, &D_8012013C[D_801202FC - 2].pos);
OnePointCutscene_Vec3sToVec3f(&mainCam->eye, &D_8012021C[D_801202FC - 2].pos);
D_8012013C[D_801202FC - 3].pos.x +=
(D_8012013C[D_801202FC - 2].pos.x - D_8012013C[D_801202FC - 3].pos.x) / 2;
D_8012013C[D_801202FC - 3].pos.y +=
(D_8012013C[D_801202FC - 2].pos.y - D_8012013C[D_801202FC - 3].pos.y) / 2;
D_8012013C[D_801202FC - 3].pos.z +=
(D_8012013C[D_801202FC - 2].pos.z - D_8012013C[D_801202FC - 3].pos.z) / 2;
D_8012021C[D_801202FC - 3].pos.x +=
(D_8012021C[D_801202FC - 2].pos.x - D_8012021C[D_801202FC - 3].pos.x) / 2;
D_8012021C[D_801202FC - 3].pos.y +=
(D_8012021C[D_801202FC - 2].pos.y - D_8012021C[D_801202FC - 3].pos.y) / 2;
D_8012021C[D_801202FC - 3].pos.z +=
(D_8012021C[D_801202FC - 2].pos.z - D_8012021C[D_801202FC - 3].pos.z) / 2;
i = Quake_Add(mainCam, 3);
Quake_SetSpeed(i, 30000);
Quake_SetQuakeValues(i, 2, 1, 1, 0);
Quake_SetCountdown(i, 200);
break;
case 3120:
csInfo->keyFrames = D_80121954[-(timer + 101)];
csCam->timer = 100;
csCam->unk_14C |= 2;
csInfo->keyFrameCnt = 2;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3130:
csInfo->keyFrames = D_80121A44;
csInfo->keyFrameCnt = 12;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
csCam->unk_14C |= 2;
break;
case 3140:
D_80121C24[0].atTargetInit = globalCtx->view.lookAt;
D_80121C24[0].eyeTargetInit = globalCtx->view.eye;
D_80121C24[0].fovTargetInit = globalCtx->view.fovy;
csInfo->keyFrames = D_80121C24;
csInfo->keyFrameCnt = 7;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3150:
spC0.x = 1890.0f;
spC0.y = 886.0f;
spC0.z = -1432.0f;
spB4.x = 1729.0f;
spB4.y = 995.0f;
spB4.z = -1405.0f;
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 0x50;
csCam->fov = 55.0f;
func_8002DF38(globalCtx, &player->actor, 8);
break;
case 3170:
Actor_GetWorld(&spA0, actor);
spC0 = spA0.pos;
spD0.pitch = -0x5DC;
spC0.y += 50.0f;
spD0.r = 250.0f;
Actor_GetWorld(&spA0, &player->actor);
spD0.yaw = OnePointCutscene_Vec3fYaw(&spC0, &spA0.pos) - 0x7D0;
OnePointCutscene_AddVecSphToVec3f(&spB4, &spC0, &spD0);
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
Gameplay_CopyCamera(globalCtx, MAIN_CAM, camIdx);
csCam->roll = -1;
csCam->fov = 55.0f;
func_8002DF38(globalCtx, actor, 1);
break;
case 3160:
Actor_GetWorld(&spA0, actor);
spC0 = spA0.pos;
spD0.pitch = 0;
spD0.yaw = spA0.rot.y;
spD0.r = 150.0f;
OnePointCutscene_AddVecSphToVec3f(&spB4, &spC0, &spD0);
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 0;
csCam->fov = 55.0f;
func_8002DF38(globalCtx, &player->actor, 8);
break;
case 3180:
Actor_GetWorldPosShapeRot(&spA0, actor);
spC0 = spA0.pos;
spC0.y += 120.0f;
spD0.r = 300.0f;
spD0.yaw = spA0.rot.y;
spD0.pitch = -0xAF0;
OnePointCutscene_AddVecSphToVec3f(&spB4, &spC0, &spD0);
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 0;
csCam->fov = 60.0f;
func_8002DF38(globalCtx, actor, 1);
break;
case 3190:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FOREST_DEFEAT_POE);
Camera_ChangeMode(mainCam, CAM_MODE_NORMAL);
func_8002DF38(globalCtx, actor, 0xC);
break;
case 3230:
spC0.x = 120.0f;
spC0.y = 265.0f;
spC0.z = -1570.0f;
spB4.x = 80.0f;
spB4.y = 445.0f;
spB4.z = -1425.0f;
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 0x1E;
csCam->fov = 75.0f;
func_8002DF38(globalCtx, &player->actor, 8);
Actor_GetWorldPosShapeRot(&spA0, actor);
Actor_GetFocus(&sp8C, &player->actor);
spC0.x = sp8C.pos.x;
spC0.y = sp8C.pos.y + 70.0f;
spC0.z = sp8C.pos.z;
OLib_Vec3fDiffToVecSphGeo(&spD0, &spA0.pos, &sp8C.pos);
spD0.pitch = 0x5DC;
spD0.r = 120.0f;
OnePointCutscene_AddVecSphToVec3f(&spB4, &spC0, &spD0);
Gameplay_CameraSetAtEye(globalCtx, MAIN_CAM, &spC0, &spB4);
i = Quake_Add(csCam, 3);
Quake_SetSpeed(i, 22000);
Quake_SetQuakeValues(i, 1, 0, 0, 0);
Quake_SetCountdown(i, 90);
break;
case 6010:
Actor_GetWorld(&spA0, actor);
spC0 = spA0.pos;
spD0.pitch = 0;
spC0.y += 70.0f;
spD0.yaw = spA0.rot.y + 0x7FFF;
spD0.r = 300.0f;
OnePointCutscene_AddVecSphToVec3f(&spB4, &spC0, &spD0);
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 0;
csCam->fov = 45.0f;
func_8002DF38(globalCtx, &player->actor, 8);
break;
case 3220:
Actor_GetFocus(&spA0, actor);
spC0 = spA0.pos;
func_800C0808(globalCtx, camIdx, player, CAM_SET_PIVOT_VERTICAL);
Actor_GetWorld(&spA0, &player->actor);
OLib_Vec3fDiffToVecSphGeo(&spD0, &spC0, &spA0.pos);
spD0.yaw += 0x3E8;
spD0.r = 400.0f;
OnePointCutscene_AddVecSphToVec3f(&spB4, &spC0, &spD0);
spB4.y = spA0.pos.y + 60.0f;
Gameplay_CameraSetAtEye(globalCtx, camIdx, &spC0, &spB4);
csCam->roll = 0;
csCam->fov = 75.0f;
player->actor.shape.rot.y = player->actor.world.rot.y = player->currentYaw = spD0.yaw + 0x7FFF;
func_8002DF54(globalCtx, NULL, 8);
break;
case 3240:
D_80121D3C[2].timerInit = timer - 5;
csInfo->keyFrames = D_80121D3C;
csInfo->keyFrameCnt = 3;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 6001:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_CS_3);
func_8002DF54(globalCtx, NULL, 8);
Actor_GetWorld(&spA0, actor);
if (spA0.pos.z > -750.0f) {
OnePointCutscene_SetCsCamPoints(csCam, D_801208E8, D_801208E4, D_801206A0, D_80120820);
} else {
OnePointCutscene_SetCsCamPoints(csCam, D_801208E8, D_801208E4, D_801206A0, D_80120760);
}
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 32000);
Quake_SetQuakeValues(i, 0, 0, 20, 0);
Quake_SetCountdown(i, D_801208E4 - 10);
break;
case 3400:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_CS_3);
func_8002DF38(globalCtx, &player->actor, 8);
OnePointCutscene_SetCsCamPoints(csCam, D_8012069C | 0x2000, D_80120698, D_801204D4, D_801205B4);
OnePointCutscene_Vec3sToVec3f(&mainCam->eye, &D_801205B4[D_80120694 - 2].pos);
OnePointCutscene_Vec3sToVec3f(&mainCam->at, &D_801204D4[D_80120694 - 2].pos);
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 0x4E20);
Quake_SetQuakeValues(i, 1, 0, 50, 0);
Quake_SetCountdown(i, D_80120698 - 20);
break;
case 3390:
player->actor.shape.rot.y = player->actor.world.rot.y = player->currentYaw = -0x3FD9;
csInfo->keyFrames = D_80121DB4;
csInfo->keyFrameCnt = 9;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3310:
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FIRE_STAIRCASE);
func_8002DF54(globalCtx, NULL, 8);
Gameplay_CopyCamera(globalCtx, camIdx, MAIN_CAM);
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 32000);
Quake_SetQuakeValues(i, 2, 0, 0, 0);
Quake_SetCountdown(i, timer);
break;
case 3290:
D_80121F1C[0].atTargetInit = globalCtx->view.lookAt;
D_80121F1C[0].eyeTargetInit = globalCtx->view.eye;
D_80121F1C[0].fovTargetInit = globalCtx->view.fovy;
Actor_GetFocus(&spA0, actor);
player->actor.shape.rot.y = player->actor.world.rot.y = player->currentYaw = spA0.rot.y;
csInfo->keyFrames = D_80121F1C;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 3);
Quake_SetSpeed(i, 12000);
Quake_SetQuakeValues(i, 0, 0, 1000, 0);
Quake_SetCountdown(i, 5);
break;
case 3340:
D_80121FBC[0].atTargetInit = globalCtx->view.lookAt;
D_80121FBC[0].eyeTargetInit = globalCtx->view.eye;
D_80121FBC[0].fovTargetInit = globalCtx->view.fovy;
csInfo->keyFrames = D_80121FBC;
csInfo->keyFrameCnt = 4;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 3);
Quake_SetSpeed(i, 12000);
Quake_SetQuakeValues(i, 0, 0, 1000, 0);
Quake_SetCountdown(i, 5);
break;
case 3360:
csInfo->keyFrames = D_8012205C;
csInfo->keyFrameCnt = 3;
func_8002DF38(globalCtx, &player->actor, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3350:
D_801220D4[0].atTargetInit = globalCtx->view.lookAt;
D_801220D4[0].eyeTargetInit = globalCtx->view.eye;
D_801220D4[0].fovTargetInit = globalCtx->view.fovy;
if (actor->world.pos.x > 0.0f) {
D_801220D4[1].rollTargetInit = -D_801220D4[1].rollTargetInit;
D_801220D4[2].rollTargetInit = -D_801220D4[2].rollTargetInit;
D_801220D4[1].atTargetInit.x = -D_801220D4[1].atTargetInit.x;
D_801220D4[1].atTargetInit.y = 50.0f;
D_801220D4[1].eyeTargetInit.y = 80.0f;
D_801220D4[1].eyeTargetInit.x = -D_801220D4[1].eyeTargetInit.x;
}
func_8002DF54(globalCtx, NULL, 8);
csInfo->keyFrames = D_801220D4;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3330:
csInfo->keyFrames = D_8012219C;
csInfo->keyFrameCnt = 7;
func_8002DF38(globalCtx, &player->actor, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3410:
csInfo->keyFrames = D_801222B4;
csInfo->keyFrameCnt = 5;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 32000);
Quake_SetQuakeValues(i, 4, 0, 0, 0);
Quake_SetCountdown(i, 20);
break;
case 3450:
csInfo->keyFrames = D_8012237C;
csInfo->keyFrameCnt = 2;
func_8002DF38(globalCtx, &player->actor, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 32000);
Quake_SetQuakeValues(i, 2, 0, 0, 0);
Quake_SetCountdown(i, 10);
break;
case 3440:
csInfo->keyFrames = D_801223CC;
csInfo->keyFrameCnt = 6;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
player->stateFlags1 |= 0x20000000;
player->actor.freezeTimer = 90;
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 32000);
Quake_SetQuakeValues(i, 2, 0, 0, 0);
Quake_SetCountdown(i, 10);
break;
case 3430:
csInfo->keyFrames = D_801224BC;
csInfo->keyFrameCnt = 7;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 1);
Quake_SetSpeed(i, 32000);
Quake_SetQuakeValues(i, 1, 0, 10, 0);
Quake_SetCountdown(i, 20);
break;
case 4100:
csInfo->keyFrames = D_801225D4;
csInfo->keyFrameCnt = 5;
player->actor.shape.rot.y = player->actor.world.rot.y = player->currentYaw = 0x3FFC;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
func_8002DF54(globalCtx, NULL, 8);
break;
case 4110:
csInfo->keyFrames = D_8012269C;
csInfo->keyFrameCnt = 3;
func_8002DF38(globalCtx, &player->actor, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4120:
func_8002DF54(globalCtx, NULL, 8);
D_80122714[1].timerInit = 80;
csInfo->keyFrames = D_80122714;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4140:
csInfo->keyFrames = D_801227B4;
csInfo->keyFrameCnt = 6;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
Camera_ChangeMode(mainCam, CAM_MODE_NORMAL);
break;
case 4150:
csInfo->keyFrames = D_801228A4;
csInfo->keyFrameCnt = 5;
func_8002DF54(globalCtx, NULL, 8);
Camera_ChangeMode(mainCam, CAM_MODE_NORMAL);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4160:
csInfo->keyFrames = D_8012296C;
csInfo->keyFrameCnt = 4;
func_8002DF54(globalCtx, NULL, 8);
Camera_ChangeMode(mainCam, CAM_MODE_NORMAL);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4170:
csInfo->keyFrames = D_80122A0C;
csInfo->keyFrameCnt = 2;
func_8002DF54(globalCtx, NULL, 8);
Camera_ChangeMode(mainCam, CAM_MODE_NORMAL);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4190:
csInfo->keyFrames = D_80122A5C;
csInfo->keyFrameCnt = 8;
func_8002DF38(globalCtx, &player->actor, 8);
Camera_ChangeMode(mainCam, CAM_MODE_NORMAL);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4200:
csInfo->keyFrames = D_80122B9C;
csInfo->keyFrameCnt = 3;
func_8002DF38(globalCtx, &player->actor, 8);
Camera_ChangeMode(mainCam, CAM_MODE_NORMAL);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4210:
player->actor.freezeTimer = timer;
csInfo->keyFrames = D_80122C14;
csInfo->keyFrameCnt = 1;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
i = Quake_Add(csCam, 3);
Quake_SetSpeed(i, 12000);
Quake_SetQuakeValues(i, 0, 1, 100, 0);
Quake_SetCountdown(i, timer - 80);
break;
case 4220:
csInfo->keyFrames = (player->actor.world.pos.z < -15.0f) ? D_80122C3C : D_80122C64;
csInfo->keyFrameCnt = 1;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
func_8002DF38(globalCtx, &player->actor, 1);
i = Quake_Add(csCam, 3);
Quake_SetSpeed(i, 12000);
Quake_SetQuakeValues(i, 0, 1, 10, 0);
Quake_SetCountdown(i, timer - 10);
break;
case 4221:
csInfo->keyFrames = D_80122C8C;
csInfo->keyFrameCnt = 1;
func_8002DF54(globalCtx, NULL, 8);
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3260:
func_8002DF54(globalCtx, NULL, 8);
D_80122CB4[1].timerInit = timer - 5;
csInfo->keyFrames = D_80122CB4;
csInfo->keyFrameCnt = 2;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 3261:
func_8002DF54(globalCtx, NULL, 8);
D_80122D04[1].timerInit = timer - 10;
csInfo->keyFrames = D_80122D04;
csInfo->keyFrameCnt = 2;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 8010:
csInfo->keyFrames = D_80122D54;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 8002:
csInfo->keyFrames = D_80122DCC;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 8700:
Actor_GetFocus(&spA0, actor);
Actor_GetFocus(&sp8C, &player->actor);
D_80122E44[timer & 1][0].atTargetInit.y = ((spA0.pos.y - sp8C.pos.y) / 10.0f) + 90.0f;
D_80122E44[timer & 1][5].atTargetInit = mainCam->at;
csInfo->keyFrames = D_80122E44[timer & 1];
csInfo->keyFrameCnt = 7;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 1100: {
s32 tempDiff = globalCtx->state.frames - sPrevFrameCs1100;
if ((tempDiff > 3600) || (tempDiff < -3600)) {
csInfo->keyFrames = D_80123074;
csInfo->keyFrameCnt = 5;
} else {
if (globalCtx->state.frames & 1) {
D_8012313C[0].rollTargetInit = -D_8012313C[0].rollTargetInit;
D_8012313C[0].atTargetInit.y = -D_8012313C[0].atTargetInit.y;
D_8012313C[0].eyeTargetInit.y = -D_8012313C[0].eyeTargetInit.y;
D_8012313C[1].atTargetInit.y = -D_8012313C[1].atTargetInit.y;
}
csInfo->keyFrames = D_8012313C;
csInfo->keyFrameCnt = 3;
}
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
sPrevFrameCs1100 = globalCtx->state.frames;
} break;
case 9806:
csCam->timer = -99;
if (func_800C0CB8(globalCtx)) {
func_800C0808(globalCtx, camIdx, player, CAM_SET_TURN_AROUND);
csCam->data2 = 0xC;
} else {
Gameplay_CopyCamera(globalCtx, camIdx, MAIN_CAM);
Gameplay_CameraChangeSetting(globalCtx, camIdx, CAM_SET_FREE2);
}
break;
case 9908:
if (func_800C0CB8(globalCtx)) {
D_801231B4[0].eyeTargetInit.z = D_801231B4[1].eyeTargetInit.z = !LINK_IS_ADULT ? 100.0f : 120.0f;
if (player->stateFlags1 & 0x08000000) {
D_801231B4[2].atTargetInit.z = 0.0f;
}
Actor_GetWorldPosShapeRot(&spA0, &player->actor);
OLib_Vec3fDiffToVecSphGeo(&spD0, &spA0.pos, &mainCam->at);
spD0.yaw -= spA0.rot.y;
OLib_VecSphGeoToVec3f(&D_801231B4[3].atTargetInit, &spD0);
OLib_Vec3fDiffToVecSphGeo(&spD0, &spA0.pos, &mainCam->eye);
spD0.yaw -= spA0.rot.y;
OLib_VecSphGeoToVec3f(&D_801231B4[3].eyeTargetInit, &spD0);
D_801231B4[3].fovTargetInit = mainCam->fov;
D_801231B4[3].timerInit = timer - 50;
csInfo->keyFrames = D_801231B4;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
} else {
D_80123254[1].timerInit = timer - 1;
D_80123254[0].fovTargetInit = mainCam->fov;
D_80123254[0].atTargetInit = D_80123254[1].atTargetInit = mainCam->at;
D_80123254[0].eyeTargetInit = D_80123254[1].eyeTargetInit = mainCam->eye;
csInfo->keyFrames = D_80123254;
csInfo->keyFrameCnt = 2;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
}
break;
case 1000:
D_801232A4[0].atTargetInit = globalCtx->view.lookAt;
D_801232A4[0].eyeTargetInit = globalCtx->view.eye;
D_801232A4[0].fovTargetInit = globalCtx->view.fovy;
csInfo->keyFrames = D_801232A4;
csInfo->keyFrameCnt = 1;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 8603:
csInfo->keyFrames = D_801232CC;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 8604:
csInfo->keyFrames = D_80123394;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4000:
csInfo->keyFrames = D_8012345C;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4010:
csInfo->keyFrames = D_801234FC;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4011:
csInfo->keyFrames = D_801235C4;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4020:
csInfo->keyFrames = D_8012368C;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4021:
csInfo->keyFrames = D_8012372C;
csInfo->keyFrameCnt = 4;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 4022:
csCam->timer = D_801237CC[0].timerInit + D_801237CC[3].timerInit + D_801237CC[1].timerInit +
D_801237CC[2].timerInit + D_801237CC[4].timerInit;
csInfo->keyFrames = D_801237CC;
csInfo->keyFrameCnt = 5;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 9703:
D_80123894[0].atTargetInit = globalCtx->view.lookAt;
D_80123894[0].eyeTargetInit = globalCtx->view.eye;
D_80123894[0].fovTargetInit = globalCtx->view.fovy;
if (LINK_IS_ADULT) {
D_80123894[1].atTargetInit.y = 60.0f;
D_80123894[1].eyeTargetInit.y = 52.0f;
}
csInfo->keyFrames = D_80123894;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 9704:
D_8012390C[0].atTargetInit = globalCtx->view.lookAt;
D_8012390C[0].eyeTargetInit = globalCtx->view.eye;
D_8012390C[0].fovTargetInit = globalCtx->view.fovy;
csInfo->keyFrames = D_8012390C;
csInfo->keyFrameCnt = 2;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 9705:
D_8012395C[0].atTargetInit = globalCtx->view.lookAt;
D_8012395C[0].eyeTargetInit = globalCtx->view.eye;
D_8012395C[0].fovTargetInit = globalCtx->view.fovy;
csInfo->keyFrames = D_8012395C;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, player, CAM_SET_CS_C);
break;
case 5110:
D_801239D4[1].timerInit = 10;
csInfo->keyFrames = D_801239D4;
csInfo->keyFrameCnt = 3;
func_800C0808(globalCtx, camIdx, (Player*)actor, CAM_SET_CS_C);
break;
default:
osSyncPrintf(VT_COL(RED, WHITE) "onepointdemo camera: demo number not found !! (%d)\n" VT_RST, csId);
break;
}
return 0;
}
s16 OnePointCutscene_SetAsChild(GlobalContext* globalCtx, s16 newCamIdx, s16 parentCamIdx) {
s16 prevCamIdx = globalCtx->cameraPtrs[parentCamIdx]->childCamIdx;
globalCtx->cameraPtrs[newCamIdx]->parentCamIdx = parentCamIdx;
globalCtx->cameraPtrs[parentCamIdx]->childCamIdx = newCamIdx;
return prevCamIdx;
}
/**
* Removes a cutscene camera from the list. Returns the parent cam if the removed camera is active, otherwise returns
* SUBCAM_NONE
*/
s32 OnePointCutscene_RemoveCamera(GlobalContext* globalCtx, s16 camIdx) {
Camera* camera = globalCtx->cameraPtrs[camIdx];
s32 nextCamIdx;
if (camera->thisIdx == CHILD_CAM(camera)->parentCamIdx) {
CHILD_CAM(camera)->parentCamIdx = camera->parentCamIdx;
}
if (camera->thisIdx == PARENT_CAM(camera)->childCamIdx) {
PARENT_CAM(camera)->childCamIdx = camera->childCamIdx;
}
nextCamIdx = (globalCtx->activeCamera == camIdx) ? camera->parentCamIdx : SUBCAM_NONE;
camera->parentCamIdx = MAIN_CAM;
camera->childCamIdx = camera->parentCamIdx;
camera->timer = -1;
Gameplay_ClearCamera(camera->globalCtx, camera->thisIdx);
return nextCamIdx;
}
#define vChildCamIdx temp2
#define vCsStatus temp1
#define vCurCamIdx temp2
#define vNextCamIdx temp1
/**
* Creates a cutscene subcamera with the specified ID, duration, and targeted actor. The camera is placed into the
* cutscene queue in front of the specified camera, then all lower priority demos in front of it are removed from the
* queue.
*/
s16 OnePointCutscene_Init(GlobalContext* globalCtx, s16 csId, s16 timer, Actor* actor, s16 parentCamIdx) {
s16 temp1;
s16 temp2;
s16 csCamIdx;
Camera* csCam;
if (parentCamIdx == SUBCAM_ACTIVE) {
parentCamIdx = globalCtx->activeCamera;
}
csCamIdx = Gameplay_CreateSubCamera(globalCtx);
if (csCamIdx == SUBCAM_NONE) {
osSyncPrintf(VT_COL(RED, WHITE) "onepoint demo: error: too many cameras ... give up! type=%d\n" VT_RST, csId);
return SUBCAM_NONE;
}
// Inserts the cutscene camera into the cutscene queue in front of parentCam
vChildCamIdx = globalCtx->cameraPtrs[parentCamIdx]->childCamIdx;
vCsStatus = CAM_STAT_ACTIVE;
if (vChildCamIdx >= SUBCAM_FIRST) {
OnePointCutscene_SetAsChild(globalCtx, vChildCamIdx, csCamIdx);
vCsStatus = CAM_STAT_WAIT;
} else {
Interface_ChangeAlpha(2);
}
OnePointCutscene_SetAsChild(globalCtx, csCamIdx, parentCamIdx);
csCam = globalCtx->cameraPtrs[csCamIdx];
csCam->timer = timer;
csCam->target = actor;
csCam->at = globalCtx->view.lookAt;
csCam->eye = globalCtx->view.eye;
csCam->fov = globalCtx->view.fovy;
csCam->csId = csId;
if (parentCamIdx == MAIN_CAM) {
Gameplay_ChangeCameraStatus(globalCtx, parentCamIdx, CAM_STAT_UNK3);
} else {
Gameplay_ChangeCameraStatus(globalCtx, parentCamIdx, CAM_STAT_WAIT);
}
OnePointCutscene_SetInfo(globalCtx, csCamIdx, csId, actor, timer);
Gameplay_ChangeCameraStatus(globalCtx, csCamIdx, vCsStatus);
// Removes all lower priority cutscenes in front of this cutscene from the queue.
vCurCamIdx = csCamIdx;
vNextCamIdx = globalCtx->cameraPtrs[csCamIdx]->childCamIdx;
while (vNextCamIdx >= SUBCAM_FIRST) {
s16 nextCsId = globalCtx->cameraPtrs[vNextCamIdx]->csId;
s16 thisCsId = globalCtx->cameraPtrs[csCamIdx]->csId;
if ((nextCsId / 100) < (thisCsId / 100)) {
osSyncPrintf(VT_COL(YELLOW, BLACK) "onepointdemo camera[%d]: killed 'coz low priority (%d < %d)\n" VT_RST,
vNextCamIdx, nextCsId, thisCsId);
if (globalCtx->cameraPtrs[vNextCamIdx]->csId != 5010) {
if ((vNextCamIdx = OnePointCutscene_RemoveCamera(globalCtx, vNextCamIdx)) != SUBCAM_NONE) {
Gameplay_ChangeCameraStatus(globalCtx, vNextCamIdx, CAM_STAT_ACTIVE);
}
} else {
vCurCamIdx = vNextCamIdx;
OnePointCutscene_EndCutscene(globalCtx, vNextCamIdx);
}
} else {
vCurCamIdx = vNextCamIdx;
}
vNextCamIdx = globalCtx->cameraPtrs[vCurCamIdx]->childCamIdx;
}
return csCamIdx;
}
/**
* Ends the cutscene in camIdx by setting its timer to 0. For attention cutscenes, it is set to 5 instead.
*/
s16 OnePointCutscene_EndCutscene(GlobalContext* globalCtx, s16 camIdx) {
if (camIdx == SUBCAM_ACTIVE) {
camIdx = globalCtx->activeCamera;
}
if (globalCtx->cameraPtrs[camIdx] != NULL) {
osSyncPrintf("onepointdemo camera[%d]: delete timer=%d next=%d\n", camIdx, globalCtx->cameraPtrs[camIdx]->timer,
globalCtx->cameraPtrs[camIdx]->parentCamIdx);
if (globalCtx->cameraPtrs[camIdx]->csId == 5010) {
globalCtx->cameraPtrs[camIdx]->timer = 5;
} else {
globalCtx->cameraPtrs[camIdx]->timer = 0;
}
}
return camIdx;
}
#define vTargetCat temp1
#define vParentCamIdx temp1
#define vLastHigherCat temp2
#define vCsCamIdx temp2
/**
* Adds an attention cutscene to the cutscene queue.
*/
s32 OnePointCutscene_Attention(GlobalContext* globalCtx, Actor* actor) {
Camera* parentCam;
s32 temp1;
s32 temp2;
s32 timer;
if (sDisableAttention) {
osSyncPrintf(VT_COL(YELLOW, BLACK) "actor attention demo camera: canceled by other camera\n" VT_RST);
return SUBCAM_NONE;
}
sUnused = -1;
parentCam = globalCtx->cameraPtrs[MAIN_CAM];
if (parentCam->mode == CAM_MODE_FOLLOWBOOMERANG) {
osSyncPrintf(VT_COL(YELLOW, BLACK) "actor attention demo camera: change mode BOOKEEPON -> NORMAL\n" VT_RST);
Camera_ChangeMode(parentCam, CAM_MODE_NORMAL);
}
// Finds the camera of the first actor attention demo with a lower category actor, or the first non-attention demo
// after at least one attention demo.
vLastHigherCat = -1;
while (parentCam->childCamIdx != SUBCAM_FREE) {
parentCam = globalCtx->cameraPtrs[parentCam->childCamIdx];
if (parentCam == NULL) {
break;
} else if (parentCam->setting != CAM_SET_CS_ATTENTION) {
if (vLastHigherCat == -1) {
continue;
} else {
break;
}
} else {
vTargetCat = parentCam->target->category;
if (actor->category > vTargetCat) {
break;
}
vLastHigherCat = vTargetCat;
}
}
// Actorcat is only undefined if the actor is in a higher category than all other attention cutscenes. In this case,
// it goes in the first position of the list. Otherwise, it goes in the index found in the loop.
vParentCamIdx = (vLastHigherCat == -1) ? MAIN_CAM : parentCam->thisIdx;
switch (actor->category) {
case ACTORCAT_SWITCH:
case ACTORCAT_BG:
case ACTORCAT_PLAYER:
case ACTORCAT_PROP:
case ACTORCAT_DOOR:
timer = 30;
break;
case ACTORCAT_NPC:
case ACTORCAT_ITEMACTION:
case ACTORCAT_CHEST:
timer = 100;
break;
case ACTORCAT_EXPLOSIVE:
case ACTORCAT_ENEMY:
case ACTORCAT_MISC:
case ACTORCAT_BOSS:
default:
osSyncPrintf(VT_COL(YELLOW, BLACK) "actor attention demo camera: %d: unkown part of actor %d\n" VT_RST,
globalCtx->state.frames, actor->category);
timer = 30;
break;
}
osSyncPrintf(VT_FGCOL(CYAN) "%06u:" VT_RST " actor attention demo camera: request %d ", globalCtx->state.frames,
actor->category);
// If the previous attention cutscene has an actor in the same category, skip this actor.
if (actor->category == vLastHigherCat) {
osSyncPrintf("" VT_FGCOL(PURPLE) "×" VT_RST " (%d)\n", actor->id);
return SUBCAM_NONE;
}
osSyncPrintf("" VT_FGCOL(BLUE) "" VT_RST " (%d)\n", actor->id);
vCsCamIdx = OnePointCutscene_Init(globalCtx, 5010, timer, actor, vParentCamIdx);
if (vCsCamIdx == SUBCAM_NONE) {
osSyncPrintf(VT_COL(RED, WHITE) "actor attention demo: give up! \n" VT_RST, actor->id);
return SUBCAM_NONE;
} else {
s32* data = (s32*)&globalCtx->cameraPtrs[vCsCamIdx]->data1;
*data = NA_SE_SY_CORRECT_CHIME;
return vCsCamIdx;
}
}
/**
* Adds an attention cutscene to the cutscene queue with the specified sound effect
*/
s32 OnePointCutscene_AttentionSetSfx(GlobalContext* globalCtx, Actor* actor, s32 sfxId) {
s32 csCamIdx = OnePointCutscene_Attention(globalCtx, actor);
if (csCamIdx != SUBCAM_NONE) {
s32* data = (s32*)&globalCtx->cameraPtrs[csCamIdx]->data1;
*data = sfxId;
}
return csCamIdx;
}
// unused
void OnePointCutscene_EnableAttention() {
sDisableAttention = false;
}
// unused
void OnePointCutscene_DisableAttention() {
sDisableAttention = true;
}
s32 OnePointCutscene_CheckForCategory(GlobalContext* globalCtx, s32 category) {
Camera* parentCam = globalCtx->cameraPtrs[MAIN_CAM];
while (parentCam->childCamIdx != SUBCAM_FREE) {
parentCam = globalCtx->cameraPtrs[parentCam->childCamIdx];
if ((parentCam == NULL) || (parentCam->setting != CAM_SET_CS_ATTENTION)) {
break;
} else if (category == parentCam->target->category) {
return true;
}
}
return false;
}
// unused, also empty.
void OnePointCutscene_Noop(GlobalContext* globalCtx, s32 arg1) {
}