sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

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 }