From b9813acbc58b6ca4e7bb91d9703b4e380da822a0 Mon Sep 17 00:00:00 2001 From: MysterD Date: Sat, 3 Oct 2020 10:15:21 -0700 Subject: [PATCH] Prevent dying/bubbling from replaying intro level cutscene --- src/game/camera.c | 10 ++++++++++ src/game/camera.h | 1 + src/game/mario.c | 2 +- src/game/mario_actions_automatic.c | 2 +- src/game/mario_actions_cutscene.c | 2 +- 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/game/camera.c b/src/game/camera.c index c439b6d26..bab26bbf4 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -32,6 +32,8 @@ #define CBUTTON_MASK (U_CBUTTONS | D_CBUTTONS | L_CBUTTONS | R_CBUTTONS) +static u8 sSoftResettingCamera = FALSE; + /** * @file camera.c * Implements the camera system, including C-button input, camera modes, camera triggers, and cutscenes. @@ -3252,6 +3254,10 @@ void update_camera(struct Camera *c) { gLakituState.lastFrameAction = sMarioCamState->action; } +void soft_reset_camera(struct Camera* c) { + reset_camera(c); + sSoftResettingCamera = TRUE; +} /** * Reset all the camera variables to their arcane defaults */ @@ -3456,6 +3462,10 @@ void init_camera(struct Camera *c) { break; } + if (sSoftResettingCamera) { + c->cutscene = 0; + } + // Set the camera pos to marioOffset (relative to Mario), added to Mario's position offset_rotated(c->pos, sMarioCamState->pos, marioOffset, sMarioCamState->faceAngle); if (c->mode != CAMERA_MODE_BEHIND_MARIO) { diff --git a/src/game/camera.h b/src/game/camera.h index 95017afb1..5263bb9e9 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -687,6 +687,7 @@ void move_mario_head_c_up(UNUSED struct Camera *c); void transition_next_state(UNUSED struct Camera *c, s16 frames); void set_camera_mode(struct Camera *c, s16 mode, s16 frames); void update_camera(struct Camera *c); +void soft_reset_camera(struct Camera* c); void reset_camera(struct Camera *c); void init_camera(struct Camera *c); void select_mario_cam_mode(void); diff --git a/src/game/mario.c b/src/game/mario.c index aad3af6c1..7be59f0cc 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -403,7 +403,7 @@ void mario_set_bubbled(struct MarioState* m) { gCutsceneTimer = 0; if (m->playerIndex == 0) { - reset_camera(m->area->camera); + soft_reset_camera(m->area->camera); } } diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 1a72b2954..451056145 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -953,7 +953,7 @@ s32 act_bubbled(struct MarioState* m) { m->vel[2] = 0; m->marioObj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; if (m->playerIndex == 0) { - reset_camera(m->area->camera); + soft_reset_camera(m->area->camera); } return force_idle_state(m); } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 045f82ea5..9abc6f1ec 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -710,7 +710,7 @@ void general_star_dance_handler(struct MarioState *m, s32 isInWater) { set_mario_action(m, isInWater ? ACT_WATER_IDLE : ACT_IDLE, 0); } if (gServerSettings.stayInLevelAfterStar) { - reset_camera(m->area->camera); + soft_reset_camera(m->area->camera); } } }