sm64pc/src/game/behaviors/red_coin.inc.c
2020-03-01 22:42:52 -05:00

82 lines
2.7 KiB
C

/**
* This file contains the initialization and behavior for red coins.
* Behavior controls audio and the orange number spawned, as well as interacting with
* the course's red coin star.
*/
/**
* Red coin's hitbox details.
*/
static struct ObjectHitbox sRedCoinHitbox = {
/* interactType: */ INTERACT_COIN,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 2,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 100,
/* height: */ 64,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
};
/**
* Red coin initialization function. Sets the coin's hitbox and parent object.
*/
void bhv_red_coin_init(void) {
// This floor and floor height are unused. Perhaps for orange number spawns originally?
struct Surface *dummyFloor;
UNUSED f32 floorHeight = find_floor(o->oPosX, o->oPosY, o->oPosZ, &dummyFloor);
struct Object *hiddenRedCoinStar;
// Set the red coins to have a parent of the closest red coin star.
hiddenRedCoinStar = cur_obj_nearest_object_with_behavior(bhvHiddenRedCoinStar);
if (hiddenRedCoinStar != NULL)
o->parentObj = hiddenRedCoinStar;
else {
hiddenRedCoinStar = cur_obj_nearest_object_with_behavior(bhvBowserCourseRedCoinStar);
if (hiddenRedCoinStar != NULL) {
o->parentObj = hiddenRedCoinStar;
} else {
o->parentObj = NULL;
}
}
obj_set_hitbox(o, &sRedCoinHitbox);
}
/**
* Main behavior for red coins. Primarily controls coin collection noise and spawning
* the orange number counter.
*/
void bhv_red_coin_loop(void) {
// If Mario interacted with the object...
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
// ...and there is a red coin star in the level...
if (o->parentObj != NULL) {
// ...increment the star's counter.
o->parentObj->oHiddenStarTriggerCounter++;
// For JP version, play an identical sound for all coins.
#ifdef VERSION_JP
create_sound_spawner(SOUND_GENERAL_RED_COIN);
#endif
// 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);
}
// On all versions but the JP version, each coin collected plays a higher noise.
#ifndef VERSION_JP
play_sound(SOUND_MENU_COLLECT_RED_COIN
+ (((u8) o->parentObj->oHiddenStarTriggerCounter - 1) << 16),
gDefaultSoundArgs);
#endif
}
coin_collected();
// Despawn the coin.
o->oInteractStatus = 0;
}
}