sm64

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

checkerboard_platform.inc.c (3042B)


      1 // checkerboard_platform.inc.c
      2 
      3 struct Struct8032F754 {
      4     s32 unk0;
      5     Vec3f unk1;
      6     f32 unk2;
      7 };
      8 
      9 struct Struct8032F754 D_8032F754[] = {
     10     { 145, { 0.7f, 1.5f, 0.7f }, 7.0f },
     11     { 235, { 1.2f, 2.0f, 1.2f }, 11.6f },
     12 };
     13 
     14 void bhv_checkerboard_elevator_group_init(void) {
     15     s32 sp3C;
     16     s32 sp38;
     17     s32 sp34;
     18     s32 i;
     19     struct Object *sp2C;
     20 
     21     if (o->oBhvParams2ndByte == 0) {
     22         o->oBhvParams2ndByte = 65;
     23     }
     24 
     25     sp3C = o->oBhvParams2ndByte * 10;
     26     sp34 = (o->oBhvParams >> 24) & 0xFF;
     27 
     28     for (i = 0; i <= 1; i++) {
     29         if (i == 0) {
     30             sp38 = -D_8032F754[sp34].unk0;
     31         } else {
     32             sp38 = D_8032F754[sp34].unk0;
     33         }
     34 
     35         sp2C = spawn_object_relative(i, 0, i * sp3C, sp38, o, MODEL_CHECKERBOARD_PLATFORM,
     36                                      bhvCheckerboardPlatformSub);
     37         sp2C->oCheckerBoardPlatformUnk1AC = D_8032F754[sp34].unk2;
     38         vec3f_copy_2(sp2C->header.gfx.scale, D_8032F754[sp34].unk1);
     39     }
     40 }
     41 
     42 void checkerboard_plat_act_move_y(UNUSED s32 unused, f32 vel, s32 a2) {
     43     o->oMoveAnglePitch = 0;
     44     o->oAngleVelPitch = 0;
     45     o->oForwardVel = 0.0f;
     46     o->oVelY = vel;
     47     if (o->oTimer > a2) {
     48         o->oAction++;
     49     }
     50 }
     51 
     52 void checkerboard_plat_act_rotate(s32 a0, s16 a1) {
     53     o->oVelY = 0.0f;
     54     o->oAngleVelPitch = a1;
     55     if (o->oTimer + 1 == 0x8000 / absi(a1)) {
     56         o->oAction = a0;
     57     }
     58     o->oCheckerBoardPlatformUnkF8 = a0;
     59 }
     60 
     61 void bhv_checkerboard_platform_init(void) {
     62     o->oCheckerBoardPlatformUnkFC = o->parentObj->oBhvParams2ndByte;
     63 }
     64 
     65 void bhv_checkerboard_platform_loop(void) {
     66     f32 sp24 = o->oCheckerBoardPlatformUnk1AC;
     67 
     68     o->oCheckerBoardPlatformUnkF8 = 0;
     69 
     70     if (o->oDistanceToMario < 1000.0f) {
     71         cur_obj_play_sound_1(SOUND_ENV_ELEVATOR4);
     72     }
     73 
     74     switch (o->oAction) {
     75         case 0:
     76             if (o->oBhvParams2ndByte == 0) {
     77                 o->oAction = 1;
     78             } else {
     79                 o->oAction = 3;
     80             }
     81             break;
     82         case 1:
     83             checkerboard_plat_act_move_y(2, 10.0f, o->oCheckerBoardPlatformUnkFC);
     84             break;
     85         case 2:
     86             checkerboard_plat_act_rotate(3, 512);
     87             break;
     88         case 3:
     89             checkerboard_plat_act_move_y(4, -10.0f, o->oCheckerBoardPlatformUnkFC);
     90             break;
     91         case 4:
     92             checkerboard_plat_act_rotate(1, -512);
     93             break;
     94     }
     95 
     96     o->oMoveAnglePitch += absi(o->oAngleVelPitch);
     97     o->oFaceAnglePitch += absi(o->oAngleVelPitch);
     98     o->oFaceAngleYaw = o->oMoveAngleYaw;
     99 
    100     if (o->oMoveAnglePitch != 0) {
    101         o->oForwardVel = signum_positive(o->oAngleVelPitch) * sins(o->oMoveAnglePitch) * sp24;
    102         o->oVelY = signum_positive(o->oAngleVelPitch) * coss(o->oMoveAnglePitch) * sp24;
    103     }
    104 
    105     if (o->oCheckerBoardPlatformUnkF8 == 1) {
    106         o->oAngleVelPitch = 0;
    107         o->oFaceAnglePitch &= ~0x7FFF;
    108         cur_obj_move_using_fvel_and_gravity();
    109     } else {
    110         cur_obj_move_using_fvel_and_gravity();
    111     }
    112 
    113     load_object_collision_model();
    114 }