sm64

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

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 }