diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index feb076a76..746d80bf5 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -36,11 +36,17 @@ void set_sparkle_spawn_star_hitbox(void) { } } -void set_home_to_mario(void) { +void spawned_star_set_target_above_mario(void) { vec3f_copy_y_off(&o->oHomeVec, &gMarioObject->oPosVec, 250.0f); - o->oPosY = o->oHomeY; + // Check that the star isn't clipping inside the ceiling + if (gMarioState->ceil != NULL) { + if (o->oHomeY > (gMarioState->ceilHeight - 50)) { + o->oHomeY = gMarioState->ceilHeight - 50; + } + } + o->oPosY = o->oHomeY; f32 lateralDist; vec3f_get_lateral_dist(&o->oPosVec, &o->oHomeVec, &lateralDist); @@ -66,7 +72,7 @@ void bhv_spawned_star_loop(void) { o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP; o->oAngleVelYaw = 0x800; if (o->oBehParams2ndByte == SPAWN_STAR_POS_CUTSCENE_BP_SPAWN_AT_MARIO) { - set_home_to_mario(); + spawned_star_set_target_above_mario(); } else { set_y_home_to_pos(); } diff --git a/src/game/interaction.c b/src/game/interaction.c index 80b09f6e9..db7f36306 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -737,8 +737,9 @@ u32 interact_coin(struct MarioState *m, UNUSED u32 interactType, struct Object * #ifdef X_COIN_STAR if (COURSE_IS_MAIN_COURSE(gCurrCourseNum) && m->numCoins - obj->oDamageOrCoinValue < X_COIN_STAR - && m->numCoins >= X_COIN_STAR) { + && m->numCoins >= X_COIN_STAR && !g100CoinStarSpawned) { bhv_spawn_star_no_level_exit(STAR_BP_ACT_100_COINS); + g100CoinStarSpawned = TRUE; } #endif #if ENABLE_RUMBLE diff --git a/src/game/level_update.c b/src/game/level_update.c index 7fdd412e9..e80e62ff1 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -141,6 +141,8 @@ s16 sSourceWarpNodeId; s32 sDelayedWarpArg; s8 sTimerRunning; s8 gNeverEnteredCastle; +// Prevent multiple 100 coin stars from spawning +u8 g100CoinStarSpawned = FALSE; struct MarioState *gMarioState = &gMarioStates[0]; s8 sWarpCheckpointActive = FALSE; @@ -1173,6 +1175,8 @@ s32 init_level(void) { sTransitionTimer = 0; sSpecialWarpDest = WARP_SPECIAL_NONE; + g100CoinStarSpawned = FALSE; + if (gCurrCreditsEntry == NULL) { gHudDisplay.flags = HUD_DISPLAY_DEFAULT; } else { diff --git a/src/game/level_update.h b/src/game/level_update.h index 903c45214..31c7f79e6 100644 --- a/src/game/level_update.h +++ b/src/game/level_update.h @@ -122,6 +122,7 @@ struct HudDisplay { extern struct HudDisplay gHudDisplay; extern s8 gNeverEnteredCastle; +extern u8 g100CoinStarSpawned; enum HUDDisplayFlag { HUD_DISPLAY_FLAG_LIVES = (1 << 0), // 0x0001