sm64

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

flying_bookend_switch.inc.c (8893B)


      1 // flying_bookend_switch.inc.c
      2 
      3 struct Struct80331B30 {
      4     s16 unk00;
      5     s16 unk02;
      6 };
      7 
      8 struct ObjectHitbox sFlyingBookendHitbox = {
      9     /* interactType:      */ INTERACT_HIT_FROM_BELOW,
     10     /* downOffset:        */ 0,
     11     /* damageOrCoinValue: */ 2,
     12     /* health:            */ 0,
     13     /* numLootCoins:      */ -1,
     14     /* radius:            */ 60,
     15     /* height:            */ 30,
     16     /* hurtboxRadius:     */ 40,
     17     /* hurtboxHeight:     */ 30,
     18 };
     19 
     20 struct Struct80331B30 D_80331B30[] = {
     21     { 52, 150 },
     22     { 135, 3 },
     23     { -75, 78 },
     24 };
     25 
     26 struct ObjectHitbox sBookSwitchHitbox = {
     27     /* interactType:      */ INTERACT_BREAKABLE,
     28     /* downOffset:        */ 0,
     29     /* damageOrCoinValue: */ 0,
     30     /* health:            */ 99,
     31     /* numLootCoins:      */ 0,
     32     /* radius:            */ 20,
     33     /* height:            */ 30,
     34     /* hurtboxRadius:     */ 20,
     35     /* hurtboxHeight:     */ 30,
     36 };
     37 
     38 void flying_bookend_act_0(void) {
     39     if (obj_is_near_to_and_facing_mario(400.0f, 0x3000)) {
     40         cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH);
     41 
     42         o->oAction = 1;
     43 
     44         o->oBookendUnkF4 = o->oFaceAnglePitch + 0x7FFF;
     45         o->oBookendUnkF8 = o->oFaceAngleRoll - 0x7FFF;
     46 
     47         cur_obj_set_model(MODEL_BOOKEND_PART);
     48     }
     49 }
     50 
     51 void flying_bookend_act_1(void) {
     52     if (obj_forward_vel_approach(3.0f, 1.0f)) {
     53         if (cur_obj_init_anim_and_check_if_end(2)) {
     54             o->oAction = 2;
     55             o->oForwardVel = 0.0f;
     56         } else {
     57             o->oForwardVel = 3.0f;
     58 
     59             if (o->oTimer > 5) {
     60                 obj_face_pitch_approach(o->oBookendUnkF4, 2000);
     61                 if (o->oTimer >= 10) {
     62                     obj_face_roll_approach(o->oBookendUnkF8, 2000);
     63                     if (o->oTimer >= 20) {
     64                         approach_f32_ptr(&o->header.gfx.scale[0], 3.0f, 0.2f);
     65                     }
     66                 }
     67             }
     68         }
     69     }
     70 
     71     cur_obj_move_using_fvel_and_gravity();
     72 }
     73 
     74 void flying_bookend_act_2(void) {
     75     cur_obj_init_animation_with_sound(1);
     76     cur_obj_update_floor_and_walls();
     77 
     78     if (o->oForwardVel == 0.0f) {
     79         obj_turn_pitch_toward_mario(120.0f, 1000);
     80         o->oFaceAnglePitch = o->oMoveAnglePitch + 0x7FFF;
     81         cur_obj_rotate_yaw_toward(o->oAngleToMario, 1000);
     82 
     83         if (o->oTimer > 30) {
     84             obj_compute_vel_from_move_pitch(50.0f);
     85         }
     86     }
     87 
     88     cur_obj_move_standard(78);
     89 }
     90 
     91 void flying_bookend_act_3(void) {
     92     o->oDamageOrCoinValue = 1;
     93     o->oNumLootCoins = 0;
     94 
     95     if (o->oTimer > 3) {
     96         o->oAction = 2;
     97         o->oForwardVel = 50.0f;
     98     }
     99 
    100     obj_forward_vel_approach(50.0f, 2.0f);
    101     cur_obj_move_using_fvel_and_gravity();
    102 }
    103 
    104 void bhv_flying_bookend_loop(void) {
    105     if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) {
    106         o->oDeathSound = SOUND_OBJ_POUNDING1;
    107         cur_obj_scale(o->header.gfx.scale[0]);
    108 
    109         switch (o->oAction) {
    110             case 0:
    111                 flying_bookend_act_0();
    112                 break;
    113             case 1:
    114                 flying_bookend_act_1();
    115                 break;
    116             case 2:
    117                 flying_bookend_act_2();
    118                 break;
    119             case 3:
    120                 flying_bookend_act_3();
    121                 break;
    122         }
    123 
    124         obj_check_attacks(&sFlyingBookendHitbox, -1);
    125 
    126         if (o->oAction == -1 || (o->oMoveFlags & (OBJ_MOVE_MASK_ON_GROUND | OBJ_MOVE_HIT_WALL))) {
    127             o->oNumLootCoins = 0;
    128             obj_die_if_health_non_positive();
    129         }
    130 
    131         o->oGraphYOffset = 30.0f * o->header.gfx.scale[0];
    132     }
    133 }
    134 
    135 void bhv_bookend_spawn_loop(void) {
    136     if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) {
    137         if (o->oTimer > 40 && obj_is_near_to_and_facing_mario(600.0f, 0x2000)) {
    138             struct Object *sp1C = spawn_object(o, MODEL_BOOKEND, bhvFlyingBookend);
    139 
    140             if (sp1C != NULL) {
    141                 sp1C->oAction = 3;
    142                 cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH);
    143             }
    144 
    145             o->oTimer = 0;
    146         }
    147     }
    148 }
    149 
    150 void bookshelf_manager_act_0(void) {
    151     s32 i;
    152 
    153     if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) {
    154         for (i = 0; i < 3; i++) {
    155             spawn_object_relative(i, D_80331B30[i].unk00, D_80331B30[i].unk02, 0, o,
    156                                   MODEL_BOOKEND, bhvBookSwitch);
    157         }
    158 
    159         o->oAction = 1;
    160     }
    161 }
    162 
    163 void bookshelf_manager_act_1(void) {
    164     if (o->oBookSwitchManagerUnkF8 == 0) {
    165         if (obj_is_near_to_and_facing_mario(500.0f, 0x3000)) {
    166             o->oBookSwitchManagerUnkF8 = 1;
    167         }
    168     } else if (o->oTimer > 60) {
    169         o->oAction = 2;
    170         o->oBookSwitchManagerUnkF8 = 0;
    171     }
    172 }
    173 
    174 void bookshelf_manager_act_2(void) {
    175     if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) {
    176         if (o->oBookSwitchManagerUnkF4 < 0) {
    177             if (o->oTimer > 30) {
    178                 o->oBookSwitchManagerUnkF4 = o->oBookSwitchManagerUnkF8 = 0;
    179             } else if (o->oTimer > 10) {
    180                 o->oBookSwitchManagerUnkF8 = 1;
    181             }
    182         } else {
    183             if (o->oBookSwitchManagerUnkF4 >= 3) {
    184                 if (o->oTimer > 100) {
    185                     o->parentObj = cur_obj_nearest_object_with_behavior(bhvHauntedBookshelf);
    186                     o->parentObj->oAction = 1;
    187                     o->oPosX = o->parentObj->oPosX;
    188                     o->oAction = 3;
    189                 } else if (o->oTimer == 30) {
    190                     play_puzzle_jingle();
    191                 }
    192             } else {
    193                 o->oTimer = 0;
    194             }
    195         }
    196     } else {
    197         o->oAction = 4;
    198     }
    199 }
    200 
    201 void bookshelf_manager_act_3(void) {
    202     if (o->oTimer > 85) {
    203         o->oAction = 4;
    204     } else {
    205         o->oForwardVel = o->parentObj->oPosX - o->oPosX;
    206         o->oPosX = o->parentObj->oPosX;
    207     }
    208 }
    209 
    210 void bookshelf_manager_act_4(void) {
    211     if (o->oBookSwitchManagerUnkF4 >= 3) {
    212         obj_mark_for_deletion(o);
    213     } else {
    214         o->oAction = 0;
    215     }
    216 }
    217 
    218 void bhv_haunted_bookshelf_manager_loop(void) {
    219     switch (o->oAction) {
    220         case 0:
    221             bookshelf_manager_act_0();
    222             break;
    223         case 2:
    224             bookshelf_manager_act_2();
    225             break;
    226         case 1:
    227             bookshelf_manager_act_1();
    228             break;
    229         case 3:
    230             bookshelf_manager_act_3();
    231             break;
    232         case 4:
    233             bookshelf_manager_act_4();
    234             break;
    235     }
    236 }
    237 
    238 void bhv_book_switch_loop(void) {
    239     o->header.gfx.scale[0] = 2.0f;
    240     o->header.gfx.scale[1] = 0.9f;
    241 
    242     if (o->parentObj->oAction == 4) {
    243         obj_mark_for_deletion(o);
    244     } else {
    245         s32 attackType = obj_check_attacks(&sBookSwitchHitbox, o->oAction);
    246 
    247         if (o->parentObj->oBookSwitchManagerUnkF8 != 0 || o->oAction == 1) {
    248             if (o->oDistanceToMario < 100.0f) {
    249                 cur_obj_become_tangible();
    250             } else {
    251                 cur_obj_become_intangible();
    252             }
    253 
    254             o->oAction = 1;
    255 
    256             if (o->oBookSwitchUnkF4 == 0.0f) {
    257                 cur_obj_play_sound_2(SOUND_OBJ_DEFAULT_DEATH);
    258             }
    259 
    260             if (approach_f32_ptr(&o->oBookSwitchUnkF4, 50.0f, 20.0f)) {
    261                 if (o->parentObj->oBookSwitchManagerUnkF4 >= 0 && o->oTimer > 60
    262                     && (attackType == ATTACK_PUNCH || attackType == ATTACK_KICK_OR_TRIP
    263                         || attackType == ATTACK_FROM_BELOW)) {
    264                     o->oAction = 2;
    265                 }
    266             } else {
    267                 o->oTimer = 0;
    268             }
    269         } else {
    270             cur_obj_become_intangible();
    271 
    272             if (approach_f32_ptr(&o->oBookSwitchUnkF4, 0.0f, 20.0f) && o->oAction != 0) {
    273                 if (o->parentObj->oBookSwitchManagerUnkF4 == o->oBhvParams2ndByte) {
    274                     play_sound(SOUND_GENERAL2_RIGHT_ANSWER, gGlobalSoundSource);
    275                     o->parentObj->oBookSwitchManagerUnkF4++;
    276                 } else {
    277                     struct Object *sp38;
    278                     s16 sp36 = random_u16() & 0x1;
    279                     s16 sp34 = gMarioObject->oPosZ + 1.5f * gMarioStates[0].vel[2];
    280 
    281                     play_sound(SOUND_MENU_CAMERA_BUZZ, gGlobalSoundSource);
    282 
    283                     if (sp34 > 0) {
    284                         sp34 = 0;
    285                     }
    286 
    287                     sp38 = spawn_object_abs_with_rot(o, 0, MODEL_BOOKEND, bhvFlyingBookend,
    288                                                      0x1FC * sp36 - 0x8CA, 890, sp34, 0,
    289                                                      0x8000 * sp36 + 0x4000, 0);
    290 
    291                     if (sp38 != NULL) {
    292                         sp38->oAction = 3;
    293                     }
    294 
    295                     o->parentObj->oBookSwitchManagerUnkF4 = -1;
    296                 }
    297 
    298                 o->oAction = 0;
    299             }
    300         }
    301 
    302         o->oPosX += o->parentObj->oForwardVel;
    303         o->oPosZ = o->oHomeZ - o->oBookSwitchUnkF4;
    304         cur_obj_push_mario_away_from_cylinder(70.0f, 70.0f);
    305     }
    306 }