scuttlebug.inc.c (5045B)
1 // scuttlebug.inc.c 2 3 struct ObjectHitbox sScuttlebugHitbox = { 4 /* interactType: */ INTERACT_BOUNCE_TOP, 5 /* downOffset: */ 0, 6 /* damageOrCoinValue: */ 1, 7 /* health: */ 1, 8 /* numLootCoins: */ 3, 9 /* radius: */ 130, 10 /* height: */ 70, 11 /* hurtboxRadius: */ 90, 12 /* hurtboxHeight: */ 60, 13 }; 14 15 s32 update_angle_from_move_flags(s32 *angle) { 16 if (o->oMoveFlags & OBJ_MOVE_HIT_WALL) { 17 *angle = o->oWallAngle; 18 return 1; 19 } else if (o->oMoveFlags & OBJ_MOVE_HIT_EDGE) { 20 *angle = o->oMoveAngleYaw + 0x8000; 21 return -1; 22 } 23 return 0; 24 } 25 26 void bhv_scuttlebug_loop(void) { 27 UNUSED u8 filler[4]; 28 f32 sp18; 29 30 cur_obj_update_floor_and_walls(); 31 32 if (o->oSubAction != 0 33 && cur_obj_set_hitbox_and_die_if_attacked(&sScuttlebugHitbox, SOUND_OBJ_DYING_ENEMY1, 34 o->oScuttlebugUnkF4)) { 35 o->oSubAction = 3; 36 } 37 38 if (o->oSubAction != 1) { 39 o->oScuttlebugUnkF8 = 0; 40 } 41 42 switch (o->oSubAction) { 43 case 0: 44 if (o->oMoveFlags & OBJ_MOVE_LANDED) { 45 cur_obj_play_sound_2(SOUND_OBJ_GOOMBA_ALERT); 46 } 47 if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) { 48 o->oHomeX = o->oPosX; 49 o->oHomeY = o->oPosY; 50 o->oHomeZ = o->oPosZ; 51 o->oSubAction++; 52 } 53 break; 54 55 case 1: 56 o->oForwardVel = 5.0f; 57 if (cur_obj_lateral_dist_from_mario_to_home() > 1000.0f) { 58 o->oAngleToMario = cur_obj_angle_to_home(); 59 } else { 60 if (o->oScuttlebugUnkF8 == 0) { 61 o->oScuttlebugUnkFC = 0; 62 o->oAngleToMario = obj_angle_to_object(o, gMarioObject); 63 if (abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw) < 0x800) { 64 o->oScuttlebugUnkF8 = 1; 65 o->oVelY = 20.0f; 66 cur_obj_play_sound_2(SOUND_OBJ2_SCUTTLEBUG_ALERT); 67 } 68 } else if (o->oScuttlebugUnkF8 == 1) { 69 o->oForwardVel = 15.0f; 70 o->oScuttlebugUnkFC++; 71 if (o->oScuttlebugUnkFC > 50) { 72 o->oScuttlebugUnkF8 = 0; 73 } 74 } 75 } 76 if (update_angle_from_move_flags(&o->oAngleToMario)) { 77 o->oSubAction = 2; 78 } 79 cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x200); 80 break; 81 82 case 2: 83 o->oForwardVel = 5.0f; 84 if ((s16) o->oMoveAngleYaw == (s16) o->oAngleToMario) { 85 o->oSubAction = 1; 86 } 87 if (o->oPosY - o->oHomeY < -200.0f) { 88 obj_mark_for_deletion(o); 89 } 90 cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400); 91 break; 92 93 case 3: 94 o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW; 95 o->oForwardVel = -10.0f; 96 o->oVelY = 30.0f; 97 cur_obj_play_sound_2(SOUND_OBJ2_SCUTTLEBUG_ALERT); 98 o->oSubAction++; 99 break; 100 101 case 4: 102 o->oForwardVel = -10.0f; 103 if (o->oMoveFlags & OBJ_MOVE_LANDED) { 104 o->oSubAction++; 105 o->oVelY = 0.0f; 106 o->oScuttlebugUnkFC = 0; 107 o->oFlags |= OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW; 108 o->oInteractStatus = 0; 109 } 110 break; 111 112 case 5: 113 o->oForwardVel = 2.0f; 114 o->oScuttlebugUnkFC++; 115 if (o->oScuttlebugUnkFC > 30) { 116 o->oSubAction = 0; 117 } 118 break; 119 } 120 121 if (o->oForwardVel < 10.0f) { 122 sp18 = 1.0f; 123 } else { 124 sp18 = 3.0f; 125 } 126 127 cur_obj_init_animation_with_accel_and_sound(0, sp18); 128 129 if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) { 130 set_obj_anim_with_accel_and_sound(1, 23, SOUND_OBJ2_SCUTTLEBUG_WALK); 131 } 132 133 if (o->parentObj != o) { 134 if (obj_is_hidden(o)) { 135 obj_mark_for_deletion(o); 136 } 137 if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED) { 138 o->parentObj->oScuttlebugSpawnerUnk88 = 1; 139 } 140 } 141 142 cur_obj_move_standard(-50); 143 } 144 145 void bhv_scuttlebug_spawn_loop(void) { 146 if (o->oAction == 0) { 147 if (o->oTimer > 30 && 500.0f < o->oDistanceToMario && o->oDistanceToMario < 1500.0f) { 148 struct Object *scuttlebug; 149 cur_obj_play_sound_2(SOUND_OBJ2_SCUTTLEBUG_ALERT); 150 scuttlebug = spawn_object(o, MODEL_SCUTTLEBUG, bhvScuttlebug); 151 scuttlebug->oScuttlebugUnkF4 = o->oScuttlebugSpawnerUnkF4; 152 scuttlebug->oForwardVel = 30.0f; 153 scuttlebug->oVelY = 80.0f; 154 o->oAction++; 155 o->oScuttlebugUnkF4 = 1; 156 } 157 } else if (o->oScuttlebugSpawnerUnk88 != 0) { 158 o->oScuttlebugSpawnerUnk88 = 0; 159 o->oAction = 0; 160 } 161 }