From e61bf8fbc1daadd251c33d099f87167fed45e0f2 Mon Sep 17 00:00:00 2001 From: Gregory Heskett Date: Thu, 21 Sep 2023 15:23:03 -0400 Subject: [PATCH] Fix STAR_DANCE_USES_STARS_MODEL define (#688) --- src/game/interaction.c | 2 ++ src/game/level_update.c | 10 ++++++++++ src/game/mario_actions_cutscene.c | 7 ++++--- src/game/mario_actions_cutscene.h | 2 ++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/game/interaction.c b/src/game/interaction.c index a3bf70e0..3232113e 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -825,6 +825,8 @@ u32 interact_star_or_key(struct MarioState *m, UNUSED u32 interactType, struct O m->interactObj = obj; m->usedObj = obj; + gStarModelLastCollected = obj_get_model_id(obj); + #ifdef GLOBAL_STAR_IDS starIndex = (obj->oBehParams >> 24) & 0xFF; #else diff --git a/src/game/level_update.c b/src/game/level_update.c index c4d4e7b3..ade15313 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1238,6 +1238,16 @@ s32 init_level(void) { g100CoinStarSpawned = FALSE; + // NOTE: gStarModelLastCollected reset here as a safety to prevent possible UB if assigned a model used + // in a non-global group. This checked can be removed as needed. + if (gStarModelLastCollected != MODEL_BOWSER_KEY +#ifdef STAR_DANCE_USES_STARS_MODEL + || gStarModelLastCollected != MODEL_TRANSPARENT_STAR +#endif + ) { + gStarModelLastCollected = MODEL_STAR; + } + if (gCurrCreditsEntry == NULL) { gHudDisplay.flags = HUD_DISPLAY_DEFAULT; } else { diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 4b2d25b6..06684a9a 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -35,6 +35,7 @@ static struct Object *sEndLeftToadObj; static struct Object *sEndJumboStarObj; static s16 sEndPeachAnimation; static s16 sEndToadAnims[2]; +ModelID32 gStarModelLastCollected = MODEL_STAR; Vp sEndCutsceneVp = { { @@ -589,10 +590,10 @@ void general_star_dance_handler(struct MarioState *m, s32 isInWater) { case 1: celebStar = spawn_object(m->marioObj, MODEL_STAR, bhvCelebrationStar); #ifdef STAR_DANCE_USES_STARS_MODEL - celebStar->header.gfx.sharedChild = m->interactObj->header.gfx.sharedChild; + obj_set_model(celebStar, gStarModelLastCollected); #else - if (obj_has_model(m->interactObj, MODEL_BOWSER_KEY)) { - obj_set_model(celebStar, MODEL_BOWSER_KEY); + if (gStarModelLastCollected == MODEL_BOWSER_KEY) { + obj_set_model(celebStar, gStarModelLastCollected); } #endif disable_background_sound(); diff --git a/src/game/mario_actions_cutscene.h b/src/game/mario_actions_cutscene.h index 76d8ed8b..6fcd6056 100644 --- a/src/game/mario_actions_cutscene.h +++ b/src/game/mario_actions_cutscene.h @@ -127,6 +127,8 @@ enum EndToadAnimIndex { END_TOAD_INDEX_EAST, }; +extern ModelID32 gStarModelLastCollected; + void print_displaying_credits_entry(void); void bhv_end_peach_loop(void); void bhv_end_toad_loop(void);