sm64

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

bubba.inc.c (5456B)


      1 // bubba.inc.c
      2 
      3 static struct ObjectHitbox sBubbaHitbox = {
      4     /* interactType:      */ INTERACT_CLAM_OR_BUBBA,
      5     /* downOffset:        */ 0,
      6     /* damageOrCoinValue: */ 1,
      7     /* health:            */ 99,
      8     /* numLootCoins:      */ 0,
      9     /* radius:            */ 300,
     10     /* height:            */ 200,
     11     /* hurtboxRadius:     */ 300,
     12     /* hurtboxHeight:     */ 200,
     13 };
     14 
     15 void bubba_act_0(void) {
     16     f32 sp24 = cur_obj_lateral_dist_to_home();
     17 
     18     treat_far_home_as_mario(2000.0f);
     19     o->oAnimState = 0;
     20 
     21     o->oBubbaUnk1AC = obj_get_pitch_to_home(sp24);
     22 
     23     approach_f32_ptr(&o->oBubbaUnkF4, 5.0f, 0.5f);
     24 
     25     if (o->oBubbaUnkFC != 0) {
     26         if (abs_angle_diff(o->oMoveAngleYaw, o->oBubbaUnk1AE) < 800) {
     27             o->oBubbaUnkFC = 0;
     28         }
     29     } else {
     30         if (o->oDistanceToMario >= 25000.0f) {
     31             o->oBubbaUnk1AE = o->oAngleToMario;
     32             o->oBubbaUnkF8 = random_linear_offset(20, 30);
     33         }
     34 
     35         if ((o->oBubbaUnkFC = o->oMoveFlags & OBJ_MOVE_HIT_WALL)) {
     36             o->oBubbaUnk1AE = cur_obj_reflect_move_angle_off_wall();
     37         } else if (o->oTimer > 30 && o->oDistanceToMario < 2000.0f) {
     38             o->oAction = 1;
     39         } else if (o->oBubbaUnkF8 != 0) {
     40             o->oBubbaUnkF8--;
     41         } else {
     42             o->oBubbaUnk1AE = obj_random_fixed_turn(0x2000);
     43             o->oBubbaUnkF8 = random_linear_offset(100, 100);
     44         }
     45     }
     46 }
     47 
     48 void bubba_act_1(void) {
     49     treat_far_home_as_mario(2500.0f);
     50 
     51     if (o->oDistanceToMario > 2500.0f) {
     52         o->oAction = 0;
     53     } else if (o->oBubbaUnk100 != 0) {
     54         if (--o->oBubbaUnk100 == 0) {
     55             cur_obj_play_sound_2(SOUND_OBJ_BUBBA_CHOMP);
     56             o->oAction = 0;
     57         } else if (o->oBubbaUnk100 < 15) {
     58             o->oAnimState = 1;
     59         } else if (o->oBubbaUnk100 == 20) {
     60             s16 val06 = 10000 - (s16)(20.0f * (find_water_level(o->oPosX, o->oPosZ) - o->oPosY));
     61             o->oBubbaUnk1AC -= val06;
     62             o->oMoveAnglePitch = o->oBubbaUnk1AC;
     63             o->oBubbaUnkF4 = 40.0f;
     64             obj_compute_vel_from_move_pitch(o->oBubbaUnkF4);
     65             o->oAnimState = 0;
     66         } else {
     67             o->oBubbaUnk1AE = o->oAngleToMario;
     68             o->oBubbaUnk1AC = o->oBubbaUnk104;
     69 
     70             cur_obj_rotate_yaw_toward(o->oBubbaUnk1AE, 400);
     71             obj_move_pitch_approach(o->oBubbaUnk1AC, 400);
     72         }
     73     } else {
     74         if (abs_angle_diff(gMarioObject->oFaceAngleYaw, o->oAngleToMario) < 0x3000) {
     75             s16 val04 = 0x4000 - atan2s(800.0f, o->oDistanceToMario - 800.0f);
     76             if ((s16)(o->oMoveAngleYaw - o->oAngleToMario) < 0) {
     77                 val04 = -val04;
     78             }
     79 
     80             o->oBubbaUnk1AE = o->oAngleToMario + val04;
     81         } else {
     82             o->oBubbaUnk1AE = o->oAngleToMario;
     83         }
     84 
     85         o->oBubbaUnk1AC = o->oBubbaUnk104;
     86 
     87         if (obj_is_near_to_and_facing_mario(500.0f, 3000)
     88             && abs_angle_diff(o->oBubbaUnk1AC, o->oMoveAnglePitch) < 3000) {
     89             o->oBubbaUnk100 = 30;
     90             o->oBubbaUnkF4 = 0;
     91             o->oAnimState = 1;
     92         } else {
     93             approach_f32_ptr(&o->oBubbaUnkF4, 20.0f, 0.5f);
     94         }
     95     }
     96 }
     97 
     98 void bhv_bubba_loop(void) {
     99     UNUSED u8 filler[4];
    100 
    101     o->oInteractionSubtype &= ~INT_SUBTYPE_EATS_MARIO;
    102     o->oBubbaUnk104 = obj_turn_pitch_toward_mario(120.0f, 0);
    103 
    104     if (abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw) < 0x1000
    105         && abs_angle_diff(o->oBubbaUnk104 + 0x800, o->oMoveAnglePitch) < 0x2000) {
    106         if (o->oAnimState != 0 && o->oDistanceToMario < 250.0f) {
    107             o->oInteractionSubtype |= INT_SUBTYPE_EATS_MARIO;
    108         }
    109 
    110         o->hurtboxRadius = 100.0f;
    111     } else {
    112         o->hurtboxRadius = 150.0f;
    113     }
    114 
    115     cur_obj_update_floor_and_walls();
    116 
    117     switch (o->oAction) {
    118         case 0:
    119             bubba_act_0();
    120             break;
    121         case 1:
    122             bubba_act_1();
    123             break;
    124     }
    125 
    126     if (o->oMoveFlags & OBJ_MOVE_MASK_IN_WATER) {
    127         if (o->oMoveFlags & OBJ_MOVE_ENTERED_WATER) {
    128             struct Object *sp38 = spawn_object(o, MODEL_WATER_SPLASH, bhvWaterSplash);
    129             if (sp38 != NULL) {
    130                 obj_scale(sp38, 3.0f);
    131             }
    132 
    133             o->oBubbaUnk108 = o->oVelY;
    134             o->oBubbaUnk10C = 0.0f;
    135         } else {
    136             approach_f32_ptr(&o->oBubbaUnk108, 0.0f, 4.0f);
    137             if ((o->oBubbaUnk10C -= o->oBubbaUnk108) > 1.0f) {
    138                 s16 sp36 = random_u16();
    139                 o->oBubbaUnk10C -= 1.0f;
    140                 spawn_object_relative(0, 150.0f * coss(sp36), 0x64, 150.0f * sins(sp36), o,
    141                                       MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleSnow);
    142             }
    143         }
    144 
    145         obj_smooth_turn(&o->oBubbaUnk1B0, &o->oMoveAnglePitch, o->oBubbaUnk1AC, 0.05f, 10, 50, 2000);
    146         obj_smooth_turn(&o->oBubbaUnk1B2, &o->oMoveAngleYaw, o->oBubbaUnk1AE, 0.05f, 10, 50, 2000);
    147         obj_compute_vel_from_move_pitch(o->oBubbaUnkF4);
    148     } else {
    149         o->oBubbaUnkF4 = sqrtf(o->oForwardVel * o->oForwardVel + o->oVelY * o->oVelY);
    150         o->oMoveAnglePitch = obj_get_pitch_from_vel();
    151         obj_face_pitch_approach(o->oMoveAnglePitch, 400);
    152         o->oBubbaUnk1B0 = 0;
    153     }
    154 
    155     obj_face_pitch_approach(o->oMoveAnglePitch, 400);
    156     obj_check_attacks(&sBubbaHitbox, o->oAction);
    157 
    158     cur_obj_move_standard(78);
    159 
    160     o->oFloorHeight += 150.0f;
    161     if (o->oPosY < o->oFloorHeight) {
    162         o->oPosY = o->oFloorHeight;
    163     }
    164 }