268 lines
6.2 KiB
C
268 lines
6.2 KiB
C
// coin.c.inc
|
|
|
|
// sp18 = collisionFlagsPtr
|
|
|
|
static struct ObjectHitbox sMovingYellowCoinHitbox = {
|
|
/* interactType: */ INTERACT_COIN,
|
|
/* downOffset: */ 0,
|
|
/* damageOrCoinValue: */ 1,
|
|
/* health: */ 0,
|
|
/* numLootCoins: */ 0,
|
|
/* radius: */ 100,
|
|
/* height: */ 64,
|
|
/* hurtboxRadius: */ 0,
|
|
/* hurtboxHeight: */ 0,
|
|
};
|
|
|
|
static struct ObjectHitbox sMovingBlueCoinHitbox = {
|
|
/* interactType: */ INTERACT_COIN,
|
|
/* downOffset: */ 0,
|
|
/* damageOrCoinValue: */ 5,
|
|
/* health: */ 0,
|
|
/* numLootCoins: */ 0,
|
|
/* radius: */ 100,
|
|
/* height: */ 64,
|
|
/* hurtboxRadius: */ 0,
|
|
/* hurtboxHeight: */ 0,
|
|
};
|
|
|
|
s32 coin_step(s16 *collisionFlagsPtr) {
|
|
*collisionFlagsPtr = object_step();
|
|
|
|
obj_check_floor_death(*collisionFlagsPtr, sObjFloor);
|
|
|
|
if ((*collisionFlagsPtr & 0x1) != 0 && (*collisionFlagsPtr & 0x8) == 0) /* bit 0, bit 3 */
|
|
{
|
|
cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void moving_coin_flicker(void) {
|
|
s16 collisionFlags;
|
|
|
|
coin_step(&collisionFlags);
|
|
obj_flicker_and_disappear(o, 0);
|
|
}
|
|
|
|
void coin_collected(void) {
|
|
spawn_object(o, MODEL_SPARKLES, bhvGoldenCoinSparkles);
|
|
o->activeFlags = 0;
|
|
}
|
|
|
|
void bhv_moving_yellow_coin_init(void) {
|
|
o->oGravity = 3.0f;
|
|
o->oFriction = 1.0f;
|
|
o->oBuoyancy = 1.5f;
|
|
|
|
obj_set_hitbox(o, &sMovingYellowCoinHitbox);
|
|
}
|
|
|
|
void bhv_moving_yellow_coin_loop(void) {
|
|
s16 collisionFlags;
|
|
switch (o->oAction) {
|
|
case MOV_YCOIN_ACT_IDLE:
|
|
coin_step(&collisionFlags);
|
|
|
|
if (o->oTimer < 10)
|
|
cur_obj_become_intangible();
|
|
else
|
|
cur_obj_become_tangible();
|
|
|
|
if (o->oTimer >= 301)
|
|
o->oAction = 1;
|
|
break;
|
|
|
|
case MOV_YCOIN_ACT_BLINKING:
|
|
moving_coin_flicker();
|
|
break;
|
|
|
|
case MOV_YCOIN_ACT_LAVA_DEATH:
|
|
o->activeFlags = 0;
|
|
break;
|
|
|
|
case MOV_YCOIN_ACT_DEATH_PLANE_DEATH:
|
|
o->activeFlags = 0;
|
|
break;
|
|
}
|
|
|
|
if ((o->oInteractStatus & INT_STATUS_INTERACTED) != 0) /* bit 15 */
|
|
{
|
|
coin_collected();
|
|
o->oInteractStatus = 0;
|
|
}
|
|
}
|
|
|
|
void bhv_moving_blue_coin_init(void) {
|
|
o->oGravity = 5.0f;
|
|
o->oFriction = 1.0f;
|
|
o->oBuoyancy = 1.5f;
|
|
|
|
obj_set_hitbox(o, &sMovingBlueCoinHitbox);
|
|
}
|
|
|
|
void bhv_moving_blue_coin_loop(void) {
|
|
#ifdef VERSION_EU
|
|
s32 collisionFlags;
|
|
#else
|
|
s16 collisionFlags;
|
|
#endif
|
|
|
|
switch (o->oAction) {
|
|
case MOV_BCOIN_ACT_STILL:
|
|
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1500))
|
|
o->oAction = 1;
|
|
break;
|
|
|
|
case MOV_BCOIN_ACT_MOVING:
|
|
collisionFlags = object_step();
|
|
if ((collisionFlags & OBJ_COL_FLAG_GROUNDED)) /* bit 0 */
|
|
{
|
|
o->oForwardVel += 25.0f;
|
|
if (!(collisionFlags & OBJ_COL_FLAG_NO_Y_VEL))
|
|
cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP); /* bit 3 */
|
|
} else
|
|
o->oForwardVel *= 0.98;
|
|
|
|
if (o->oForwardVel > 75.0)
|
|
o->oForwardVel = 75.0f;
|
|
|
|
obj_flicker_and_disappear(o, 600);
|
|
break;
|
|
}
|
|
|
|
if ((o->oInteractStatus & INT_STATUS_INTERACTED) != 0) /* bit 15 */
|
|
{
|
|
coin_collected();
|
|
o->oInteractStatus = 0;
|
|
}
|
|
}
|
|
|
|
void bhv_blue_coin_sliding_jumping_init(void) {
|
|
o->oGravity = 3.0;
|
|
o->oFriction = 0.98;
|
|
o->oBuoyancy = 1.5;
|
|
|
|
obj_set_hitbox(o, &sMovingBlueCoinHitbox);
|
|
}
|
|
|
|
void blue_coin_sliding_away_from_mario(void) {
|
|
s16 collisionFlags;
|
|
|
|
o->oForwardVel = 15.0;
|
|
o->oMoveAngleYaw = o->oAngleToMario + 0x8000;
|
|
|
|
if (coin_step(&collisionFlags) != 0)
|
|
o->oVelY += 18.0f;
|
|
if ((collisionFlags & 0x2) != 0)
|
|
o->oAction = 3; /* bit 1 */
|
|
|
|
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1000) == 0)
|
|
o->oAction = 2;
|
|
}
|
|
|
|
void blue_coin_sliding_slow_down(void) {
|
|
s16 collisionFlags;
|
|
|
|
coin_step(&collisionFlags);
|
|
|
|
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 500) == 1)
|
|
o->oAction = 1;
|
|
|
|
if (o->oTimer >= 151)
|
|
o->oAction = 3;
|
|
}
|
|
|
|
void bhv_blue_coin_sliding_loop(void) {
|
|
s16 collisionFlags;
|
|
|
|
switch (o->oAction) {
|
|
case 0:
|
|
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 500) == 1)
|
|
o->oAction = 1;
|
|
|
|
set_object_visibility(o, 3000);
|
|
break;
|
|
|
|
case 1:
|
|
blue_coin_sliding_away_from_mario();
|
|
break;
|
|
|
|
case 2:
|
|
blue_coin_sliding_slow_down();
|
|
set_object_visibility(o, 3000);
|
|
break;
|
|
|
|
case 3:
|
|
coin_step(&collisionFlags);
|
|
if (o->oTimer >= 61)
|
|
o->oAction = 4;
|
|
break;
|
|
|
|
case 4:
|
|
moving_coin_flicker();
|
|
break;
|
|
|
|
case 100:
|
|
o->activeFlags = 0;
|
|
break;
|
|
|
|
case 101:
|
|
o->activeFlags = 0;
|
|
break;
|
|
}
|
|
|
|
if ((o->oInteractStatus & INT_STATUS_INTERACTED) != 0) /* bit 15 */
|
|
{
|
|
coin_collected();
|
|
o->oInteractStatus = 0;
|
|
}
|
|
}
|
|
|
|
void bhv_blue_coin_jumping_loop(void) {
|
|
s16 collisionFlags;
|
|
|
|
switch (o->oAction) {
|
|
case 0:
|
|
if (o->oTimer == 0) {
|
|
cur_obj_become_intangible();
|
|
o->oVelY = 50.0;
|
|
}
|
|
|
|
object_step();
|
|
|
|
if (o->oTimer == 15) {
|
|
cur_obj_become_tangible();
|
|
o->oAction = 1;
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
blue_coin_sliding_away_from_mario();
|
|
break;
|
|
|
|
case 2:
|
|
blue_coin_sliding_slow_down();
|
|
set_object_visibility(o, 3000);
|
|
break;
|
|
|
|
case 3:
|
|
coin_step(&collisionFlags);
|
|
if (o->oTimer >= 61)
|
|
o->oAction = 4;
|
|
break;
|
|
|
|
case 4:
|
|
moving_coin_flicker();
|
|
break;
|
|
}
|
|
|
|
if ((o->oInteractStatus & INT_STATUS_INTERACTED) != 0) /* bit 15 */
|
|
{
|
|
coin_collected();
|
|
o->oInteractStatus = 0;
|
|
}
|
|
}
|