sm64

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

rolling_log.inc.c (4548B)


      1 // rolling_log.inc.c
      2 
      3 // why are the falling platforms and rolling logs grouped
      4 // together? seems strange, but it also cooresponds to the
      5 // behavior script grouping if the same file is assumed.
      6 // hypothesis is that the object in the middle here used to be
      7 // a rolling log of another variation.
      8 
      9 void bhv_ttm_rolling_log_init(void) {
     10     o->oPitouneUnkF8 = 3970.0f;
     11     o->oPitouneUnkFC = 3654.0f;
     12     o->oPitouneUnkF4 = 271037.0f;
     13 
     14     o->oMoveAngleYaw = 8810;
     15     o->oForwardVel = 0.0f;
     16     o->oVelX = 0.0f;
     17     o->oVelZ = 0.0f;
     18     o->oFaceAnglePitch = 0;
     19     o->oAngleVelPitch = 0;
     20 }
     21 
     22 void rolling_log_roll_log(void) {
     23     if (gMarioObject->platform == o) {
     24         f32 sp24 = (gMarioObject->header.gfx.pos[2] - o->oPosZ) * coss(-1*o->oMoveAngleYaw)
     25                    - (gMarioObject->header.gfx.pos[0] - o->oPosX) * sins(-1*o->oMoveAngleYaw);
     26         if (sp24 > 0) {
     27             o->oAngleVelPitch += 0x10;
     28         } else {
     29             o->oAngleVelPitch -= 0x10;
     30         }
     31 
     32         if (o->oAngleVelPitch > 0x200) {
     33             o->oAngleVelPitch = 0x200;
     34         }
     35 
     36         if (o->oAngleVelPitch < -0x200) {
     37             o->oAngleVelPitch = -0x200;
     38         }
     39     } else {
     40         if (is_point_close_to_object(o, o->oHomeX, o->oHomeY, o->oHomeZ, 100)) {
     41             if (o->oAngleVelPitch != 0) {
     42                 if (o->oAngleVelPitch > 0) {
     43                     o->oAngleVelPitch -= 0x10;
     44                 } else {
     45                     o->oAngleVelPitch += 0x10;
     46                 }
     47 
     48                 if (o->oAngleVelPitch < 0x10 && o->oAngleVelPitch > -0x10) {
     49                     o->oAngleVelPitch = 0;
     50                 }
     51             }
     52         } else {
     53             if (o->oAngleVelPitch != 0x100) {
     54                 if (o->oAngleVelPitch > 0x100) {
     55                     o->oAngleVelPitch -= 0x10;
     56                 } else {
     57                     o->oAngleVelPitch += 0x10;
     58                 }
     59 
     60                 if (o->oAngleVelPitch < 0x110 && o->oAngleVelPitch > 0xF0) {
     61                     o->oAngleVelPitch = 0x100;
     62                 }
     63             }
     64         }
     65     }
     66 }
     67 
     68 void bhv_rolling_log_loop(void) {
     69     f32 prevX = o->oPosX;
     70     f32 prevZ = o->oPosZ;
     71 
     72     rolling_log_roll_log();
     73 
     74     o->oForwardVel = o->oAngleVelPitch / 0x40;
     75     o->oVelX = o->oForwardVel * sins(o->oMoveAngleYaw);
     76     o->oVelZ = o->oForwardVel * coss(o->oMoveAngleYaw);
     77 
     78     o->oPosX += o->oVelX;
     79     o->oPosZ += o->oVelZ;
     80 
     81     if (o->oPitouneUnkF4 < sqr(o->oPosX - o->oPitouneUnkF8) + sqr(o->oPosZ - o->oPitouneUnkFC)) {
     82         o->oForwardVel = 0.0f;
     83         o->oPosX = prevX;
     84         o->oPosZ = prevZ;
     85         o->oVelX = 0.0f;
     86         o->oVelZ = 0.0f;
     87     }
     88 
     89     o->oFaceAnglePitch += o->oAngleVelPitch;
     90     if (absf_2(o->oFaceAnglePitch & 0x1FFF) < 528.0f && o->oAngleVelPitch != 0) {
     91         cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN1_2);
     92     }
     93 }
     94 
     95 void volcano_act_1(void) {
     96     o->oRollingLogUnkF4 += 4.0f;
     97     o->oAngleVelPitch += o->oRollingLogUnkF4;
     98     o->oFaceAnglePitch -= o->oAngleVelPitch;
     99 
    100     if (o->oFaceAnglePitch < -0x4000) {
    101         o->oFaceAnglePitch = -0x4000;
    102         o->oAngleVelPitch = 0;
    103         o->oRollingLogUnkF4 = 0;
    104         o->oAction = 2;
    105         cur_obj_play_sound_2(SOUND_GENERAL_BIG_POUND);
    106         set_camera_shake_from_point(SHAKE_POS_LARGE, o->oPosX, o->oPosY, o->oPosZ);
    107     }
    108 }
    109 
    110 void volcano_act_3(void) {
    111     o->oAngleVelPitch = 0x90;
    112     o->oFaceAnglePitch += o->oAngleVelPitch;
    113 
    114     if (o->oFaceAnglePitch > 0) {
    115         o->oFaceAnglePitch = 0;
    116     }
    117 
    118     if (o->oTimer == 200) {
    119         o->oAction = 0;
    120     }
    121 }
    122 
    123 void bhv_volcano_trap_loop(void) {
    124     switch (o->oAction) {
    125         case 0:
    126             if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1000)) {
    127                 o->oAction = 1;
    128                 cur_obj_play_sound_2(SOUND_GENERAL_QUIET_POUND2);
    129             }
    130             break;
    131 
    132         case 1:
    133             volcano_act_1();
    134             break;
    135 
    136         case 2:
    137             if (o->oTimer < 8) {
    138                 o->oPosY = o->oHomeY + sins(o->oTimer * 0x1000) * 10.0f;
    139             }
    140             if (o->oTimer == 50) {
    141                 cur_obj_play_sound_2(SOUND_GENERAL_UNK45);
    142                 o->oAction = 3;
    143             }
    144             break;
    145 
    146         case 3:
    147             volcano_act_3();
    148             break;
    149     }
    150 }
    151 
    152 void bhv_lll_rolling_log_init(void) {
    153     o->oPitouneUnkF8 = 5120.0f;
    154     o->oPitouneUnkFC = 6016.0f;
    155     o->oPitouneUnkF4 = 1048576.0f;
    156 
    157     o->oMoveAngleYaw = 0x3FFF;
    158     o->oForwardVel = 0.0f;
    159     o->oVelX = 0.0f;
    160     o->oVelZ = 0.0f;
    161     o->oFaceAnglePitch = 0;
    162     o->oAngleVelPitch = 0;
    163 }