diff options
Diffstat (limited to 'src/code/z_camera.c')
| -rw-r--r-- | src/code/z_camera.c | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/src/code/z_camera.c b/src/code/z_camera.c index af63cc077..100783217 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -5189,6 +5189,9 @@ s32 Camera_Unique8(Camera* camera) { return Camera_Noop(camera); } +/** + * OnePoint Cutscene + */ s32 Camera_Unique9(Camera* camera) { Vec3f atTarget; Vec3f eyeTarget; @@ -5248,7 +5251,7 @@ s32 Camera_Unique9(Camera* camera) { if (rwData->keyFrameTimer == 0) { rwData->isNewKeyFrame = true; rwData->curKeyFrameIdx++; - if (rwData->curKeyFrameIdx < ONEPOINT_CS_INFO(camera)->keyFrameCnt) { + if (rwData->curKeyFrameIdx < ONEPOINT_CS_INFO(camera)->keyFrameCount) { rwData->curKeyFrame = &ONEPOINT_CS_INFO(camera)->keyFrames[rwData->curKeyFrameIdx]; rwData->keyFrameTimer = rwData->curKeyFrame->timerInit; @@ -5558,7 +5561,7 @@ s32 Camera_Unique9(Camera* camera) { scratchGeo.yaw = Camera_LERPCeilS(rwData->atEyeOffsetTarget.yaw, eyeNextAtOffset.yaw, rwData->curKeyFrame->lerpStepScale, 1); Camera_AddVecGeoToVec3f(eyeNext, at, &scratchGeo); - goto setAtFOVRoll; + goto setAtFovRoll; case ONEPOINT_CS_ACTION_ID_3: // linear interplation of eye/at/fov/roll using the step scale using eyeTarget @@ -5571,7 +5574,7 @@ s32 Camera_Unique9(Camera* camera) { FALLTHROUGH; case ONEPOINT_CS_ACTION_ID_11: case ONEPOINT_CS_ACTION_ID_12: - setAtFOVRoll: + setAtFovRoll: // linear interpolation of at/fov/roll using the step scale. camera->at.x = Camera_LERPCeilF(rwData->atTarget.x, camera->at.x, rwData->curKeyFrame->lerpStepScale, 1.0f); camera->at.y = Camera_LERPCeilF(rwData->atTarget.y, camera->at.y, rwData->curKeyFrame->lerpStepScale, 1.0f); @@ -5618,15 +5621,15 @@ s32 Camera_Unique9(Camera* camera) { case ONEPOINT_CS_ACTION_ID_19: { // Change the parent camera (or default)'s mode to normal - s32 camIdx = camera->parentCamId <= CAM_ID_NONE ? CAM_ID_MAIN : camera->parentCamId; + s32 camId = camera->parentCamId <= CAM_ID_NONE ? CAM_ID_MAIN : camera->parentCamId; - Camera_ChangeModeFlags(camera->play->cameraPtrs[camIdx], CAM_MODE_NORMAL, 1); + Camera_ChangeModeFlags(camera->play->cameraPtrs[camId], CAM_MODE_NORMAL, 1); } FALLTHROUGH; case ONEPOINT_CS_ACTION_ID_18: { // copy the current camera to the parent (or default)'s camera. - s32 camIdx = camera->parentCamId <= CAM_ID_NONE ? CAM_ID_MAIN : camera->parentCamId; - Camera* cam = camera->play->cameraPtrs[camIdx]; + s32 camId = camera->parentCamId <= CAM_ID_NONE ? CAM_ID_MAIN : camera->parentCamId; + Camera* cam = camera->play->cameraPtrs[camId]; *eye = *eyeNext; Camera_Copy(cam, camera); @@ -6015,7 +6018,7 @@ s32 Camera_Demo4(Camera* camera) { } /** - * Sets up a cutscene for Camera_Uniq9 + * Sets up a OnePoint attention cutscene */ s32 Camera_Demo5(Camera* camera) { f32 eyeTargetDist; @@ -6037,6 +6040,7 @@ s32 Camera_Demo5(Camera* camera) { Actor_GetFocus(&playerhead, &camera->player->actor); player = camera->player; sCameraInterfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_NOTHING_ALT, 0); + if ((camera->target == NULL) || (camera->target->update == NULL)) { if (camera->target == NULL) { osSyncPrintf(VT_COL(YELLOW, BLACK) "camera: warning: attention: target is not valid, stop!\n" VT_RST); @@ -6044,6 +6048,7 @@ s32 Camera_Demo5(Camera* camera) { camera->target = NULL; return true; } + Actor_GetFocus(&camera->targetPosRot, camera->target); OLib_Vec3fDiffToVecGeo(&playerTargetGeo, &camera->targetPosRot.pos, &camera->playerPosRot.pos); D_8011D3AC = camera->target->category; @@ -6051,6 +6056,7 @@ s32 Camera_Demo5(Camera* camera) { eyeTargetDist = OLib_Vec3fDist(&camera->targetPosRot.pos, &camera->eye); OLib_Vec3fDiffToVecGeo(&eyePlayerGeo, &playerhead.pos, &camera->eyeNext); sp4A = eyePlayerGeo.yaw - playerTargetGeo.yaw; + if (camera->target->category == ACTORCAT_PLAYER) { // camera is targeting a(the) player actor if (eyePlayerGeo.r > 30.0f) { @@ -6058,9 +6064,9 @@ s32 Camera_Demo5(Camera* camera) { D_8011D6AC[1].atTargetInit.z = Rand_ZeroOne() * 10.0f; D_8011D6AC[1].eyeTargetInit.x = Rand_ZeroOne() * 10.0f; ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D6AC; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D6AC); + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D6AC); if (camera->parentCamId != CAM_ID_MAIN) { - ONEPOINT_CS_INFO(camera)->keyFrameCnt--; + ONEPOINT_CS_INFO(camera)->keyFrameCount--; } else { camera->timer += D_8011D6AC[2].timerInit; } @@ -6068,9 +6074,9 @@ s32 Camera_Demo5(Camera* camera) { D_8011D724[1].eyeTargetInit.x = Rand_ZeroOne() * 10.0f; D_8011D724[1].timerInit = camera->timer - 1; ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D724; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D724); + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D724); if (camera->parentCamId != CAM_ID_MAIN) { - ONEPOINT_CS_INFO(camera)->keyFrameCnt--; + ONEPOINT_CS_INFO(camera)->keyFrameCount--; } else { camera->timer += D_8011D724[2].timerInit; } @@ -6078,9 +6084,9 @@ s32 Camera_Demo5(Camera* camera) { } else if (playerTargetGeo.r < 30.0f) { // distance between player and target is less than 30 units. ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D79C; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D79C); - if ((targetScreenPosX < 0x15) || (targetScreenPosX >= 0x12C) || (targetScreenPosY < 0x29) || - (targetScreenPosY >= 0xC8)) { + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D79C); + if ((targetScreenPosX <= 20) || (targetScreenPosX >= SCREEN_WIDTH - 20) || (targetScreenPosY <= 40) || + (targetScreenPosY >= SCREEN_HEIGHT - 40)) { D_8011D79C[0].actionFlags = ONEPOINT_CS_ACTION(ONEPOINT_CS_ACTION_ID_1, true, false); D_8011D79C[0].atTargetInit.y = -30.0f; D_8011D79C[0].atTargetInit.x = 0.0f; @@ -6093,7 +6099,7 @@ s32 Camera_Demo5(Camera* camera) { D_8011D79C[1].timerInit = camera->timer - 1; if (camera->parentCamId != CAM_ID_MAIN) { - ONEPOINT_CS_INFO(camera)->keyFrameCnt -= 2; + ONEPOINT_CS_INFO(camera)->keyFrameCount -= 2; } else { camera->timer += D_8011D79C[2].timerInit + D_8011D79C[3].timerInit; } @@ -6102,9 +6108,9 @@ s32 Camera_Demo5(Camera* camera) { // and the distance fromthe camera's current position to the player is less than 30 units D_8011D83C[0].timerInit = camera->timer; ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D83C; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D83C); + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D83C); if (camera->parentCamId != CAM_ID_MAIN) { - ONEPOINT_CS_INFO(camera)->keyFrameCnt--; + ONEPOINT_CS_INFO(camera)->keyFrameCount--; } else { camera->timer += D_8011D83C[1].timerInit; } @@ -6112,13 +6118,13 @@ s32 Camera_Demo5(Camera* camera) { // The distance between the camera's current position and the target is less than 700 units // and the angle between the camera's position and the player, and the player to the target // is less than ~76.9 degrees - if (targetScreenPosX >= 0x15 && targetScreenPosX < 0x12C && targetScreenPosY >= 0x29 && - targetScreenPosY < 0xC8 && eyePlayerGeo.r > 30.0f) { + if ((targetScreenPosX > 20) && (targetScreenPosX < SCREEN_WIDTH - 20) && (targetScreenPosY > 40) && + (targetScreenPosY < SCREEN_HEIGHT - 40) && (eyePlayerGeo.r > 30.0f)) { D_8011D88C[0].timerInit = camera->timer; ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D88C; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D88C); + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D88C); if (camera->parentCamId != CAM_ID_MAIN) { - ONEPOINT_CS_INFO(camera)->keyFrameCnt--; + ONEPOINT_CS_INFO(camera)->keyFrameCount--; } else { camera->timer += D_8011D88C[1].timerInit; } @@ -6134,9 +6140,9 @@ s32 Camera_Demo5(Camera* camera) { D_8011D8DC[0].timerInit = camera->timer; D_8011D8DC[1].timerInit = (s16)(eyeTargetDist * 0.005f) + 8; ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D8DC; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D8DC); + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D8DC); if (camera->parentCamId != CAM_ID_MAIN) { - ONEPOINT_CS_INFO(camera)->keyFrameCnt -= 2; + ONEPOINT_CS_INFO(camera)->keyFrameCount -= 2; } else { camera->timer += D_8011D8DC[1].timerInit + D_8011D8DC[2].timerInit; } @@ -6171,9 +6177,9 @@ s32 Camera_Demo5(Camera* camera) { D_8011D954[2].timerInit = (s16)(eyeTargetDist * 0.004f) + 6; } ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D954; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D954); + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D954); if (camera->parentCamId != CAM_ID_MAIN) { - ONEPOINT_CS_INFO(camera)->keyFrameCnt -= 2; + ONEPOINT_CS_INFO(camera)->keyFrameCount -= 2; } else { camera->timer += D_8011D954[2].timerInit + D_8011D954[3].timerInit; } @@ -6196,13 +6202,13 @@ s32 Camera_Demo5(Camera* camera) { D_8011D9F4[1].timerInit = t + 8; } ONEPOINT_CS_INFO(camera)->keyFrames = D_8011D9F4; - ONEPOINT_CS_INFO(camera)->keyFrameCnt = ARRAY_COUNT(D_8011D9F4); + ONEPOINT_CS_INFO(camera)->keyFrameCount = ARRAY_COUNT(D_8011D9F4); if (camera->parentCamId != CAM_ID_MAIN) { if (camera->play->state.frames & 1) { D_8011D9F4[0].rollTargetInit = -D_8011D9F4[0].rollTargetInit; D_8011D9F4[1].rollTargetInit = -D_8011D9F4[1].rollTargetInit; } - ONEPOINT_CS_INFO(camera)->keyFrameCnt -= 2; + ONEPOINT_CS_INFO(camera)->keyFrameCount -= 2; } else { camera->timer += D_8011D9F4[1].timerInit + D_8011D9F4[2].timerInit; D_8011D9F4[0].rollTargetInit = D_8011D9F4[1].rollTargetInit = 0; @@ -6240,7 +6246,9 @@ s32 Camera_Demo5(Camera* camera) { sDemo5PrevAction12Frame = camera->play->state.frames; Camera_ChangeSettingFlags(camera, CAM_SET_CS_C, (4 | 1)); + Camera_Unique9(camera); + return true; } |
