breakable_box_small.inc.c (4075B)
1 // breakable_box.inc.c 2 3 struct ObjectHitbox sBreakableBoxSmallHitbox = { 4 /* interactType: */ INTERACT_GRABBABLE, 5 /* downOffset: */ 20, 6 /* damageOrCoinValue: */ 0, 7 /* health: */ 1, 8 /* numLootCoins: */ 0, 9 /* radius: */ 150, 10 /* height: */ 250, 11 /* hurtboxRadius: */ 150, 12 /* hurtboxHeight: */ 250, 13 }; 14 15 void bhv_breakable_box_small_init(void) { 16 o->oGravity = 2.5f; 17 o->oFriction = 0.99f; 18 o->oBuoyancy = 1.4f; 19 cur_obj_scale(0.4f); 20 obj_set_hitbox(o, &sBreakableBoxSmallHitbox); 21 o->oAnimState = 1; 22 o->activeFlags |= ACTIVE_FLAG_UNK9; 23 } 24 25 void small_breakable_box_spawn_dust(void) { 26 struct Object *sp24 = spawn_object(o, MODEL_SMOKE, bhvSmoke); 27 sp24->oPosX += (s32)(random_float() * 80.0f) - 40; 28 sp24->oPosZ += (s32)(random_float() * 80.0f) - 40; 29 } 30 31 void small_breakable_box_act_move(void) { 32 s16 collisionFlags = object_step(); 33 34 obj_attack_collided_from_other_object(o); 35 36 if (collisionFlags == OBJ_COL_FLAG_GROUNDED) { 37 cur_obj_play_sound_2(SOUND_GENERAL_BOX_LANDING_2); 38 } 39 40 if (collisionFlags & OBJ_COL_FLAG_GROUNDED) { 41 if (o->oForwardVel > 20.0f) { 42 cur_obj_play_sound_2(SOUND_ENV_SLIDING); 43 small_breakable_box_spawn_dust(); 44 } 45 } 46 47 if (collisionFlags & OBJ_COL_FLAG_HIT_WALL) { 48 spawn_mist_particles(); 49 spawn_triangle_break_particles(20, MODEL_DIRT_ANIMATION, 0.7f, 3); 50 obj_spawn_yellow_coins(o, 3); 51 create_sound_spawner(SOUND_GENERAL_BREAK_BOX); 52 o->activeFlags = ACTIVE_FLAG_DEACTIVATED; 53 } 54 55 obj_check_floor_death(collisionFlags, sObjFloor); 56 } 57 58 void breakable_box_small_released_loop(void) { 59 o->oBreakableBoxSmallFramesSinceReleased++; 60 61 // Begin flashing 62 if (o->oBreakableBoxSmallFramesSinceReleased > 810) { 63 if (o->oBreakableBoxSmallFramesSinceReleased & 1) { 64 o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; 65 } else { 66 o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; 67 } 68 } 69 70 // Despawn, and create a corkbox respawner 71 if (o->oBreakableBoxSmallFramesSinceReleased > 900) { 72 create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000); 73 o->activeFlags = ACTIVE_FLAG_DEACTIVATED; 74 } 75 } 76 77 void breakable_box_small_idle_loop(void) { 78 switch (o->oAction) { 79 case 0: 80 small_breakable_box_act_move(); 81 break; 82 83 case 100: 84 obj_lava_death(); 85 break; 86 87 case 101: 88 o->activeFlags = ACTIVE_FLAG_DEACTIVATED; 89 create_respawner(MODEL_BREAKABLE_BOX_SMALL, bhvBreakableBoxSmall, 3000); 90 break; 91 } 92 93 if (o->oBreakableBoxSmallReleased == TRUE) { 94 breakable_box_small_released_loop(); 95 } 96 } 97 98 void breakable_box_small_get_dropped(void) { 99 cur_obj_become_tangible(); 100 cur_obj_enable_rendering(); 101 cur_obj_get_dropped(); 102 o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; 103 o->oHeldState = 0; 104 o->oBreakableBoxSmallReleased = TRUE; 105 o->oBreakableBoxSmallFramesSinceReleased = 0; 106 } 107 108 void breakable_box_small_get_thrown(void) { 109 cur_obj_become_tangible(); 110 cur_obj_enable_rendering_2(); 111 cur_obj_enable_rendering(); 112 o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; 113 o->oHeldState = 0; 114 o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW; 115 o->oForwardVel = 40.0f; 116 o->oVelY = 20.0f; 117 o->oBreakableBoxSmallReleased = TRUE; 118 o->oBreakableBoxSmallFramesSinceReleased = 0; 119 o->activeFlags &= ~ACTIVE_FLAG_UNK9; 120 } 121 122 void bhv_breakable_box_small_loop(void) { 123 switch (o->oHeldState) { 124 case 0: 125 breakable_box_small_idle_loop(); 126 break; 127 128 case 1: 129 cur_obj_disable_rendering(); 130 cur_obj_become_intangible(); 131 break; 132 133 case 2: 134 breakable_box_small_get_thrown(); 135 break; 136 137 case 3: 138 breakable_box_small_get_dropped(); 139 break; 140 } 141 142 o->oInteractStatus = 0; 143 }