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 }