sm64pc/src/game/behaviors/breakable_box_small.inc.c

139 lines
3.5 KiB
C

// breakable_box.c.inc
struct ObjectHitbox sBreakableBoxSmallHitbox = {
/* interactType: */ INTERACT_GRABBABLE,
/* downOffset: */ 20,
/* damageOrCoinValue: */ 0,
/* health: */ 1,
/* numLootCoins: */ 0,
/* radius: */ 150,
/* height: */ 250,
/* hurtboxRadius: */ 150,
/* hurtboxHeight: */ 250,
};
void bhv_breakable_box_small_init(void) {
o->oGravity = 2.5f;
o->oFriction = 0.99f;
o->oBuoyancy = 1.4f;
obj_scale(0.4f);
set_object_hitbox(o, &sBreakableBoxSmallHitbox);
o->oAnimState = 1;
o->activeFlags |= 0x200;
}
void func_802F4CE8(void) {
struct Object *sp24 = spawn_object(o, MODEL_SMOKE, bhvSmoke);
sp24->oPosX += (s32)(RandomFloat() * 80.0f) - 40;
sp24->oPosZ += (s32)(RandomFloat() * 80.0f) - 40;
}
void func_802F4DB4(void) {
s16 sp1E = ObjectStep();
attack_collided_non_mario_object(o);
if (sp1E == 1)
PlaySound2(SOUND_GENERAL_BOX_LANDING_2);
if (sp1E & 1) {
if (o->oForwardVel > 20.0f) {
PlaySound2(SOUND_ENV_SLIDING);
func_802F4CE8();
}
}
if (sp1E & 2) {
func_802A3004();
spawn_triangle_break_particles(20, 138, 0.7f, 3);
ObjSpawnYellowCoins(o, 3);
create_sound_spawner(SOUND_GENERAL_BREAK_BOX);
o->activeFlags = 0;
}
ObjCheckFloorDeath(sp1E, D_803600E0);
}
void breakable_box_small_released_loop(void) {
o->oBreakableBoxSmallFramesSinceReleased++;
// Begin flashing
if (o->oBreakableBoxSmallFramesSinceReleased > 810) {
if (o->oBreakableBoxSmallFramesSinceReleased & 1)
o->header.gfx.node.flags |= 0x10;
else
o->header.gfx.node.flags &= ~0x10;
}
// Despawn, and create a corkbox respawner
if (o->oBreakableBoxSmallFramesSinceReleased > 900) {
create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000);
o->activeFlags = 0;
}
}
void breakable_box_small_idle_loop(void) {
switch (o->oAction) {
case 0:
func_802F4DB4();
break;
case 100:
ObjLavaDeath();
break;
case 101:
o->activeFlags = 0;
create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000);
break;
}
if (o->oBreakableBoxSmallReleased == 1)
breakable_box_small_released_loop();
}
void breakable_box_small_get_dropped(void) {
obj_become_tangible();
obj_enable_rendering();
obj_get_dropped();
o->header.gfx.node.flags &= ~0x10;
o->oHeldState = 0;
o->oBreakableBoxSmallReleased = 1;
o->oBreakableBoxSmallFramesSinceReleased = 0;
}
void breakable_box_small_get_thrown(void) {
obj_become_tangible();
obj_enable_rendering_2();
obj_enable_rendering();
o->header.gfx.node.flags &= ~0x10;
o->oHeldState = 0;
o->oFlags &= ~0x08;
o->oForwardVel = 40.0f;
o->oVelY = 20.0f;
o->oBreakableBoxSmallReleased = 1;
o->oBreakableBoxSmallFramesSinceReleased = 0;
o->activeFlags &= ~0x200;
}
void bhv_breakable_box_small_loop(void) {
switch (o->oHeldState) {
case 0:
breakable_box_small_idle_loop();
break;
case 1:
obj_disable_rendering();
obj_become_intangible();
break;
case 2:
breakable_box_small_get_thrown();
break;
case 3:
breakable_box_small_get_dropped();
break;
}
o->oInteractStatus = 0;
}