sm64

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

bub.inc.c (3998B)


      1 // bub.inc.c
      2 
      3 // NOTE: These first set of functions spawn a school of bub depending on objF4's
      4 // value. The later action functions seem to check Y distance to Mario and proceed
      5 // to do nothing, which indicates this behavior set is incomplete.
      6 
      7 void bub_spawner_act_0(void) {
      8     s32 i;
      9     s32 sp18 = o->oBirdChirpChirpUnkF4;
     10     if (o->oDistanceToMario < 1500.0f) {
     11         for (i = 0; i < sp18; i++) {
     12             spawn_object(o, MODEL_BUB, bhvBub);
     13         }
     14         o->oAction = 1;
     15     }
     16 }
     17 
     18 void bub_spawner_act_1(void) {
     19     if (gMarioObject->oPosY - o->oPosY > 2000.0f) {
     20         o->oAction = 2;
     21     }
     22 }
     23 
     24 void bub_spawner_act_2(void) {
     25     o->oAction = 3;
     26 }
     27 
     28 void bub_spawner_act_3(void) {
     29     o->oAction = 0;
     30 }
     31 
     32 void (*sBirdChirpChirpActions[])(void) = {
     33     bub_spawner_act_0,
     34     bub_spawner_act_1,
     35     bub_spawner_act_2,
     36     bub_spawner_act_3,
     37 };
     38 
     39 void bhv_bub_spawner_loop(void) {
     40     cur_obj_call_action_function(sBirdChirpChirpActions);
     41 }
     42 
     43 void bub_move_vertically(s32 a0) {
     44     f32 sp1C = o->parentObj->oPosY;
     45     if (sp1C - 100.0f - o->oCheepCheepUnk104 < o->oPosY
     46         && o->oPosY < sp1C + 1000.0f + o->oCheepCheepUnk104) {
     47         o->oPosY = approach_f32_symmetric(o->oPosY, o->oCheepCheepUnkF8, a0);
     48     } else {
     49     }
     50 }
     51 
     52 void bub_act_0(void) {
     53     o->oCheepCheepUnkFC = random_float() * 100.0f;
     54     o->oCheepCheepUnk104 = random_float() * 300.0f;
     55     o->oAction = 1;
     56 }
     57 
     58 void bub_act_1(void) {
     59     f32 dy;
     60 
     61     if (o->oTimer == 0) {
     62         o->oForwardVel = random_float() * 2 + 2;
     63         o->oCheepCheepUnk108 = random_float();
     64     }
     65 
     66     dy = o->oPosY - gMarioObject->oPosY;
     67 
     68     if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) {
     69         if (dy < 0.0f) {
     70             dy = 0.0f - dy;
     71         }
     72 
     73         if (dy < 500.0f) {
     74             bub_move_vertically(1);
     75         } else {
     76             bub_move_vertically(4);
     77         }
     78     } else {
     79         o->oPosY = o->oCheepCheepUnkF4 - 50.0f;
     80 
     81         if (dy > 300.0f) {
     82             o->oPosY = o->oPosY - 1.0f;
     83         }
     84     }
     85 
     86     if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) {
     87         o->oAngleToMario = cur_obj_angle_to_home();
     88     }
     89 
     90     cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100);
     91 
     92     if (o->oDistanceToMario < 200.0f) {
     93         if (o->oCheepCheepUnk108 < 0.5) {
     94             o->oAction = 2;
     95         }
     96     }
     97 
     98     if (o->oInteractStatus & INT_STATUS_INTERACTED) {
     99         o->oAction = 2;
    100     }
    101 }
    102 
    103 void bub_act_2(void) {
    104     f32 dy;
    105 
    106     if (o->oTimer < 20) {
    107         if (o->oInteractStatus & INT_STATUS_INTERACTED) {
    108             spawn_object(o, MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleSnow);
    109         }
    110     } else {
    111         o->oInteractStatus = 0;
    112     }
    113 
    114     if (o->oTimer == 0) {
    115         cur_obj_play_sound_2(SOUND_GENERAL_MOVING_WATER);
    116     }
    117 
    118     if (o->oForwardVel == 0.0f) {
    119         o->oForwardVel = 6.0f;
    120     }
    121 
    122     dy = o->oPosY - gMarioObject->oPosY;
    123 
    124     if (o->oPosY < o->oCheepCheepUnkF4 - 50.0f) {
    125         if (dy < 0.0f) {
    126             dy = 0.0f - dy;
    127         }
    128 
    129         if (dy < 500.0f) {
    130             bub_move_vertically(2);
    131         } else {
    132             bub_move_vertically(4);
    133         }
    134     } else {
    135         o->oPosY = o->oCheepCheepUnkF4 - 50.0f;
    136 
    137         if (dy > 300.0f) {
    138             o->oPosY -= 1.0f;
    139         }
    140     }
    141 
    142     if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f) {
    143         o->oAngleToMario = cur_obj_angle_to_home();
    144     }
    145 
    146     cur_obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, 0x400);
    147 
    148     if (o->oTimer > 200 && o->oDistanceToMario > 600.0f) {
    149         o->oAction = 1;
    150     }
    151 }
    152 
    153 void (*sCheepCheepActions[])(void) = {
    154     bub_act_0,
    155     bub_act_1,
    156     bub_act_2,
    157 };
    158 
    159 void bhv_bub_loop(void) {
    160     o->oCheepCheepUnkF4 = find_water_level(o->oPosX, o->oPosZ);
    161     o->oCheepCheepUnkF8 = gMarioObject->oPosY + o->oCheepCheepUnkFC;
    162     o->oWallHitboxRadius = 30.0f;
    163 
    164     cur_obj_update_floor_and_walls();
    165     cur_obj_call_action_function(sCheepCheepActions);
    166     cur_obj_move_using_fvel_and_gravity();
    167 
    168     if (o->parentObj->oAction == 2) {
    169         obj_mark_for_deletion(o);
    170     }
    171 }