added support for up to 99 red coins in an area

This commit is contained in:
mineqwerty
2023-06-04 21:19:51 -04:00
parent e9054a6b6b
commit 62772067d5
8 changed files with 50 additions and 9 deletions

View File

@@ -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(),

View File

@@ -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)

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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;

View File

@@ -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;
}
/**