#include "ultra64.h" #include "global.h" static GlobalContext* sGlobalCtx; // TODO: cleanup these arrays and UB access char* D_8012CEE0[] = { GFXP_KATAKANA "キ-フレ-ム" GFXP_HIRAGANA "ガ" }; char* D_8012CEE4 = GFXP_HIRAGANA "タリマセン。"; char* D_8012CEE8 = GFXP_HIRAGANA "サイセイデキマセン"; char* D_8012CEEC = GFXP_HIRAGANA "サイセイシュウリョウ"; char* D_8012CEF0 = GFXP_HIRAGANA "サイセイチュウ!"; char* D_8012CEF4 = "DEMO CAMERA TOOL"; char* D_8012CEF8[] = { GFXP_HIRAGANA "モウハイリマセン", GFXP_HIRAGANA "トウロク テンメ", GFXP_HIRAGANA "ヘンコウ / " }; char* D_8012CF04 = "> >"; char* D_8012CF08 = "< <"; char* D_8012CF0C = "< >"; char* D_8012CF10 = GFXP_KATAKANA "*プレイヤ-*"; char* D_8012CF14 = GFXP_KATAKANA "Eモ-ド" GFXP_HIRAGANA " ソウタイ"; char* D_8012CF18[] = { GFXP_KATAKANA "Eモ-ド" GFXP_HIRAGANA "ゼッタイ", GFXP_HIRAGANA "ガメン" GFXP_KATAKANA " デモ", GFXP_HIRAGANA "ガメン フツウ" }; char* D_8012CF24[] = { GFXP_HIRAGANA "Pジカン MAX", GFXP_KATAKANA "リンク" GFXP_HIRAGANA " キオク", GFXP_KATAKANA "リンク" GFXP_HIRAGANA " ムシ" }; char* D_8012CF30 = GFXP_HIRAGANA "*ミテルイチ*"; char* D_8012CF34 = GFXP_KATAKANA "*カメラ" GFXP_HIRAGANA "イチ*"; char* D_8012CF38 = "DEBUG CAMERA"; char* D_8012CF3C = GFXP_KATAKANA "センタ-/ロック"; char* D_8012CF40 = GFXP_KATAKANA "センタ-/フリ-"; char* D_8012CF44 = "DEMO CONTROL"; char* D_8012CF48 = GFXP_KATAKANA "メモリ" GFXP_HIRAGANA "ガタリマセン"; char* D_8012CF4C = "p"; char* D_8012CF50[] = { "e", "s", "l", "c" }; char* D_8012CF60[] = { GFXP_KATAKANA "メモリパック" }; // "Mempak" char* D_8012CF64 = GFXP_KATAKANA "セーブ"; // "Save" char* D_8012CF68 = GFXP_KATAKANA "ロード"; // "Load" char* D_8012CF6C = GFXP_KATAKANA "クリア-"; // "Clear" char* D_8012CF70 = GFXP_HIRAGANA "ヲヌカナイデネ"; char* D_8012CF74 = "FREE BYTE"; char* D_8012CF78 = "NEED BYTE"; char* D_8012CF7C = GFXP_KATAKANA "*メモリ-パック*"; char* D_8012CF80 = GFXP_HIRAGANA "ヲミツケラレマセン"; char* D_8012CF84 = GFXP_KATAKANA "ファイル " GFXP_HIRAGANA "ヲ"; char* D_8012CF88[] = { GFXP_HIRAGANA "シテモイイデスカ?", GFXP_HIRAGANA "ゲンザイヘンシュウチュウノ", GFXP_KATAKANA "ファイル" GFXP_HIRAGANA "ハハキサレマス" }; char* D_8012CF94 = GFXP_HIRAGANA "ハイ"; char* D_8012CF98 = GFXP_HIRAGANA "イイエ"; char* D_8012CF9C[] = { GFXP_HIRAGANA "シテイマス", GFXP_HIRAGANA "ウワガキ" }; char* D_8012CFA4 = GFXP_HIRAGANA "シマシタ"; char* D_8012CFA8 = "USE BYTE"; char* D_8012CFAC = GFXP_HIRAGANA "ニシッパイ"; char* D_8012CFB0 = GFXP_KATAKANA "Eモ-ド" GFXP_HIRAGANA " コテイ"; char D_8012CFB4[] = GFXP_KATAKANA "フレ-ム "; char D_8012CFC4[] = GFXP_KATAKANA "キ- / "; char D_8012CFD0[] = GFXP_HIRAGANA "(センタ-テン)\0\0\0\0\0"; char D_8012CFE4[] = GFXP_HIRAGANA "(ゲンテン)\0\0\0\0\0\0"; char D_8012CFF8[] = GFXP_KATAKANA "(プレイヤ-)\0\0\0\0\0"; char D_8012D00C[] = GFXP_HIRAGANA "(イチアワセ)\0\0\0\0\0\0"; char D_8012D020[] = GFXP_HIRAGANA "(セッテイ)\0\0\0\0\0\0\0\0"; char D_8012D034[] = GFXP_HIRAGANA "(キャッカン)\0\0\0\0\0\0"; char D_8012D048[] = GFXP_KATAKANA "ポイントNo. \0\0\0"; char D_8012D05C[] = GFXP_HIRAGANA "ガカク \0\0\0"; char D_8012D070[] = GFXP_KATAKANA "Nフレ-ム \0\0\0\0"; char D_8012D084[] = GFXP_HIRAGANA "Zカイテン \0\0\0"; char D_8012D098[] = GFXP_KATAKANA "モ-ド \0\0\0\0"; char D_8012D0AC[] = " R" GFXP_HIRAGANA "チュウシン \0\0\0"; char D_8012D0C0[] = GFXP_HIRAGANA "Pジカン \0\0"; char D_8012D0D4[] = GFXP_HIRAGANA "キョリ \0"; char D_8012D0E4[] = GFXP_HIRAGANA "Xカイテン \0\0"; char D_8012D0F8[] = GFXP_HIRAGANA "Yカイテン \0\0"; #define ACTION_E 0 #define ACTION_SAVE 1 #define ACTION_LOAD 2 #define ACTION_CLEAR 3 #define MENU_INFO 0 #define MENU_CALLBACK 1 #define MENU_SUCCESS 2 #define MENU_ERROR 9 #define DEMO_CTRL_MENU(actionIdx, menuIdx) (actionIdx * 100 + menuIdx) s32 DbCamera_SaveCallback(char* c); s32 DbCamera_LoadCallback(char* c); s32 DbCamera_ClearCallback(char* c); s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam); static DbCamera* sDbCamPtr; static s16 D_8016110C; static DbCameraAnim sDbCamAnim; Vec3f* DbCamera_AddVecSph(Vec3f* out, Vec3f* in, VecSph* sph) { Vec3f ret; Vec3f vec; OLib_VecSphGeoToVec3f(&vec, sph); ret.x = in->x + vec.x; ret.y = in->y + vec.y; ret.z = in->z + vec.z; *out = ret; return out; } Vec3f* DbCamera_CalcUpFromPitchYawRoll(Vec3f* dest, s16 pitch, s16 yaw, s16 roll) { f32 sinPitch; f32 cosPitch; f32 sinYaw; f32 cosYaw; f32 sinNegRoll; f32 cosNegRoll; Vec3f spA4; f32 sp54; f32 sp4C; f32 cosPitchCosYawSinRoll; f32 negSinPitch; f32 temp_f10_2; f32 cosPitchcosYaw; f32 temp_f14; f32 negSinPitchSinYaw; f32 negSinPitchCosYaw; f32 cosPitchSinYaw; f32 temp_f4_2; f32 temp_f6; f32 temp_f8; f32 temp_f8_2; f32 temp_f8_3; sinPitch = Math_SinS(pitch); cosPitch = Math_CosS(pitch); sinYaw = Math_SinS(yaw); cosYaw = Math_CosS(yaw); sinNegRoll = Math_SinS(-roll); cosNegRoll = Math_CosS(-roll); negSinPitch = -sinPitch; negSinPitchSinYaw = negSinPitch * sinYaw; negSinPitchCosYaw = negSinPitch * cosYaw; temp_f14 = 1.0f - cosNegRoll; cosPitchSinYaw = cosPitch * sinYaw; sp54 = SQ(cosPitchSinYaw); sp4C = (cosPitchSinYaw * sinPitch) * ((void)0, temp_f14); cosPitchcosYaw = cosPitch * cosYaw; temp_f4_2 = ((1.0f - sp54) * cosNegRoll) + sp54; cosPitchCosYawSinRoll = cosPitchcosYaw * sinNegRoll; temp_f6 = (cosPitchcosYaw * cosPitchSinYaw) * ((void)0, temp_f14); temp_f10_2 = sinPitch * sinNegRoll; spA4.x = ((negSinPitchSinYaw * temp_f4_2) + (cosPitch * (sp4C - cosPitchCosYawSinRoll))) + (negSinPitchCosYaw * (temp_f6 + temp_f10_2)); sp54 = SQ(sinPitch); temp_f4_2 = (sinPitch * cosPitchcosYaw) * ((void)0, temp_f14); temp_f8_3 = cosPitchSinYaw * sinNegRoll; temp_f8 = sp4C + cosPitchCosYawSinRoll; spA4.y = ((negSinPitchSinYaw * temp_f8) + (cosPitch * (((1.0f - sp54) * cosNegRoll) + sp54))) + (negSinPitchCosYaw * (temp_f4_2 - temp_f8_3)); temp_f8_2 = temp_f6 - temp_f10_2; spA4.z = ((negSinPitchSinYaw * temp_f8_2) + (cosPitch * (temp_f4_2 + temp_f8_3))) + (negSinPitchCosYaw * (((1.0f - SQ(cosPitchcosYaw)) * cosNegRoll) + SQ(cosPitchcosYaw))); *dest = spA4; return dest; } char* DbCamera_SetTextValue(s16 value, char* str, u8 endIdx) { char* strIter; char sign; strIter = str + (s32)endIdx - 1; str[endIdx] = '\0'; if (value >= 0) { sign = ' '; } else { sign = '-'; value = -value; } do { // clang-format off *strIter-- = (value % 10) + '0'; value /= 10; // clang-format on } while (value != 0); if (sign == '-') { *strIter-- = sign; } while (strIter >= str) { *str++ = ' '; } return strIter; } void DbCamera_Vec3SToF(Vec3s* in, Vec3f* out) { out->x = in->x; out->y = in->y; out->z = in->z; } void DbCamera_Vec3FToS(Vec3f* in, Vec3s* out) { out->x = in->x; out->y = in->y; out->z = in->z; } void DbCamera_CopyVec3f(Vec3f* in, Vec3f* out) { out->x = in->x; out->y = in->y; out->z = in->z; } void DbCamera_Vec3SToF2(Vec3s* in, Vec3f* out) { out->x = in->x; out->y = in->y; out->z = in->z; } void func_800B3F94(PosRot* posRot, Vec3f* vec, Vec3s* out) { VecSph sph; Vec3f tempVec; OLib_Vec3fDiffToVecSphGeo(&sph, &posRot->pos, vec); sph.yaw -= posRot->rot.y; OLib_VecSphGeoToVec3f(&tempVec, &sph); DbCamera_Vec3FToS(&tempVec, out); } void func_800B3FF4(PosRot* posRot, Vec3f* vec, Vec3f* out) { VecSph sph; Vec3f tempVec; DbCamera_CopyVec3f(vec, &tempVec); OLib_Vec3fToVecSphGeo(&sph, &tempVec); sph.yaw += posRot->rot.y; DbCamera_AddVecSph(out, &posRot->pos, &sph); } void func_800B404C(PosRot* posRot, Vec3s* vec, Vec3f* out) { Vec3f tempVec; DbCamera_Vec3SToF(vec, &tempVec); func_800B3FF4(posRot, &tempVec, out); } s32 func_800B4088(DbCamera* dbCamera, Camera* cam) { CutsceneCameraPoint* position; CutsceneCameraPoint* lookAt; s32 i; position = &dbCamera->sub.position[dbCamera->sub.unkIdx]; lookAt = &dbCamera->sub.lookAt[dbCamera->sub.unkIdx]; position->continueFlag = -1; lookAt->continueFlag = position->continueFlag; position->nextPointFrame = 0; lookAt->nextPointFrame = 30; lookAt->cameraRoll = position->cameraRoll = dbCamera->roll * (360.0f / 256.0f); lookAt->viewAngle = position->viewAngle = dbCamera->fov; if (dbCamera->sub.mode != 1) { DbCamera_Vec3FToS(&dbCamera->eye, &position->pos); DbCamera_Vec3FToS(&dbCamera->at, &lookAt->pos); } else { func_800B3F94(&cam->playerPosRot, &dbCamera->at, &lookAt->pos); func_800B3F94(&cam->playerPosRot, &dbCamera->eye, &position->pos); } for (i = 0; i < (dbCamera->sub.nPoints - 2); i++) { dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = 0; } dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = -1; return dbCamera->sub.unkIdx; } s16 func_800B41DC(DbCamera* dbCamera, s16 idx, Camera* cameraPtr) { CutsceneCameraPoint* position = &dbCamera->sub.position[idx]; CutsceneCameraPoint* lookAt = &dbCamera->sub.lookAt[idx]; if (dbCamera->sub.mode != 1) { DbCamera_Vec3SToF2(&position->pos, &dbCamera->eye); DbCamera_Vec3SToF2(&lookAt->pos, &dbCamera->at); } else { func_800B404C(&cameraPtr->playerPosRot, &lookAt->pos, &dbCamera->at); func_800B404C(&cameraPtr->playerPosRot, &position->pos, &dbCamera->eye); } dbCamera->roll = lookAt->cameraRoll; dbCamera->rollDegrees = dbCamera->roll * (360.0f / 256.0f); dbCamera->fov = lookAt->viewAngle; return idx; } s32 func_800B42C0(DbCamera* dbCamera, Camera* cameraPtr) { CutsceneCameraPoint* position = &dbCamera->sub.position[dbCamera->sub.unkIdx]; CutsceneCameraPoint* lookAt = &dbCamera->sub.lookAt[dbCamera->sub.unkIdx]; position->continueFlag = lookAt->continueFlag = 0; if (dbCamera->sub.mode != 1) { DbCamera_Vec3FToS(&dbCamera->eye, &position->pos); DbCamera_Vec3FToS(&dbCamera->at, &lookAt->pos); } else { func_800B3F94(&cameraPtr->playerPosRot, &dbCamera->at, &lookAt->pos); func_800B3F94(&cameraPtr->playerPosRot, &dbCamera->eye, &position->pos); } return dbCamera->sub.unkIdx; } s32 func_800B4370(DbCamera* dbCamera, s16 idx, Camera* cam) { CutsceneCameraPoint* lookAt = &dbCamera->sub.lookAt[idx]; CutsceneCameraPoint* position = &dbCamera->sub.position[idx]; VecSph sph; Vec3f at; if (dbCamera->sub.mode != 1) { if (dbCamera->sub.unk_0C) { DbCamera_Vec3SToF2(&position->pos, &dbCamera->at); } else { DbCamera_Vec3SToF2(&lookAt->pos, &dbCamera->at); } } else { if (dbCamera->sub.unk_0C) { func_800B404C(&cam->playerPosRot, &position->pos, &at); } else { func_800B404C(&cam->playerPosRot, &lookAt->pos, &at); } dbCamera->at = at; } sph.pitch = 0x2000; sph.yaw -= 0x7FFF; sph.r = 250.0f; DbCamera_AddVecSph(&dbCamera->eye, &dbCamera->at, &sph); dbCamera->roll = lookAt->cameraRoll; dbCamera->rollDegrees = dbCamera->roll * (360.0f / 256.0f); dbCamera->fov = lookAt->viewAngle; return idx; } void func_800B44E0(DbCamera* dbCamera, Camera* cam) { s32 i; if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CRIGHT)) { sDbCamAnim.keyframe = 0; sDbCamAnim.unk_0A = 1; sDbCamAnim.curFrame = 0.0f; sDbCamAnim.unk_04 = 0; for (i = 0; i < (dbCamera->sub.nPoints - 2); i++) { dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = 0; } dbCamera->sub.position[i].continueFlag = dbCamera->sub.lookAt[i].continueFlag = -1; } if (dbCamera->sub.nPoints < 6) { if (sDbCamAnim.unk_0A != 0) { Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sDbCamAnim.unk_0A = 0; } func_8006376C(0x11, 0x17, 3, D_8012CEE0[0]); func_8006376C(0x12, 0x18, 3, D_8012CEE4); func_8006376C(0x10, 0x1A, 1, D_8012CEE8); return; } if (!func_800BB2B4(&sDbCamAnim.positionPos, &sDbCamAnim.roll, &sDbCamAnim.fov, dbCamera->sub.position, &sDbCamAnim.keyframe, &sDbCamAnim.curFrame) && !func_800BB2B4(&sDbCamAnim.lookAtPos, &sDbCamAnim.roll, &sDbCamAnim.fov, dbCamera->sub.lookAt, &sDbCamAnim.keyframe, &sDbCamAnim.curFrame) && sDbCamAnim.unk_0A == 1) { Audio_PlaySoundGeneral(NA_SE_SY_HP_RECOVER, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sDbCamAnim.unk_04++; if (dbCamera->sub.nFrames > 0 && dbCamera->sub.nFrames < sDbCamAnim.unk_04) { sDbCamAnim.unk_0A = 0; func_8006376C(0xF, 0x1A, 1, D_8012CEEC); } if (dbCamera->sub.mode != 1) { DbCamera_CopyVec3f(&sDbCamAnim.positionPos, &dbCamera->eye); DbCamera_CopyVec3f(&sDbCamAnim.lookAtPos, &dbCamera->at); } else { func_800B3FF4(&cam->playerPosRot, &sDbCamAnim.lookAtPos, &dbCamera->at); func_800B3FF4(&cam->playerPosRot, &sDbCamAnim.positionPos, &dbCamera->eye); } dbCamera->fov = sDbCamAnim.fov; dbCamera->roll = sDbCamAnim.roll; dbCamera->rollDegrees = sDbCamAnim.roll * (360.0f / 256.0f); DbCamera_SetTextValue(sDbCamAnim.unk_04, &D_8012CFB4[8], 4); func_8006376C(0x10, 0x17, 3, D_8012CFB4); D_8012CFC4[5] = ((sDbCamAnim.keyframe + 1) / 10) + '0'; D_8012CFC4[6] = ((sDbCamAnim.keyframe + 1) % 10) + '0'; D_8012CFC4[8] = ((dbCamera->sub.nPoints - 5) / 10) + '0'; D_8012CFC4[9] = ((dbCamera->sub.nPoints - 5) % 10) + '0'; func_8006376C(0x10, 0x18, 3, D_8012CFC4); func_8006376C(0x10, 0x1A, 1, D_8012CEF0); return; } sDbCamAnim.unk_0A = 0; func_8006376C(0xF, 0x1A, 1, D_8012CEEC); } void DbCamera_PrintPoints(const char* name, s16 count, CutsceneCameraPoint* points) { s32 i; osSyncPrintf("@@@static SplinedatZ %s[] = {\n", name); for (i = 0; i < count; i++) { osSyncPrintf("@@@ /* key frame %2d */ {\n", i); osSyncPrintf("@@@ /* code */ %d,\n", points[i].continueFlag); osSyncPrintf("@@@ /* z */ %d,\n", points[i].cameraRoll); osSyncPrintf("@@@ /* T */ %d,\n", points[i].nextPointFrame); osSyncPrintf("@@@ /* zoom */ %f,\n", points[i].viewAngle); osSyncPrintf("@@@ /* pos */ { %d, %d, %d }\n", points[i].pos.x, points[i].pos.y, points[i].pos.z); osSyncPrintf("@@@ },\n"); } osSyncPrintf("@@@};\n@@@\n"); } void DbCamera_PrintF32Bytes(f32 value) { f32 b = value; char* a = (char*)&b; osSyncPrintf("\n@@@%d,%d,%d,%d,", a[0], a[1], a[2], a[3]); } void DbCamera_PrintU16Bytes(u16 value) { u16 pad; u16 b = value; char* a = (char*)&b; osSyncPrintf("\n@@@%d,%d,", a[0], a[1]); } void DbCamera_PrintS16Bytes(s16 value) { u16 pad; s16 b = value; char* a = (char*)&b; osSyncPrintf("\n@@@%d,%d,", a[0], a[1]); } void DbCamera_PrintCutBytes(DbCameraCut* cut) { CutsceneCameraPoint* point; CutsceneCameraPoint* points; s32 i; points = cut->lookAt; osSyncPrintf("\n@@@ 0,0,0,2,\t/* Look Camera\t*/"); osSyncPrintf("\n@@@ 0,1,\t/* dousa\t*/"); osSyncPrintf("\n@@@ 0,0,\t/* Start Flame\t*/"); DbCamera_PrintU16Bytes(cut->nFrames); osSyncPrintf("\t/* End Flame\t*/"); osSyncPrintf("\n@@@0,0,\t/* Dammy\t*/\n@@@ "); for (i = 0; i < cut->nPoints; i++) { point = points + i; osSyncPrintf("\n@@@ %d, /* code */", point->continueFlag); osSyncPrintf("\n@@@ %d, /* z */", point->cameraRoll); DbCamera_PrintU16Bytes(point->nextPointFrame); osSyncPrintf("\t/* sokudo\t*/"); DbCamera_PrintF32Bytes(point->viewAngle); osSyncPrintf("\t/* zoom\t*/"); DbCamera_PrintS16Bytes(point->pos.x); osSyncPrintf("\t/* x pos\t*/"); DbCamera_PrintS16Bytes(point->pos.y); osSyncPrintf("\t/* y pos\t*/"); DbCamera_PrintS16Bytes(point->pos.z); osSyncPrintf("\t/* z pos\t*/\n"); osSyncPrintf("\n@@@0,0,\t/* Dammy\t*/\n@@@ "); } points = cut->position; osSyncPrintf("\n@@@ 0,0,0,1,\t/* Position Camera */"); osSyncPrintf("\n@@@ 0,1,\t/* dousa\t*/"); osSyncPrintf("\n@@@ 0,0,\t/* Start Flame\t*/"); DbCamera_PrintU16Bytes(cut->nFrames); osSyncPrintf("\t/* End Flame\t*/"); osSyncPrintf("\n@@@0,0,\t/* Dammy\t*/\n@@@ "); for (i = 0; i < cut->nPoints; i++) { point = points + i; osSyncPrintf("\n@@@ %d, /* code */", point->continueFlag); osSyncPrintf("\n@@@ %d, /* z */", point->cameraRoll); DbCamera_PrintU16Bytes(point->nextPointFrame); osSyncPrintf("\t/* sokudo\t*/"); DbCamera_PrintF32Bytes(point->viewAngle); osSyncPrintf("\t/* zoom\t*/"); DbCamera_PrintS16Bytes(point->pos.x); osSyncPrintf("\t/* x pos\t*/"); DbCamera_PrintS16Bytes(point->pos.y); osSyncPrintf("\t/* y pos\t*/"); DbCamera_PrintS16Bytes(point->pos.z); osSyncPrintf("\t/* z pos\t*/"); osSyncPrintf("\n@@@0,0,\t/* Dammy\t*/\n@@@ "); } } void DbCamera_Init(DbCamera* dbCamera, Camera* cameraPtr) { dbCamera->sub.unk_104A.z = 0; dbCamera->unk_44 = 0; dbCamera->unk_00 = 0; dbCamera->unk_34 = 0; dbCamera->unk_3C = false; dbCamera->unk_38 = -1; dbCamera->unk_40 = -1; dbCamera->roll = 0; dbCamera->sub.unk_104A.y = dbCamera->sub.unk_104A.z; dbCamera->sub.unk_104A.x = dbCamera->sub.unk_104A.z; dbCamera->fov = 0.0f; dbCamera->rollDegrees = 0.0f; sGlobalCtx = cameraPtr->globalCtx; dbCamera->sub.mode = 0; dbCamera->sub.nFrames = -1; dbCamera->sub.nPoints = 1; dbCamera->sub.unkIdx = 0; dbCamera->sub.unk_08 = 0; dbCamera->sub.unk_0A = 0; dbCamera->unk_78 = 0; dbCamera->unk_7A = 0; dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_INFO); dbCamera->sub.demoCtrlActionIdx = ACTION_E; dbCamera->sub.demoCtrlToggleSwitch = 0; dbCamera->unk_6C.x = 0; dbCamera->unk_6C.y = 0; dbCamera->unk_6C.z = 0; } void DbgCamera_Enable(DbCamera* dbCamera, Camera* cam) { dbCamera->at = cam->at; dbCamera->eye = cam->eye; dbCamera->unk_1C = cam->up; dbCamera->fov = cam->fov; dbCamera->roll = 0; dbCamera->sub.nPoints = 1; dbCamera->sub.unkIdx = 0; dbCamera->sub.unk_08 = 0; dbCamera->sub.unk_0A = 1; dbCamera->sub.unk_0C = true; dbCamera->unk_78 = 0; dbCamera->unk_7A = 0; dbCamera->rollDegrees = 0.0f; func_800B4088(dbCamera, cam); } void DbCamera_Update(DbCamera* dbCamera, Camera* cam) { static s32 D_8012D10C = 100; static s32 D_8012D110 = 0; static s32 D_80161140; // bool static s32 D_80161144; // bool Vec3f* sp124; f32 temp_f0_5; s16 yaw; f32 new_var2; f32 temp_f2; s16 pitch; char sp111; char sp110; f32 temp_f2_2; VecSph sp104; VecSph spFC; VecSph spF4; PosRot* temp_s6; Vec3f* eye; Vec3f* at; Vec3f* phi_s0; Vec3f spD8; s32 pad; Vec3f* sp90; Vec3f* sp80; Vec3f* sp7C; s32 i; Vec3f spB8; Vec3f spAC; s16 spAA; VecSph spA0; sp90 = &dbCamera->unk_54; temp_s6 = &cam->playerPosRot; at = &cam->at; eye = &cam->eye; *sp90 = temp_s6->pos; dbCamera->unk_60 = cam->at; sp80 = &dbCamera->eye; sp7C = &dbCamera->at; if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_Z)) { dbCamera->unk_00++; dbCamera->unk_00 %= 3; dbCamera->unk_38 = 1; dbCamera->unk_44 = 0; dbCamera->unk_40 = -1; dbCamera->sub.demoCtrlActionIdx = 0; sDbCamAnim.unk_0A = 0; Audio_PlaySoundGeneral(NA_SE_SY_LOCK_ON, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } else if (dbCamera->unk_38 == -1) { dbCamera->unk_38 = 1; } else { dbCamera->unk_38 = 0; } switch (dbCamera->unk_00) { case 0: switch (dbCamera->unk_78) { case 0: sp124 = &dbCamera->unk_60; D_80161144 = false; D_80161140 = false; break; case 1: sp124 = &dbCamera->unk_6C; D_80161144 = false; D_80161140 = false; break; case 2: sp124 = &dbCamera->unk_54; D_80161144 = false; D_80161140 = true; break; } break; case 1: switch (dbCamera->sub.unk_08) { case 0: D_80161144 = dbCamera->sub.unk_0C; if (D_80161144) { sp124 = sp80; } else { sp124 = sp7C; } D_80161140 = false; break; case 1: D_80161144 = dbCamera->sub.unk_0C; if (D_80161144) { sp124 = sp80; } else { sp124 = sp7C; } D_80161140 = false; break; case 2: D_80161144 = false; D_80161140 = true; sp124 = sp7C; break; } break; case 2: DbCamera_UpdateDemoControl(dbCamera, cam); return; default: break; } phi_s0 = sp124; if (!D_80161144) { OLib_Vec3fDiffToVecSphGeo(&sp104, sp7C, sp80); } else { OLib_Vec3fDiffToVecSphGeo(&sp104, sp80, sp7C); } if (dbCamera->unk_44 > 100) { dbCamera->unk_44 = 100; } new_var2 = ((dbCamera->unk_44 * 0.15f) + 0.2f); temp_f2 = new_var2 * (sp104.r / 100.0f); if ((dbCamera->unk_38 != 0) || dbCamera->unk_3C) { if (D_80161144) { *sp80 = *phi_s0; } else { *sp7C = *phi_s0; } dbCamera->unk_3C = D_80161140; if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_B | BTN_L)) { sp104.r += temp_f2; if (sp104.r > 30000.0f) { sp104.r = 30000.0f; } if (dbCamera->unk_40 == 7) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 7; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_B)) { spFC = sp104; spFC.r = temp_f2; if (!D_80161144) { spFC.yaw = sp104.yaw; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.pitch = -spFC.pitch; spFC.yaw = BINANG_ROT180(sp104.yaw); DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 0xB) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 0xB; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_A | BTN_L)) { sp104.r -= temp_f2; if (sp104.r < 10.0f) { sp104.r = 10.0f; } if (dbCamera->unk_40 == 8) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 8; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_A)) { spFC = sp104; spFC.r = -temp_f2; if (!D_80161144) { spFC.yaw = sp104.yaw; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.pitch = -spFC.pitch; spFC.yaw = BINANG_ROT180(sp104.yaw); DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 0xC) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 0xC; } else { dbCamera->unk_44 = 0; dbCamera->unk_40 = -1; } } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DDOWN | BTN_L)) { spFC = sp104; spFC.r = temp_f2; spFC.pitch = 0; if (!D_80161144) { spFC.yaw = sp104.yaw; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.yaw = BINANG_ROT180(sp104.yaw); DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 1) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 1; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DUP | BTN_L)) { spFC = sp104; spFC.r = -temp_f2; spFC.pitch = 0; if (!D_80161144) { spFC.yaw = sp104.yaw; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.yaw = BINANG_ROT180(sp104.yaw); DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 2) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 2; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DUP)) { spFC = sp104; spFC.r = temp_f2; spFC.pitch = 0x3FFF; spFC.yaw = sp104.yaw; if (!D_80161144) { DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 3) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 3; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DDOWN)) { spFC = sp104; spFC.r = temp_f2; spFC.pitch = -0x3FFF; spFC.yaw = sp104.yaw; if (!D_80161144) { DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 4) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 4; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, (BTN_DRIGHT | BTN_L)) || CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DRIGHT)) { spFC = sp104; spFC.r = temp_f2; spFC.pitch = 0; if (!D_80161144) { spFC.yaw = sp104.yaw + 0x3FFF; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.yaw = sp104.yaw - 0x3FFF; DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 5) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 5; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, (BTN_DLEFT | BTN_L)) || CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DLEFT)) { spFC = sp104; spFC.r = temp_f2; spFC.pitch = 0; if (!D_80161144) { spFC.yaw = sp104.yaw - 0x3FFF; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.yaw = sp104.yaw + 0x3FFF; DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 6) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 6; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_B | BTN_L)) { sp104.r = sp104.r + temp_f2; if (sp104.r > 30000.0f) { sp104.r = 30000.0f; } if (dbCamera->unk_40 == 7) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 7; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_B)) { spFC = sp104; spFC.r = temp_f2; if (!D_80161144) { spFC.yaw = sp104.yaw; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.pitch = -spFC.pitch; spFC.yaw = BINANG_ROT180(sp104.yaw); DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 0xB) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 0xB; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_A | BTN_L)) { sp104.r -= temp_f2; if (sp104.r < 10.0f) { sp104.r = 10.0f; } if (dbCamera->unk_40 == 8) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 8; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_A)) { spFC = sp104; spFC.r = -temp_f2; if (!D_80161144) { spFC.yaw = sp104.yaw; DbCamera_AddVecSph(sp7C, sp7C, &spFC); } else { spFC.pitch = -spFC.pitch; spFC.yaw = BINANG_ROT180(sp104.yaw); DbCamera_AddVecSph(sp80, sp80, &spFC); } if (dbCamera->unk_40 == 0xC) { dbCamera->unk_44++; } else { dbCamera->unk_44 = 0; } dbCamera->unk_40 = 0xC; } else { dbCamera->unk_44 = 0; dbCamera->unk_40 = -1; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_R)) { if (dbCamera->unk_00 == 0) { dbCamera->sub.unk_104A = cam->inputDir; *sp7C = cam->at; *sp80 = cam->eye; dbCamera->unk_1C.x = 0.0f; dbCamera->unk_1C.z = 0.0f; dbCamera->unk_1C.y = 1.0f; } else if (dbCamera->sub.unk_08 == 2) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.unk_08 = 0; func_800B41DC(dbCamera, dbCamera->sub.unkIdx, cam); } else { if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_R) && CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { Audio_PlaySoundGeneral(NA_SE_SY_CANCEL, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.nPoints = dbCamera->sub.unkIdx + 1; func_800B4088(dbCamera, cam); } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_R)) { if (dbCamera->sub.unkIdx == 0x80) { Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } else { Audio_PlaySoundGeneral(NA_SE_IT_SWORD_PUTAWAY, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); func_800B42C0(dbCamera, cam); if (dbCamera->sub.unkIdx == (dbCamera->sub.nPoints - 1)) { dbCamera->sub.unkIdx++; dbCamera->sub.nPoints++; func_800B4088(dbCamera, cam); } } } } } else { temp_f0_5 = sGlobalCtx->state.input[2].rel.stick_y; temp_f2_2 = sGlobalCtx->state.input[2].rel.stick_x; pitch = DEGF_TO_BINANG((SQ(temp_f0_5) / 600.0f) * 0.8f); yaw = DEGF_TO_BINANG((SQ(temp_f2_2) / 600.0f) * 0.8f); if (!D_80161144) { sp104.pitch += (s16)((temp_f0_5 >= 0.0f) ? pitch : -pitch); sp104.yaw += (s16)((temp_f2_2 >= 0.0f) ? yaw : -yaw); DbCamera_AddVecSph(sp80, sp7C, &sp104); dbCamera->sub.unk_104A.x = -sp104.pitch; dbCamera->sub.unk_104A.y = BINANG_ROT180(sp104.yaw); } else { sp104.pitch += (s16)((temp_f0_5 >= 0.0f) ? -pitch : pitch); sp104.yaw += (s16)((temp_f2_2 >= 0.0f) ? -yaw : yaw); DbCamera_AddVecSph(sp7C, sp80, &sp104); dbCamera->sub.unk_104A.x = sp104.pitch; dbCamera->sub.unk_104A.y = sp104.yaw; } OLib_Vec3fDiffToVecSphGeo(&spF4, sp80, sp7C); DbCamera_CalcUpFromPitchYawRoll(&dbCamera->unk_1C, spF4.pitch, spF4.yaw, DEGF_TO_BINANG(dbCamera->rollDegrees)); if (dbCamera->unk_00 == 1) { if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_CRIGHT)) { cam->inputDir = dbCamera->sub.unk_104A; new_var2 = OLib_Vec3fDist(&cam->at, &cam->eye); cam->at = *sp7C; spFC = sp104; spFC.r = new_var2; DbCamera_AddVecSph(&cam->eye, &cam->at, &spFC); } } } if (dbCamera->unk_00 == 1) { OREG(0) = 8; func_8006376C(0xC, 5, 0, D_8012CEF4); if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_CRIGHT) && !CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { func_800B44E0(dbCamera, cam); } else { if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CRIGHT) && CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { Audio_PlaySoundGeneral(NA_SE_SY_GET_RUPY, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); osSyncPrintf("@@@\n@@@\n@@@/* *** spline point data ** start here *** */\n@@@\n"); DbCamera_PrintPoints("Lookat", dbCamera->sub.nPoints, dbCamera->sub.lookAt); DbCamera_PrintPoints("Position", dbCamera->sub.nPoints, dbCamera->sub.position); osSyncPrintf("@@@static short nPoints = %d;\n@@@\n", dbCamera->sub.nPoints); osSyncPrintf("@@@static short nFrames = %d;\n@@@\n", dbCamera->sub.nFrames); osSyncPrintf("@@@static short Mode = %d;\n@@@\n", dbCamera->sub.mode); osSyncPrintf("@@@\n@@@\n@@@/* *** spline point data ** finish! *** */\n@@@\n"); } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CLEFT)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.unk_08 = (dbCamera->sub.unk_08 + 1) % 3; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CUP) && CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { Audio_PlaySoundGeneral(NA_SE_IT_SWORD_IMPACT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (dbCamera->sub.unkIdx > 0) { dbCamera->sub.unkIdx--; } else { dbCamera->sub.unkIdx = dbCamera->sub.nPoints - 1; } } else { if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CUP)) { Audio_PlaySoundGeneral(NA_SE_IT_SWORD_IMPACT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (dbCamera->sub.unkIdx > 0) { dbCamera->sub.unkIdx--; } else { dbCamera->sub.unkIdx = dbCamera->sub.nPoints - 1; } if ((dbCamera->sub.unk_08 == 2) && (dbCamera->sub.unkIdx != (dbCamera->sub.nPoints - 1))) { func_800B4370(dbCamera, dbCamera->sub.unkIdx, cam); dbCamera->roll = 0; dbCamera->fov = 60.0f; dbCamera->rollDegrees = 0; } else { func_800B41DC(dbCamera, dbCamera->sub.unkIdx, cam); dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle; dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll; dbCamera->rollDegrees = dbCamera->roll * 1.40625f; } } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L) && CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CDOWN)) { Audio_PlaySoundGeneral(NA_SE_IT_SWORD_IMPACT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (dbCamera->sub.unkIdx < (dbCamera->sub.nPoints - 1)) { dbCamera->sub.unkIdx++; } else { dbCamera->sub.unkIdx = 0; } } else { if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CDOWN)) { Audio_PlaySoundGeneral(NA_SE_IT_SWORD_IMPACT, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (dbCamera->sub.unkIdx < (dbCamera->sub.nPoints - 1)) { dbCamera->sub.unkIdx++; } else { dbCamera->sub.unkIdx = 0; } if ((dbCamera->sub.unk_08 == 2) && (dbCamera->sub.unkIdx != (dbCamera->sub.nPoints - 1))) { func_800B4370(dbCamera, dbCamera->sub.unkIdx, cam); dbCamera->roll = 0; dbCamera->fov = 60.0f; dbCamera->rollDegrees = 0; } else { func_800B41DC(dbCamera, dbCamera->sub.unkIdx, cam); dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle; dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll; dbCamera->rollDegrees = dbCamera->roll * 1.40625f; } } } func_8006376C(0xA, 6, (dbCamera->sub.unk_08 == 0) ? 7 : 4, D_8012D00C); func_8006376C(0x11, 6, (dbCamera->sub.unk_08 == 1) ? 7 : 4, D_8012D020); func_8006376C(0x17, 6, (dbCamera->sub.unk_08 == 2) ? 7 : 4, D_8012D034); if (dbCamera->sub.unkIdx == 0x80) { func_8006376C(0x10, 0x1A, 1, D_8012CEF8[0]); } else if (dbCamera->sub.unkIdx == (dbCamera->sub.nPoints - 1)) { D_8012CEE0[7][10] = (dbCamera->sub.nPoints / 10) + '0'; D_8012CEE0[7][11] = (dbCamera->sub.nPoints % 10) + '0'; func_8006376C(0xF, 0x1A, 1, D_8012CEE0[7]); } else { D_8012CEE0[8][10] = ((dbCamera->sub.unkIdx + 1) / 10) + '0'; D_8012CEE0[8][11] = ((dbCamera->sub.unkIdx + 1) % 10) + '0'; D_8012CEE0[8][13] = ((dbCamera->sub.nPoints - 1) / 10) + '0'; D_8012CEE0[8][14] = ((dbCamera->sub.nPoints - 1) % 10) + '0'; func_8006376C(0xF, 0x1A, 1, D_8012CEE0[8]); } switch (dbCamera->sub.unk_08) { case 2: dbCamera->unk_3C = false; break; case 0: dbCamera->unk_3C = false; if (dbCamera->sub.mode != 1) { func_8006376C(0xD, 0x18, 3, !D_80161144 ? D_8012CF04 : D_8012CF08); DbCamera_SetTextValue(sp104.pitch * 0.00549325f, &D_8012D0E4[11], 4); func_8006376C(0xF, 0x17, 3, D_8012D0E4); DbCamera_SetTextValue(sp104.yaw * 0.00549325f, &D_8012D0F8[11], 4); func_8006376C(0xF, 0x18, 3, D_8012D0F8); DbCamera_SetTextValue(sp104.r, &D_8012D0D4[8], 6); func_8006376C(0xF, 0x19, 3, D_8012D0D4); } else { func_8006376C(0xE, 0x18, 3, D_8012CF0C); func_8006376C(0x10, 0x16, 3, D_8012CF10); sp110 = 'X'; DbCamera_SetTextValue(temp_s6->pos.x, &sp111, 7); func_8006376C(0x10, 0x17, 3, &sp110); sp110 = 'Y'; DbCamera_SetTextValue(temp_s6->pos.y, &sp111, 7); func_8006376C(0x10, 0x18, 3, &sp110); sp110 = 'Z'; DbCamera_SetTextValue(temp_s6->pos.z, &sp111, 7); func_8006376C(0x10, 0x19, 3, &sp110); } break; case 1: dbCamera->unk_3C = true; if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DUP)) { Audio_PlaySoundGeneral(NA_SE_SY_ATTENTION_ON, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (dbCamera->sub.unk_0A == 0) { dbCamera->sub.unk_0A = 5; } else { dbCamera->sub.unk_0A--; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DDOWN)) { Audio_PlaySoundGeneral(NA_SE_SY_ATTENTION_ON, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (dbCamera->sub.unk_0A == 5) { dbCamera->sub.unk_0A = 0; } else { dbCamera->sub.unk_0A++; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DLEFT)) { Audio_PlaySoundGeneral(NA_SE_SY_ATTENTION_ON, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); switch (dbCamera->sub.unk_0A) { case 1: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame -= 5; } else { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame--; } break; case 3: dbCamera->sub.mode--; if (dbCamera->sub.mode == -1) { dbCamera->sub.mode = 2; } if (dbCamera->sub.mode == 1) { dbCamera->unk_78 = 2; for (i = 0; i < dbCamera->sub.nPoints; i++) { DbCamera_Vec3SToF2(&dbCamera->sub.lookAt[i].pos, &spD8); func_800B3F94(temp_s6, &spD8, &dbCamera->sub.lookAt[i].pos); DbCamera_Vec3SToF2(&dbCamera->sub.position[i].pos, &spD8); func_800B3F94(temp_s6, &spD8, &dbCamera->sub.position[i].pos); } } else { for (i = 0; i < dbCamera->sub.nPoints; i++) { func_800B404C(temp_s6, &dbCamera->sub.lookAt[i].pos, &spD8); DbCamera_Vec3FToS(&spD8, &dbCamera->sub.lookAt[i].pos); func_800B404C(temp_s6, &dbCamera->sub.position[i].pos, &spD8); DbCamera_Vec3FToS(&spD8, &dbCamera->sub.position[i].pos); } } break; case 4: dbCamera->sub.unk_0C = false; break; case 2: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll -= 5; dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll; } else { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll--; dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll; } dbCamera->rollDegrees = dbCamera->roll * 1.40625f; break; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DLEFT)) { if ((D_8012D10C++ % 5) == 0) { Audio_PlaySoundGeneral(NA_SE_SY_ATTENTION_ON, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } switch (dbCamera->sub.unk_0A) { case 0: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle -= 1.0f; dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle; } else { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle -= 0.2f; dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle; } break; case 5: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.nFrames -= 10; } else { dbCamera->sub.nFrames--; } if (dbCamera->sub.nFrames < -1) { if (dbCamera->sub.nPoints < 5) { dbCamera->sub.nFrames = -1; } else { dbCamera->sub.nFrames = 0; for (i = 0; i < dbCamera->sub.nPoints; i++) { dbCamera->sub.nFrames += dbCamera->sub.lookAt[i].nextPointFrame; } i = dbCamera->sub.nFrames / dbCamera->sub.nPoints; dbCamera->sub.nFrames -= (s16)(i * 5); } } break; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DRIGHT)) { Audio_PlaySoundGeneral(NA_SE_SY_ATTENTION_ON, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); switch (dbCamera->sub.unk_0A) { case 1: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame += 5; } else { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame++; } break; case 3: dbCamera->sub.mode++; if (dbCamera->sub.mode == 3) { dbCamera->sub.mode = 0; } if (dbCamera->sub.mode == 1) { dbCamera->unk_78 = 2; for (i = 0; i < dbCamera->sub.nPoints; i++) { DbCamera_Vec3SToF2(&dbCamera->sub.lookAt[i].pos, &spD8); func_800B3F94(temp_s6, &spD8, &dbCamera->sub.lookAt[i].pos); DbCamera_Vec3SToF2(&dbCamera->sub.position[i].pos, &spD8); func_800B3F94(temp_s6, &spD8, &dbCamera->sub.position[i].pos); } } else { for (i = 0; i < dbCamera->sub.nPoints; i++) { func_800B404C(temp_s6, &dbCamera->sub.lookAt[i].pos, &spD8); DbCamera_Vec3FToS(&spD8, &dbCamera->sub.lookAt[i].pos); func_800B404C(temp_s6, &dbCamera->sub.position[i].pos, &spD8); DbCamera_Vec3FToS(&spD8, &dbCamera->sub.position[i].pos); } } case 4: dbCamera->sub.unk_0C = true; break; case 2: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll += 5; dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll; } else { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll++; dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll; } dbCamera->rollDegrees = dbCamera->roll * 1.40625f; break; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_DRIGHT)) { if ((D_8012D10C++ % 5) == 0) { Audio_PlaySoundGeneral(NA_SE_SY_ATTENTION_ON, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } switch (dbCamera->sub.unk_0A) { case 0: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle += 1.0f; dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle; } else { dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle += 0.2f; dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle; } break; case 5: if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { dbCamera->sub.nFrames += 10; } else { dbCamera->sub.nFrames++; } if (&dbCamera->at) {} break; } } DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle, &D_8012D05C[10], 3); func_8006376C(0x10, 0x14, (dbCamera->sub.unk_0A == 0) ? 7 : 4, D_8012D05C); DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame, &D_8012D070[9], 3); func_8006376C(0x10, 0x15, (dbCamera->sub.unk_0A == 1) ? 7 : 4, D_8012D070); DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll, &D_8012D084[10], 3); func_8006376C(0x10, 0x16, (dbCamera->sub.unk_0A == 2) ? 7 : 4, D_8012D084); func_8006376C(0xF, 0x17, (dbCamera->sub.unk_0A == 3) ? 7 : 4, (dbCamera->sub.mode == 1) ? D_8012CF14 : (dbCamera->sub.mode == 0) ? *D_8012CF18 : D_8012CFB0); if (dbCamera->sub.unk_0C) { D_8012D05C[80] = '>'; } else { D_8012D05C[80] = '<'; } D_8012D05C[81] = ' '; D_8012D05C[94] = ' '; if (dbCamera->sub.unk_0C) { D_8012D05C[95] = '>'; } else { D_8012D05C[95] = '<'; } D_8012D05C[96] = '\0'; func_8006376C(0xF, 0x18, (dbCamera->sub.unk_0A == 4) ? 7 : 4, D_8012D0AC); DbCamera_SetTextValue(dbCamera->sub.nFrames, &D_8012D0C0[10], 5); func_8006376C(0xF, 0x19, (dbCamera->sub.unk_0A == 5) ? 7 : 4, (dbCamera->sub.nFrames == -1) ? *D_8012CF24 : D_8012D0C0); break; } if (dbCamera->sub.mode != 1) { func_8006376C(3, 0x16, ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && !D_80161144) ? 7 : !D_80161144 ? 4 : 3, D_8012CF30); sp110 = 'X'; DbCamera_SetTextValue(dbCamera->at.x, &sp111, 6); func_8006376C(3, 0x17, 2, &sp110); sp110 = 'Y'; DbCamera_SetTextValue(dbCamera->at.y, &sp111, 6); func_8006376C(3, 0x18, 2, &sp110); sp110 = 'Z'; DbCamera_SetTextValue(dbCamera->at.z, &sp111, 6); func_8006376C(3, 0x19, 2, &sp110); func_8006376C(0x1E, 0x16, ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && D_80161144) ? 7 : D_80161144 ? 4 : 3, D_8012CF34); sp110 = 'X'; DbCamera_SetTextValue(dbCamera->eye.x, &sp111, 6); func_8006376C(0x1E, 0x17, 2, &sp110); sp110 = 'Y'; DbCamera_SetTextValue(dbCamera->eye.y, &sp111, 6); func_8006376C(0x1E, 0x18, 2, &sp110); sp110 = 'Z'; DbCamera_SetTextValue(dbCamera->eye.z, &sp111, 6); func_8006376C(0x1E, 0x19, 2, &sp110); } else { if (D_8012CEE0[0]) {} OLib_Vec3fDiffToVecSphGeo(&spFC, sp90, sp7C); spFC.yaw -= cam->playerPosRot.rot.y; func_8006376C(3, 0x16, ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && !D_80161144) ? 7 : !D_80161144 ? 4 : 3, D_8012CF30); DbCamera_SetTextValue(spFC.pitch * 0.00549325f, &D_8012D0E4[10], 4); func_8006376C(3, 0x17, 3, D_8012D0E4); DbCamera_SetTextValue(spFC.yaw * 0.00549325f, &D_8012D0F8[10], 4); func_8006376C(3, 0x18, 3, D_8012D0F8); DbCamera_SetTextValue(spFC.r, &D_8012D0D4[7], 6); func_8006376C(3, 0x19, 3, D_8012D0D4); OLib_Vec3fDiffToVecSphGeo(&spFC, sp90, sp80); spFC.yaw -= cam->playerPosRot.rot.y; func_8006376C(0x1E, 0x16, ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && D_80161144) ? 7 : D_80161144 ? 4 : 3, D_8012CF34); DbCamera_SetTextValue(spFC.pitch * 0.00549325f, &D_8012D0E4[10], 4); func_8006376C(0x1C, 0x17, 3, D_8012D0E4); DbCamera_SetTextValue(spFC.yaw * 0.00549325f, &D_8012D0F8[10], 4); func_8006376C(0x1C, 0x18, 3, D_8012D0F8); DbCamera_SetTextValue(spFC.r, &D_8012D0D4[7], 6); func_8006376C(0x1C, 0x19, 3, D_8012D0D4); } DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 0.02f, 2.0f, 0.02f, 0xFF, 0xFF, 0x7F, 0x40, 0, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 2.0f, 0.02f, 0.02f, 0x7F, 0xFF, 0xFF, 0x40, 0, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 0.02f, 0.02f, 2.0f, 0xFF, 0x7F, 0xFF, 0x40, 0, cam->globalCtx->view.gfxCtx); if (dbCamera->sub.unk_08 == 2) { for (i = 0; i < (dbCamera->sub.nPoints - 1); i++) { if (dbCamera->sub.mode != 1) { DbCamera_Vec3SToF2(&(dbCamera->sub.position + i)->pos, &spAC); DbCamera_Vec3SToF2(&(dbCamera->sub.lookAt + i)->pos, &spB8); } else { func_800B404C(temp_s6, &(dbCamera->sub.lookAt + i)->pos, &spB8); func_800B404C(temp_s6, &(dbCamera->sub.position + i)->pos, &spAC); } OLib_Vec3fDiffToVecSphGeo(&spFC, &spAC, &spB8); spAA = dbCamera->sub.lookAt[i].cameraRoll * 0xB6; if (i == dbCamera->sub.unkIdx) { DebugDisplay_AddObject(spAC.x, spAC.y, spAC.z, spFC.pitch * -1, spFC.yaw, spAA, .5f, .5f, .5f, 0x7F, 0xFF, 0x7F, 0x80, 5, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(spB8.x, spB8.y, spB8.z, spFC.pitch * -1, spFC.yaw, spAA, 1.5f, 2.0f, 1.0f, 0x7F, 0xFF, 0x7F, 0x80, 4, cam->globalCtx->view.gfxCtx); } else { DebugDisplay_AddObject(spAC.x, spAC.y, spAC.z, spFC.pitch * -1, spFC.yaw, spAA, .5f, .5f, .5f, 0xFF, 0x7F, 0x7F, 0x80, 5, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(spB8.x, spB8.y, spB8.z, spFC.pitch * -1, spFC.yaw, spAA, 1.5f, 2.0f, 1.0f, 0xFF, 0x7F, 0x7F, 0x80, 4, cam->globalCtx->view.gfxCtx); } } } } } else { OREG(0) = 8; dbCamera->roll = 0; dbCamera->fov = 60.0f; dbCamera->rollDegrees = dbCamera->roll * 1.40625f; if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CLEFT)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->unk_78 = (dbCamera->unk_78 + 1) % 3; dbCamera->unk_38 = -1; } func_8006376C(0xE, 5, 0, D_8012CF38); func_8006376C(9, 6, (dbCamera->unk_78 == 0) ? 7 : 4, D_8012CFD0); func_8006376C(0x11, 6, (dbCamera->unk_78 == 1) ? 7 : 4, D_8012CFE4); func_8006376C(0x18, 6, (dbCamera->unk_78 == 2) ? 7 : 4, D_8012CFF8); func_8006376C(3, 0x16, D_80161144 ? 3 : 4, D_8012CF30); sp110 = 'X'; DbCamera_SetTextValue(dbCamera->at.x, &sp111, 6); func_8006376C(3, 0x17, 2, &sp110); sp110 = 'Y'; DbCamera_SetTextValue(dbCamera->at.y, &sp111, 6); func_8006376C(3, 0x18, 2, &sp110); sp110 = 'Z'; DbCamera_SetTextValue(dbCamera->at.z, &sp111, 6); func_8006376C(3, 0x19, 2, &sp110); func_8006376C(0x1E, 0x16, D_80161144 ? 4 : 3, D_8012CF34); sp110 = 'X'; DbCamera_SetTextValue(dbCamera->eye.x, &sp111, 6); func_8006376C(0x1E, 0x17, 2, &sp110); sp110 = 'Y'; DbCamera_SetTextValue(dbCamera->eye.y, &sp111, 6); func_8006376C(0x1E, 0x18, 2, &sp110); sp110 = 'Z'; DbCamera_SetTextValue(dbCamera->eye.z, &sp111, 6); func_8006376C(0x1E, 0x19, 2, &sp110); func_8006376C(0xD, 0x18, 3, !D_80161144 ? D_8012CF04 : D_8012CF08); DbCamera_SetTextValue(sp104.pitch * 0.00549325f, &D_8012D0E4[11], 4); func_8006376C(0xF, 0x17, 3, D_8012D0E4); DbCamera_SetTextValue(sp104.yaw * 0.00549325f, &D_8012D0F8[11], 4); func_8006376C(0xF, 0x18, 3, D_8012D0F8); DbCamera_SetTextValue(sp104.r, &D_8012D0D4[8], 6); func_8006376C(0xF, 0x19, 3, D_8012D0D4); if (dbCamera->unk_3C) { func_8006376C(0x10, 0x1A, 1, D_8012CF3C); } else { func_8006376C(0x10, 0x1A, 1, D_8012CF40); } D_8012D110++; D_8012D110 %= 50; OLib_Vec3fDiffToVecSphGeo(&spA0, &cam->eye, &cam->at); DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 0.02f, 2.0f, 0.02f, 0xFF, 0xFF, 0x7F, 0x2D, 0, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 2.0f, 0.02f, 0.02f, 0x7F, 0xFF, 0xFF, 0x2D, 0, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 0.02f, 0.02f, 2.0f, 0xFF, 0x7F, 0xFF, 0x2D, 0, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(cam->eye.x, cam->eye.y, cam->eye.z, spA0.pitch * -1, spA0.yaw, 0, .5f, .5f, .5f, 0xFF, 0x7F, 0x7F, 0x80, 5, cam->globalCtx->view.gfxCtx); DebugDisplay_AddObject(cam->at.x, cam->at.y, cam->at.z, spA0.pitch * -1, spA0.yaw, 0, 1.5f, 2.0f, 1.0f, 0xFF, 0x7F, 0x7F, 0x80, 4, cam->globalCtx->view.gfxCtx); OLib_Vec3fDiffToVecSphGeo(&spA0, &cam->eyeNext, &cam->at); DebugDisplay_AddObject(cam->eyeNext.x, cam->eyeNext.y, cam->eyeNext.z, spA0.pitch * -1, spA0.yaw, 0, .5f, .5f, .5f, 0xFF, 0xC0, 0x7F, 0x50, 5, cam->globalCtx->view.gfxCtx); } } static s16 sCurFileIdx; static s16 sLastFileIdx; // holds the file index of the slot to move // is the size correct? todo: add ALIGN32 for sizeof in Mempak functions, replace 0xF with sizeof() static DbCameraCut sDbCameraCuts[16]; static char D_80161250[0x80]; static char sLetters[26]; static char D_801612EA; static s32 sAllocSize; s32 DbCamera_GetFirstAvailableLetter(void) { s32 i; for (i = 0; i < ARRAY_COUNT(sLetters); i++) { switch (sLetters[i]) { case 'O': break; default: return 'A' + i; } } return '?'; } char DbCamera_InitCut(s32 idx, DbCameraSub* sub) { s32 i; sDbCameraCuts[idx].unk_01 = 0x61; sDbCameraCuts[idx].letter = DbCamera_GetFirstAvailableLetter(); D_80161250[0x3F + sDbCameraCuts[idx].letter] = 'O'; i = sub->nPoints * sizeof(CutsceneCameraPoint); sDbCameraCuts[idx].lookAt = DebugArena_MallocDebug(i, "../db_camera.c", 2748); if (sDbCameraCuts[idx].lookAt == NULL) { // "Debug camera memory allocation failure" osSyncPrintf("%s: %d: デバッグカメラ メモリ確保失敗!!\n", "../db_camera.c", 2751); return '?'; } sDbCameraCuts[idx].position = DebugArena_MallocDebug(i, "../db_camera.c", 2754); if (sDbCameraCuts[idx].position == NULL) { // "Debug camera memory allocation failure" osSyncPrintf("%s: %d: デバッグカメラ メモリ確保失敗!!\n", "../db_camera.c", 2757); DebugArena_FreeDebug(sDbCameraCuts[idx].lookAt, "../db_camera.c", 2758); sDbCameraCuts[idx].lookAt = NULL; return '?'; } sDbCameraCuts[idx].mode = sub->mode; sDbCameraCuts[idx].nFrames = sub->nFrames; sDbCameraCuts[idx].nPoints = sub->nPoints; for (i = 0; i < sub->nPoints; i++) { sDbCameraCuts[idx].lookAt[i] = sub->lookAt[i]; sDbCameraCuts[idx].position[i] = sub->position[i]; } return sDbCameraCuts[idx].letter; } void DbCamera_ResetCut(s32 idx, s32 shouldFree) { if (sDbCameraCuts[idx].letter != '?') { D_80161250[0x3F + sDbCameraCuts[idx].letter] = 'X'; } if (shouldFree) { DebugArena_FreeDebug(sDbCameraCuts[idx].lookAt, "../db_camera.c", 2784); DebugArena_FreeDebug(sDbCameraCuts[idx].position, "../db_camera.c", 2785); } sDbCameraCuts[idx].letter = '?'; sDbCameraCuts[idx].lookAt = NULL; sDbCameraCuts[idx].position = NULL; sDbCameraCuts[idx].mode = 0; sDbCameraCuts[idx].nFrames = 0; sDbCameraCuts[idx].nPoints = 0; } s32 DbCamera_CalcMempakAllocSize(void) { s32 i; sAllocSize = 0; for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { if (sDbCameraCuts[i].letter != '?') { sAllocSize += ALIGN32(sDbCameraCuts[i].nPoints * sizeof(CutsceneCameraPoint)) * 2; } } sAllocSize += 0x100; sAllocSize = ALIGN256(sAllocSize); return sAllocSize; } s32 DbCamera_GetMempakAllocSize(void) { return sAllocSize; } s32 DbCamera_LoadCallback(char* c) { s32 i; s32 size; s32 off; for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { if (sDbCameraCuts[i].letter != '?') { DbCamera_ResetCut(i, true); sLetters[i] = 'X'; } } if (!Mempak_Read(2, *c, sDbCameraCuts, 0, sizeof(sDbCameraCuts))) { return false; } off = sizeof(sDbCameraCuts); for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { if (sDbCameraCuts[i].letter != '?') { size = sDbCameraCuts[i].nPoints * sizeof(CutsceneCameraPoint); sDbCameraCuts[i].lookAt = DebugArena_MallocDebug(ALIGN32(size), "../db_camera.c", 2844); if (sDbCameraCuts[i].lookAt == NULL) { // "Debug camera memory allocation failure" osSyncPrintf("%s: %d: デバッグカメラ メモリ確保失敗!!\n", "../db_camera.c", 2847); return false; } if (!Mempak_Read(2, *c, sDbCameraCuts[i].lookAt, off, ALIGN32(size))) { return false; } off += ALIGN32(size); sDbCameraCuts[i].position = DebugArena_MallocDebug(ALIGN32(size), "../db_camera.c", 2855); if (sDbCameraCuts[i].position == NULL) { // "Debug camera memory allocation failure" osSyncPrintf("%s: %d: デバッグカメラ メモリ確保失敗!!\n", "../db_camera.c", 2858); return false; } if (!Mempak_Read(2, *c, sDbCameraCuts[i].position, off, ALIGN32(size))) { return false; } off += ALIGN32(size); D_80161250[0x3F + sDbCameraCuts[i].letter] = 'O'; } } return true; } s32 DbCamera_SaveCallback(char* c) { s32 pad[2]; s32 ret; u32 freeSize; s32 off; s32 size; s32 i; ret = Mempak_GetFileSize(2, *c); freeSize = Mempak_GetFreeBytes(2); if ((u32)sAllocSize < (freeSize + ret)) { if (!Mempak_Alloc(2, c, sAllocSize)) { return false; } if (!Mempak_Write(2, *c, sDbCameraCuts, 0, sizeof(sDbCameraCuts))) { Mempak_DeleteFile(2, *c); return false; } off = sizeof(sDbCameraCuts); for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { if (sDbCameraCuts[i].letter != '?') { size = sDbCameraCuts[i].nPoints * sizeof(CutsceneCameraPoint); ret = Mempak_Write(2, *c, sDbCameraCuts[i].lookAt, off, ALIGN32(size)); if (!ret) { break; } off += ALIGN32(size); ret = Mempak_Write(2, *c, sDbCameraCuts[i].position, off, ALIGN32(size)); if (!ret) { break; } off += ALIGN32(size); } ret = true; } if (ret) { return *c; } else { Mempak_DeleteFile(2, *c); return false; } } return false; } s32 DbCamera_ClearCallback(char* c) { return Mempak_DeleteFile(2, *c); } void DbCamera_DrawSlotLetters(char* str, s16 y, s16 x, s32 colorId) { s32 i; for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { str[i * 2 + 1] = sDbCameraCuts[i].letter; str[i * 2 + 0] = '-'; } str[0x14] = str[i * 2 + 1] = '\0'; func_8006376C(x, y, colorId, str); str[0x14] = str[i * 2 + 0] = '-'; func_8006376C(x + 0x14, y, colorId, str + 0x14); } void DbCamera_PrintAllCuts(Camera* cam) { s32 i; Audio_PlaySoundGeneral(NA_SE_SY_GET_RUPY, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); osSyncPrintf("@@@\n@@@\n@@@/* ****** spline point data ** start here ***** */\n@@@\n"); for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { DbCameraCut* cut = &sDbCameraCuts[i]; if (cut->nPoints != 0) { if (i != 0) { osSyncPrintf("@@@\n@@@/* ** %d ** */\n@@@\n", i); } DbCamera_PrintPoints("Lookat", cut->nPoints, cut->lookAt); DbCamera_PrintPoints("Position", cut->nPoints, cut->position); osSyncPrintf("@@@static short nPoints = %d;\n@@@\n", cut->nPoints); osSyncPrintf("@@@static short nFrames = %d;\n@@@\n", cut->nFrames); osSyncPrintf("@@@static short Mode = %d;\n@@@\n", cut->mode); } } osSyncPrintf("@@@\n@@@\n@@@/* ****** spline point data ** finish! ***** */\n@@@\n"); } char D_8012D114[] = GFXP_KATAKANA "フレ-ム "; char D_8012D128[] = GFXP_KATAKANA "ト-タル "; char D_8012D13C[] = GFXP_KATAKANA "キ- / "; s32 func_800B91B0(Camera* cam, DbCamera* dbCamera) { s32 pointCount; s32 curPoint; while (sDbCameraCuts[D_8016110C].letter == '?') { D_8016110C++; if (D_8016110C >= ARRAY_COUNT(sDbCameraCuts) - 1) { sDbCamAnim.curFrame = 0.0f; sDbCamAnim.unk_04 = 0; sDbCamAnim.keyframe = 0; sDbCamAnim.unk_0A = 0; D_8016110C = 0; return 0; } } if (!func_800BB2B4(&sDbCamAnim.positionPos, &sDbCamAnim.roll, &sDbCamAnim.fov, sDbCameraCuts[D_8016110C].position, &sDbCamAnim.keyframe, &sDbCamAnim.curFrame) && !func_800BB2B4(&sDbCamAnim.lookAtPos, &sDbCamAnim.roll, &sDbCamAnim.fov, sDbCameraCuts[D_8016110C].lookAt, &sDbCamAnim.keyframe, &sDbCamAnim.curFrame)) { D_8012D13C[7] = ((sDbCamAnim.keyframe + 1) / 10) + '0'; D_8012D13C[8] = ((sDbCamAnim.keyframe + 1) % 10) + '0'; D_8012D13C[10] = ((sDbCameraCuts[D_8016110C].nPoints - 5) / 10) + '0'; D_8012D13C[11] = ((sDbCameraCuts[D_8016110C].nPoints - 5) % 10) + '0'; DbCamera_SetTextValue(sDbCamAnim.unk_04, &D_8012D114[10], 4); func_8006376C(0xF, 0x16, 3, D_8012D114); DbCamera_SetTextValue(sDbCamAnim.unk_0C, &D_8012D128[10], 4); func_8006376C(0xF, 0x17, 3, D_8012D128); func_8006376C(0xF, 0x18, 3, D_8012D13C); func_8006376C(0x10, 0x1A, 1, D_8012CEF0); sDbCamAnim.unk_04++; sDbCamAnim.unk_0C++; if (sDbCameraCuts[D_8016110C].nFrames > 0 && sDbCameraCuts[D_8016110C].nFrames < sDbCamAnim.unk_04) { D_8016110C++; sDbCamAnim.curFrame = 0.0f; sDbCamAnim.unk_04 = 0; sDbCamAnim.keyframe = 0; return D_8016110C | 0x8000; } if (sDbCameraCuts[D_8016110C].mode != 1) { DbCamera_CopyVec3f(&sDbCamAnim.positionPos, &dbCamera->eye); DbCamera_CopyVec3f(&sDbCamAnim.lookAtPos, &dbCamera->at); } else { func_800B3FF4(&cam->playerPosRot, &sDbCamAnim.lookAtPos, &dbCamera->at); func_800B3FF4(&cam->playerPosRot, &sDbCamAnim.positionPos, &dbCamera->eye); } dbCamera->fov = sDbCamAnim.fov; dbCamera->roll = sDbCamAnim.roll; dbCamera->rollDegrees = sDbCamAnim.roll * (360.0f / 256.0f); } else { D_8016110C++; sDbCamAnim.keyframe = 0; sDbCamAnim.curFrame = 0.0f; sDbCamAnim.unk_04 = 0; if (D_8016110C == ARRAY_COUNT(sDbCameraCuts) - 1) { D_8016110C = 0; sDbCamAnim.curFrame = 0.0f; sDbCamAnim.keyframe = 0; sDbCamAnim.unk_0A = 0; return -1; } } return D_8016110C | 0x8000; } void DbCamera_Reset(Camera* cam, DbCamera* dbCam) { s32 i; D_801612EA = '*'; for (i = 0; i < ARRAY_COUNT(sLetters); i++) { sLetters[i] = 'X'; } for (i = 0; i < 0xF; i++) { DbCamera_ResetCut(i, false); } sDbCamPtr = dbCam; D_8016110C = 0; sCurFileIdx = 0; sLastFileIdx = -1; sDbCamAnim.unk_0A = 0; } s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) { static s32 sMempakFiles; static u32 sDbCameraColors[] = { 4, 4, 4, 7, 4, 4, }; static s32 sMempakFilesize = 0; s32 i; s32 idx1; s32 idx2; s16 idx3; char sp74[(ARRAY_COUNT(sDbCameraCuts) - 1 + 4) * 2]; DbCameraCut sp64; VecSph sp5C; s32 (*callbacks[])(char*) = { DbCamera_SaveCallback, DbCamera_LoadCallback, DbCamera_ClearCallback }; func_8006376C(0xE, 5, 0, D_8012CF44); // DEMO CONTROL idx1 = sCurFileIdx >> 1; idx2 = sLastFileIdx >> 1; switch (dbCamera->sub.demoCtrlActionIdx) { case ACTION_SAVE: case ACTION_LOAD: case ACTION_CLEAR: switch (dbCamera->sub.demoCtrlMenu) { case DEMO_CTRL_MENU(ACTION_SAVE, MENU_INFO): case DEMO_CTRL_MENU(ACTION_LOAD, MENU_INFO): case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_INFO): { if ((1 << sCurFileIdx) & sMempakFiles) { if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DLEFT) || CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DRIGHT)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlToggleSwitch ^= 1; } D_8012CEE0[41][9] = sCurFileIdx + 'A'; func_8006376C(0xA, 7, 5, D_8012CEE0[41]); func_8006376C(0x10, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlActionIdx]); func_8006376C(0x14, 7, 5, D_8012CF88[0]); func_8006376C(0x11, 8, dbCamera->sub.demoCtrlToggleSwitch ? 4 : 7, D_8012CF94); func_8006376C(0x15, 8, dbCamera->sub.demoCtrlToggleSwitch ? 7 : 4, D_8012CF98); if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_A)) { if (dbCamera->sub.demoCtrlToggleSwitch == 0) { Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlMenu++; } else { Audio_PlaySoundGeneral(NA_SE_SY_CANCEL, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlMenu = 0; } } } else { if (dbCamera->sub.demoCtrlMenu == 100) { dbCamera->sub.demoCtrlMenu++; } else { dbCamera->sub.demoCtrlToggleSwitch ^= 1; D_8012CF84[9] = sCurFileIdx + 'A'; func_8006376C(0xD, 7, 5, D_8012CF88[-1]); // todo: find something better func_8006376C(0x12, 7, 5, D_8012CF80); func_8006376C(0xD, 9, dbCamera->sub.demoCtrlToggleSwitch ? 1 : 6, "PRESS B BUTTON"); } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_B)) { Audio_PlaySoundGeneral(NA_SE_SY_CANCEL, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlMenu = 0; return 1; } goto block_2; } case DEMO_CTRL_MENU(ACTION_SAVE, MENU_CALLBACK): case DEMO_CTRL_MENU(ACTION_LOAD, MENU_CALLBACK): case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_CALLBACK): { D_8012CEE0[41][9] = sCurFileIdx + 'A'; func_8006376C(0xC, 7, 5, D_8012CEE0[41]); func_8006376C(0x12, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlActionIdx]); func_8006376C(0x16, 7, 5, D_8012CF9C[0]); if (callbacks[dbCamera->sub.demoCtrlActionIdx - 1](&D_8012CF84[9])) { dbCamera->sub.demoCtrlMenu++; return 1; } else { dbCamera->sub.demoCtrlMenu += 8; return 1; } } case DEMO_CTRL_MENU(ACTION_SAVE, MENU_SUCCESS): case DEMO_CTRL_MENU(ACTION_LOAD, MENU_SUCCESS): case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_SUCCESS): { dbCamera->sub.demoCtrlToggleSwitch ^= 1; D_8012CEE0[41][9] = sCurFileIdx + 'A'; func_8006376C(0xD, 7, 5, D_8012CEE0[41]); func_8006376C(0x13, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlMenu / 100]); func_8006376C(0x17, 7, 5, D_8012CFA4); func_8006376C(0xD, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? 1 : 6, "PRESS B BUTTON"); if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_A) || CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_B)) { Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (dbCamera->sub.demoCtrlMenu == DEMO_CTRL_MENU(ACTION_LOAD, MENU_SUCCESS)) { dbCamera->sub.demoCtrlActionIdx = ACTION_E; } dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_INFO); return 1; } goto block_2; } case DEMO_CTRL_MENU(ACTION_SAVE, MENU_ERROR): case DEMO_CTRL_MENU(ACTION_LOAD, MENU_ERROR): case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_ERROR): { dbCamera->sub.demoCtrlToggleSwitch ^= 1; D_8012CEE0[41][9] = sCurFileIdx + 'A'; func_8006376C(0xD, 7, 5, D_8012CEE0[(dbCamera->sub.demoCtrlMenu / 100) + 32]); func_8006376C(0x11, 7, 5, D_8012CFAC); func_8006376C(0x17, 7, 5, D_8012CFA4); func_8006376C(0xD, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? 1 : 6, "PRESS B BUTTON"); if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_A) || CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_B)) { Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlMenu -= 9; } block_2: return 1; } case 1: goto block_1; default: { if (Mempak_Init(2)) { sMempakFiles = Mempak_FindFile(2, 'A', 'E'); dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_CALLBACK); DbCamera_CalcMempakAllocSize(); if ((1 << sCurFileIdx) & sMempakFiles) { sMempakFilesize = Mempak_GetFileSize(2, sCurFileIdx + 'A'); dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD; } else { sMempakFilesize = 0; dbCamera->sub.demoCtrlActionIdx = ACTION_SAVE; } block_1: idx2 = 1; for (i = 0; i < 5; i++) { sp74[i * 2 + 1] = (sMempakFiles & idx2) ? i + 'A' : '?'; sp74[i * 2 + 0] = '-'; idx2 <<= 1; } sp74[i * 2 + 0] = '-'; sp74[i * 2 + 1] = '\0'; if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DRIGHT)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (sCurFileIdx >= 4) { sCurFileIdx = 0; } else { sCurFileIdx++; } if ((1 << sCurFileIdx) & sMempakFiles) { sMempakFilesize = Mempak_GetFileSize(2, sCurFileIdx + 'A'); dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD; } else { sMempakFilesize = 0; dbCamera->sub.demoCtrlActionIdx = ACTION_SAVE; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DLEFT)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (sCurFileIdx <= 0) { sCurFileIdx = 4; } else { sCurFileIdx--; } if ((1 << sCurFileIdx) & sMempakFiles) { sMempakFilesize = Mempak_GetFileSize(2, sCurFileIdx + 'A'); dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD; } else { sMempakFilesize = 0; dbCamera->sub.demoCtrlActionIdx = ACTION_SAVE; } } idx3 = dbCamera->sub.demoCtrlActionIdx; func_8006376C(0xE, 7, 5, D_8012CF50[idx3]); func_8006376C(0xF, 7, 4, sp74); func_8006376C((sCurFileIdx * 2) + 0x10, 7, 7, "_"); // cursor DbCamera_SetTextValue(DbCamera_GetMempakAllocSize(), sp74, 6); func_8006376C(0xD, 9, 6, D_8012CF78); // NEED BYTE func_8006376C(0x11, 9, 4, sp74); DbCamera_SetTextValue(Mempak_GetFreeBytes(2), sp74, 6); func_8006376C(0xD, 0xA, 6, D_8012CF74); // FREE BYTE func_8006376C(0x11, 0xA, 4, sp74); if (sMempakFilesize != 0) { DbCamera_SetTextValue(sMempakFilesize, sp74, 6); func_8006376C(0xD, 0xB, 7, D_8012CFA8); func_8006376C(0x11, 0xB, 4, sp74); } idx1 = (dbCamera->sub.demoCtrlActionIdx + 2); func_8006376C(0xF, 0x16, 1, D_8012CF7C); func_8006376C(0x12, 0x17, sDbCameraColors[idx1], D_8012CF64); func_8006376C(0x12, 0x18, sDbCameraColors[idx1 - 1], D_8012CF68); func_8006376C(0x12, 0x19, sDbCameraColors[idx1 - 2], D_8012CF6C); func_8006376C(0xE, dbCamera->sub.demoCtrlActionIdx + 0x16, 7, D_8012CF0C); // current selection func_8006376C(0xD, 0x1A, 5, D_8012CF60[0]); func_8006376C(0x14, 0x1A, 5, D_8012CF70); if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DUP)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlActionIdx = (dbCamera->sub.demoCtrlActionIdx - 1) % 4u; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DDOWN)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlActionIdx = (dbCamera->sub.demoCtrlActionIdx + 1) % 4u; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_A)) { Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlToggleSwitch = 0; dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(dbCamera->sub.demoCtrlActionIdx, MENU_INFO); } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_B)) { Audio_PlaySoundGeneral(NA_SE_SY_CANCEL, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlActionIdx = ACTION_E; return 1; } goto block_2; } else { func_8006376C(0xC, 0x1A, 4, D_8012CF60[0]); func_8006376C(0x13, 0x1A, 4, D_8012CF80); if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_B) || CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DUP) || CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DDOWN)) { Audio_PlaySoundGeneral(NA_SE_SY_CANCEL, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlActionIdx = ACTION_E; } return 2; } break; } } break; default: { if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DUP)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_INFO); dbCamera->sub.demoCtrlActionIdx = (dbCamera->sub.demoCtrlActionIdx - 1) % 4u; sCurFileIdx = 0; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DDOWN)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_INFO); dbCamera->sub.demoCtrlActionIdx = (dbCamera->sub.demoCtrlActionIdx + 1) % 4u; sCurFileIdx = 0; } DbCamera_DrawSlotLetters(sp74, 7, 5, 4); if (sDbCamAnim.unk_0A != 0) { func_8006376C(4, 7, 5, D_8012CF4C); func_8006376C(D_8016110C * 2 + 6, 7, 7, ">"); if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CUP)) { if (D_8016110C > 0) { D_8016110C--; } sDbCamAnim.curFrame = 0.0f; sDbCamAnim.keyframe = 0; sDbCamAnim.unk_04 = 0; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CDOWN)) { if (D_8016110C < 14) { D_8016110C++; } sDbCamAnim.curFrame = 0.0f; sDbCamAnim.keyframe = 0; sDbCamAnim.unk_04 = 0; } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CLEFT)) { sDbCamAnim.unk_0A = 0; Interface_ChangeAlpha(2); ShrinkWindow_SetVal(0); D_8016110C = 0; return 2; } if (func_800B91B0(cam, dbCamera) == 0) { Interface_ChangeAlpha(2); ShrinkWindow_SetVal(0); Audio_PlaySoundGeneral(NA_SE_SY_GET_RUPY, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } OLib_Vec3fDiffToVecSphGeo(&sp5C, &dbCamera->eye, &dbCamera->at); DbCamera_CalcUpFromPitchYawRoll(&dbCamera->unk_1C, sp5C.pitch, sp5C.yaw, DEGF_TO_BINANG(dbCamera->rollDegrees)); return 2; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[1].press.button, BTN_CRIGHT)) { D_8015FCC8 = 0; gSaveContext.cutsceneIndex = 0xFFFD; gSaveContext.cutsceneTrigger = 1; sDbCamAnim.curFrame = 0.0f; sDbCamAnim.keyframe = 0; sDbCamAnim.unk_04 = 0; sDbCamAnim.unk_0A = 1; sDbCamAnim.unk_0C = 0; D_8016110C = 0; Audio_PlaySoundGeneral(NA_SE_SY_HP_RECOVER, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_L)) { if (sp74[sCurFileIdx] == '?') { sLastFileIdx = -1; D_801612EA = '*'; } else { sLastFileIdx = sCurFileIdx; D_801612EA = sDbCameraCuts[idx1].letter; } if (1) {} } else if (!CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L)) { if (sLastFileIdx != -1) { switch (sp74[sCurFileIdx]) { case '?': Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sDbCameraCuts[idx1] = sDbCameraCuts[idx2]; sp74[sCurFileIdx] = '?'; // useless DbCamera_ResetCut(idx2, false); break; case '-': Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sp64 = sDbCameraCuts[idx2]; if (sLastFileIdx < sCurFileIdx) { // rotate right for (i = idx2; i < idx1 - 1 && i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { sDbCameraCuts[i] = sDbCameraCuts[i + 1]; } sDbCameraCuts[idx1 - 1] = sp64; } else if (sCurFileIdx < sLastFileIdx) { // rotate left for (i = idx2; idx1 < i && i > 0; i--) { sDbCameraCuts[i] = sDbCameraCuts[i - 1]; } sDbCameraCuts[idx1] = sp64; } for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { sp74[i * 2 + 1] = sDbCameraCuts[i].letter; } break; default: Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); break; } } sLastFileIdx = -1; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_A)) { if (sp74[sCurFileIdx] == '?') { Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sp74[sCurFileIdx] = DbCamera_InitCut(idx1, &dbCamera->sub); if (sp74[sCurFileIdx] == '?') { func_8006376C(0xF, 0x18, 7, D_8012CF48); } } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_B)) { if (sp74[sCurFileIdx] != '?' && sp74[sCurFileIdx] != '-') { Audio_PlaySoundGeneral(NA_SE_SY_CANCEL, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sp74[sCurFileIdx] = '?'; DbCamera_ResetCut(idx1, true); } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_R)) { if (sp74[sCurFileIdx] != '?' && sp74[sCurFileIdx] != '-') { Audio_PlaySoundGeneral(NA_SE_SY_DECIDE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); for (i = 0; i < sDbCameraCuts[idx1].nPoints; i++) { dbCamera->sub.lookAt[i] = sDbCameraCuts[idx1].lookAt[i]; } // why use another loop for that... for (i = 0; i < sDbCameraCuts[idx1].nPoints; i++) { dbCamera->sub.position[i] = sDbCameraCuts[idx1].position[i]; } dbCamera->sub.mode = sDbCameraCuts[idx1].mode; dbCamera->sub.nFrames = sDbCameraCuts[idx1].nFrames; dbCamera->sub.nPoints = sDbCameraCuts[idx1].nPoints; dbCamera->sub.unkIdx = 0; func_800B41DC(dbCamera, dbCamera->sub.unkIdx, cam); sp74[sCurFileIdx] = '?'; DbCamera_ResetCut(idx1, true); dbCamera->unk_00 = 1; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DRIGHT)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); if (sCurFileIdx == 0x1E) { sCurFileIdx = 0; } else { sCurFileIdx++; } } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_DLEFT)) { Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); sCurFileIdx = (sCurFileIdx == 0) ? 0x1E : sCurFileIdx - 1; } if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L) && CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CRIGHT)) { for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { osSyncPrintf("###%2d:(%c) (%d %d) %d %d %d\n", i, sDbCameraCuts[i].letter, sDbCameraCuts[i].position, sDbCameraCuts[i].lookAt, sDbCameraCuts[i].nFrames, sDbCameraCuts[i].nPoints, sDbCameraCuts[i].mode); } DbCamera_PrintAllCuts(cam); } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].cur.button, BTN_L) && CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CLEFT)) { Audio_PlaySoundGeneral(NA_SE_SY_GET_RUPY, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) { if (sDbCameraCuts[i].nPoints != 0) { osSyncPrintf("\n@@@ /* CUT [%d]\t*/", i); DbCamera_PrintCutBytes(&sDbCameraCuts[i]); } } } else if (CHECK_BTN_ALL(sGlobalCtx->state.input[2].press.button, BTN_CRIGHT)) { sDbCamAnim.curFrame = 0.0f; sDbCamAnim.keyframe = 0; sDbCamAnim.unk_04 = 0.0f; sDbCamAnim.unk_0A = 1; sDbCamAnim.unk_0C = 0; Interface_ChangeAlpha(50); ShrinkWindow_SetVal(0x20); D_8016110C = 0; Audio_PlaySoundGeneral(NA_SE_SY_HP_RECOVER, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } func_8006376C(4, 7, 5, D_8012CF50[0]); sp74[1] = 0; if (sLastFileIdx != -1) { sp74[0] = D_801612EA; func_8006376C(sLastFileIdx + 5, 7, 2, sp74); } else { sp74[0] = '_'; } func_8006376C(sCurFileIdx + 5, 7, 7, sp74); break; } } return 1; } void func_800BB03C(Camera* cam) { func_800B91B0(cam, sDbCamPtr); } void func_800BB060(void) { sDbCamAnim.unk_0A = 0; } s32 func_800BB06C(void) { return sDbCamPtr->unk_00 == 2 && sDbCamAnim.unk_0A != 0; }