2019-08-25 04:46:40 +00:00
|
|
|
// koopa_shell.c.inc
|
|
|
|
|
|
|
|
struct ObjectHitbox sKoopaShellHitbox = {
|
|
|
|
/* interactType: */ INTERACT_KOOPA_SHELL,
|
|
|
|
/* downOffset: */ 0,
|
|
|
|
/* damageOrCoinValue: */ 4,
|
|
|
|
/* health: */ 1,
|
|
|
|
/* numLootCoins: */ 1,
|
|
|
|
/* radius: */ 50,
|
|
|
|
/* height: */ 50,
|
|
|
|
/* hurtboxRadius: */ 50,
|
|
|
|
/* hurtboxHeight: */ 50,
|
|
|
|
};
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void koopa_shell_spawn_water_drop(void) {
|
2019-08-25 04:46:40 +00:00
|
|
|
UNUSED s32 unused;
|
|
|
|
struct Object *drop;
|
2020-03-02 03:42:52 +00:00
|
|
|
spawn_object(o, MODEL_WAVE_TRAIL, bhvObjectWaveTrail);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (gMarioStates->forwardVel > 10.0f) {
|
2020-03-02 03:42:52 +00:00
|
|
|
drop = spawn_object_with_scale(o, MODEL_WHITE_PARTICLE_SMALL, bhvWaterDroplet, 1.5f);
|
2020-04-03 18:57:26 +00:00
|
|
|
drop->oVelY = random_float() * 30.0f;
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_translate_xz_random(drop, 110.0f);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_koopa_shell_flame_loop(void) {
|
|
|
|
if (o->oTimer == 0) {
|
2020-04-03 18:57:26 +00:00
|
|
|
o->oMoveAngleYaw = random_u16();
|
|
|
|
o->oVelY = random_float() * 30.0f;
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oGravity = -4.0f;
|
2020-04-03 18:57:26 +00:00
|
|
|
o->oAnimState = random_float() * 10.0f;
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_translate_xz_random(o, 110.0f);
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oKoopaShellFlameUnkF8 = 4.0f;
|
|
|
|
}
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_update_floor_height();
|
|
|
|
cur_obj_move_using_fvel_and_gravity();
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oFloorHeight > o->oPosY || o->oTimer > 10)
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oKoopaShellFlameUnkF8 += -0.3;
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_scale(o->oKoopaShellFlameUnkF8);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_koopa_shell_flame_spawn(void) {
|
|
|
|
s32 i;
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
spawn_object(o, MODEL_RED_FLAME, bhvKoopaShellFlame);
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void koopa_shell_spawn_sparkles(f32 a) {
|
2019-08-25 04:46:40 +00:00
|
|
|
struct Object *sp1C = spawn_object(o, MODEL_NONE, bhvSparkleSpawn);
|
|
|
|
sp1C->oPosY += a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_koopa_shell_loop(void) {
|
|
|
|
struct Surface *sp34;
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_set_hitbox(o, &sKoopaShellHitbox);
|
|
|
|
cur_obj_scale(1.0f);
|
2019-08-25 04:46:40 +00:00
|
|
|
switch (o->oAction) {
|
|
|
|
case 0:
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_update_floor_and_walls();
|
|
|
|
cur_obj_if_hit_wall_bounce_away();
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oInteractStatus & INT_STATUS_INTERACTED)
|
|
|
|
o->oAction++;
|
|
|
|
o->oFaceAngleYaw += 0x1000;
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_move_standard(-20);
|
|
|
|
koopa_shell_spawn_sparkles(10.0f);
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_copy_pos(o, gMarioObject);
|
|
|
|
sp34 = cur_obj_update_floor_height_and_get_floor();
|
2019-08-25 04:46:40 +00:00
|
|
|
if (absf(find_water_level(o->oPosX, o->oPosZ) - o->oPosY) < 10.0f)
|
2020-03-02 03:42:52 +00:00
|
|
|
koopa_shell_spawn_water_drop();
|
2019-08-25 04:46:40 +00:00
|
|
|
else if (5.0f > absf(o->oPosY - o->oFloorHeight)) {
|
|
|
|
if (sp34 != NULL && sp34->type == 1)
|
|
|
|
bhv_koopa_shell_flame_spawn();
|
|
|
|
else
|
2020-03-02 03:42:52 +00:00
|
|
|
koopa_shell_spawn_sparkles(10.0f);
|
2019-08-25 04:46:40 +00:00
|
|
|
} else
|
2020-03-02 03:42:52 +00:00
|
|
|
koopa_shell_spawn_sparkles(10.0f);
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oFaceAngleYaw = gMarioObject->oMoveAngleYaw;
|
|
|
|
if (o->oInteractStatus & INT_STATUS_STOP_RIDING) {
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
|
|
|
spawn_mist_particles();
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oAction = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
o->oInteractStatus = 0;
|
|
|
|
}
|