From 62772067d5293357cd9af1dd712394ff1e8606a7 Mon Sep 17 00:00:00 2001 From: mineqwerty Date: Sun, 4 Jun 2023 21:19:51 -0400 Subject: [PATCH] added support for up to 99 red coins in an area --- data/behavior_data.c | 1 + include/object_fields.h | 4 ++++ src/game/behavior_actions.h | 1 + src/game/behaviors/hidden_star.inc.c | 9 ++++++++- src/game/behaviors/orange_number.inc.c | 8 ++++++++ src/game/behaviors/red_coin.inc.c | 28 ++++++++++++++++++++------ src/game/behaviors/spawn_star.inc.c | 5 +++-- src/game/obj_behaviors.c | 3 +++ 8 files changed, 50 insertions(+), 9 deletions(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index 50d6791bf..b8bdf1e74 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -4581,6 +4581,7 @@ const BehaviorScript bhvRedCoin[] = { const BehaviorScript bhvBowserCourseRedCoinStar[] = { BEGIN(OBJ_LIST_LEVEL), OR_INT(oFlags, (OBJ_FLAG_PERSISTENT_RESPAWN | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), + CALL_NATIVE(bhv_bowser_course_red_coin_star_init), BEGIN_LOOP(), CALL_NATIVE(bhv_bowser_course_red_coin_star_loop), END_LOOP(), diff --git a/include/object_fields.h b/include/object_fields.h index 2a17465f5..c4d69aeb6 100644 --- a/include/object_fields.h +++ b/include/object_fields.h @@ -797,6 +797,9 @@ #define /*0x0F8*/ oRespawnerMinSpawnDist OBJECT_FIELD_F32(0x1C) #define /*0x0FC*/ oRespawnerBehaviorToRespawn OBJECT_FIELD_CVPTR(0x1D) +/* Orange Number */ +#define /*0x110*/ oOrangeNumberOffset OBJECT_FIELD_S32(0x22) + /* Openable Grill */ #define /*0x088*/ oOpenableGrillIsOpen OBJECT_FIELD_S32(0x00) #define /*0x0F4*/ oOpenableGrillFloorSwitchObj OBJECT_FIELD_OBJ(0x1B) @@ -998,6 +1001,7 @@ /* Hidden Star */ // Secrets/Red Coins #define /*0x0F4*/ oHiddenStarTriggerCounter OBJECT_FIELD_S32(0x1B) +#define /*0x0F8*/ oHiddenStarTriggerTotal OBJECT_FIELD_S32(0x1C) /* Sealed Door Star */ #define /*0x108*/ oUnlockDoorStarState OBJECT_FIELD_U32(0x20) diff --git a/src/game/behavior_actions.h b/src/game/behavior_actions.h index 0487d5424..1bf0d9c41 100644 --- a/src/game/behavior_actions.h +++ b/src/game/behavior_actions.h @@ -380,6 +380,7 @@ void bhv_hidden_red_coin_star_init(void); void bhv_hidden_red_coin_star_loop(void); void bhv_red_coin_init(void); void bhv_red_coin_loop(void); +void bhv_bowser_course_red_coin_star_init(void); void bhv_bowser_course_red_coin_star_loop(void); void bhv_hidden_star_init(void); void bhv_hidden_star_loop(void); diff --git a/src/game/behaviors/hidden_star.inc.c b/src/game/behaviors/hidden_star.inc.c index 757a84cc9..449316b03 100644 --- a/src/game/behaviors/hidden_star.inc.c +++ b/src/game/behaviors/hidden_star.inc.c @@ -47,12 +47,19 @@ void bhv_hidden_star_trigger_loop(void) { } } +void bhv_bowser_course_red_coin_star_init(void) { + s16 numRedCoinsRemaining = count_objects_with_behavior(bhvRedCoin); + + o->oHiddenStarTriggerTotal = numRedCoinsRemaining + gRedCoinsCollected; + o->oHiddenStarTriggerCounter = o->oHiddenStarTriggerTotal - numRedCoinsRemaining; +} + void bhv_bowser_course_red_coin_star_loop(void) { gRedCoinsCollected = o->oHiddenStarTriggerCounter; switch (o->oAction) { case 0: - if (o->oHiddenStarTriggerCounter == 8) { + if (o->oHiddenStarTriggerCounter == o->oHiddenStarTriggerTotal) { o->oAction = 1; } break; diff --git a/src/game/behaviors/orange_number.inc.c b/src/game/behaviors/orange_number.inc.c index 7a03a7557..918a18688 100644 --- a/src/game/behaviors/orange_number.inc.c +++ b/src/game/behaviors/orange_number.inc.c @@ -3,6 +3,7 @@ void bhv_orange_number_init(void) { o->oAnimState = o->oBehParams2ndByte; o->oVelY = 26.0f; + o->oHomeY = o->oPosY; } void bhv_orange_number_loop(void) { @@ -16,6 +17,13 @@ void bhv_orange_number_loop(void) { o->oVelY = 14.0f; } + s32 offsetX, offsetZ; + offsetX = o->oOrangeNumberOffset * sins(gLakituState.nextYaw + 0x4000); + offsetZ = o->oOrangeNumberOffset * coss(gLakituState.nextYaw + 0x4000); + + o->oPosX = o->oHomeX + offsetX; + o->oPosZ = o->oHomeZ + offsetZ; + if (o->oTimer == 35) { struct Object *sparkleObj = spawn_object(o, MODEL_SPARKLES, bhvCoinSparklesSpawner); sparkleObj->oPosY -= 30.0f; diff --git a/src/game/behaviors/red_coin.inc.c b/src/game/behaviors/red_coin.inc.c index 36a56aa10..bdc08ecf9 100644 --- a/src/game/behaviors/red_coin.inc.c +++ b/src/game/behaviors/red_coin.inc.c @@ -50,18 +50,34 @@ void bhv_red_coin_loop(void) { o->parentObj->oHiddenStarTriggerCounter++; // Spawn the orange number counter, as long as it isn't the last coin. - if (o->parentObj->oHiddenStarTriggerCounter != 8) { - spawn_orange_number(o->parentObj->oHiddenStarTriggerCounter, 0, 0, 0); + if (o->parentObj->oHiddenStarTriggerCounter != o->parentObj->oHiddenStarTriggerTotal) { + if (o->parentObj->oHiddenStarTriggerCounter >= 99) { + spawn_orange_number(9, 14, 0, 0); + spawn_orange_number(9, -14, 0, 0); + } + else if (o->parentObj->oHiddenStarTriggerCounter >= 10) { + spawn_orange_number(o->parentObj->oHiddenStarTriggerCounter % 10, 14, 0, 0); + spawn_orange_number(o->parentObj->oHiddenStarTriggerCounter / 10, -14, 0, 0); + } + else { + spawn_orange_number(o->parentObj->oHiddenStarTriggerCounter, 0, 0, 0); + } } #ifdef JP_RED_COIN_SOUND // For JP version, play an identical sound for all coins. create_sound_spawner(SOUND_GENERAL_RED_COIN); #else - // On all versions but the JP version, each coin collected plays a higher noise. - play_sound(SOUND_MENU_COLLECT_RED_COIN - + (((u8) o->parentObj->oHiddenStarTriggerCounter - 1) << 16), - gGlobalSoundSource); + if (o->parentObj->oHiddenStarTriggerTotal - o->parentObj->oHiddenStarTriggerCounter > 7) { + // Play the first red coin sound until it gets to the final 8 + play_sound(SOUND_MENU_COLLECT_RED_COIN, gGlobalSoundSource); + } + else { + // On all versions but the JP version, each coin collected plays a higher noise. + play_sound(SOUND_MENU_COLLECT_RED_COIN + + (((u8) 7 - (o->parentObj->oHiddenStarTriggerTotal - o->parentObj->oHiddenStarTriggerCounter)) << 16), + gGlobalSoundSource); + } #endif } diff --git a/src/game/behaviors/spawn_star.inc.c b/src/game/behaviors/spawn_star.inc.c index 4dd039402..bc57646d6 100644 --- a/src/game/behaviors/spawn_star.inc.c +++ b/src/game/behaviors/spawn_star.inc.c @@ -164,7 +164,8 @@ void bhv_hidden_red_coin_star_init(void) { o->activeFlags = ACTIVE_FLAG_DEACTIVATED; } - o->oHiddenStarTriggerCounter = 8 - numRedCoinsRemaining; + o->oHiddenStarTriggerTotal = numRedCoinsRemaining + gRedCoinsCollected; + o->oHiddenStarTriggerCounter = o->oHiddenStarTriggerTotal - numRedCoinsRemaining; } void bhv_hidden_red_coin_star_loop(void) { @@ -172,7 +173,7 @@ void bhv_hidden_red_coin_star_loop(void) { switch (o->oAction) { case HIDDEN_STAR_ACT_INACTIVE: - if (o->oHiddenStarTriggerCounter == 8) { + if (o->oHiddenStarTriggerCounter == o->oHiddenStarTriggerTotal) { o->oAction = HIDDEN_STAR_ACT_ACTIVE; } break; diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index fd5a685e0..c554d4599 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -691,6 +691,9 @@ void spawn_orange_number(s8 behParam, s16 relX, s16 relY, s16 relZ) { struct Object *orangeNumber = spawn_object_relative(behParam, relX, relY, relZ, o, MODEL_NUMBER, bhvOrangeNumber); orangeNumber->oPosY += 25.0f; + orangeNumber->oOrangeNumberOffset = relX; + orangeNumber->oHomeX = o->oPosX; + orangeNumber->oHomeZ = o->oPosZ; } /**