sm64

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

floating_platform.inc.c (2116B)


      1 // floating_platform.inc.c
      2 
      3 f32 floating_platform_find_home_y(void) {
      4     struct Surface *sp24;
      5     f32 sp20 = find_water_level(o->oPosX, o->oPosZ);
      6     f32 sp1C = find_floor(o->oPosX, o->oPosY, o->oPosZ, &sp24);
      7 
      8     if (sp20 > sp1C + o->oFloatingPlatformUnkFC) {
      9         o->oFloatingPlatformUnkF4 = 0;
     10         return sp20 + o->oFloatingPlatformUnkFC;
     11     } else {
     12         o->oFloatingPlatformUnkF4 = 1;
     13         return sp1C + o->oFloatingPlatformUnkFC;
     14     }
     15 }
     16 
     17 void floating_platform_act_0(void) {
     18     s16 sp6 = (gMarioObject->header.gfx.pos[0] - o->oPosX) * coss(-1*o->oMoveAngleYaw)
     19               + (gMarioObject->header.gfx.pos[2] - o->oPosZ) * sins(-1*o->oMoveAngleYaw);
     20     s16 sp4 = (gMarioObject->header.gfx.pos[2] - o->oPosZ) * coss(-1*o->oMoveAngleYaw)
     21               - (gMarioObject->header.gfx.pos[0] - o->oPosX) * sins(-1*o->oMoveAngleYaw);
     22 
     23     if (gMarioObject->platform == o) {
     24         o->oFaceAnglePitch = sp4 * 2;
     25         o->oFaceAngleRoll = -sp6 * 2;
     26 
     27         o->oVelY -= 1.0f;
     28         if (o->oVelY < 0.0f) {
     29             o->oVelY = 0.0f;
     30         }
     31 
     32         o->oFloatingPlatformUnkF8 += o->oVelY;
     33 
     34         if (o->oFloatingPlatformUnkF8 > 90.0f) {
     35             o->oFloatingPlatformUnkF8 = 90.0f;
     36         }
     37     } else {
     38         o->oFaceAnglePitch /= 2;
     39         o->oFaceAngleRoll /= 2;
     40 
     41         o->oFloatingPlatformUnkF8 -= 5.0;
     42 
     43         o->oVelY = 10.0f;
     44 
     45         if (o->oFloatingPlatformUnkF8 < 0.0f) {
     46             o->oFloatingPlatformUnkF8 = 0.0f;
     47         }
     48     }
     49 
     50     o->oPosY = o->oHomeY - 64.0f - o->oFloatingPlatformUnkF8
     51                + sins(o->oFloatingPlatformUnk100 * 0x800) * 10.0f;
     52 
     53     o->oFloatingPlatformUnk100++;
     54 
     55     if (o->oFloatingPlatformUnk100 == 32) {
     56         o->oFloatingPlatformUnk100 = 0;
     57     }
     58 }
     59 
     60 void bhv_floating_platform_loop(void) {
     61     o->oHomeY = floating_platform_find_home_y();
     62 
     63     if (o->oFloatingPlatformUnkF4 == 0) {
     64         o->oAction = 0;
     65     } else {
     66         o->oAction = 1;
     67     }
     68 
     69     switch (o->oAction) {
     70         case 0:
     71             floating_platform_act_0();
     72             break;
     73         case 1:
     74             o->oPosY = o->oHomeY;
     75             break;
     76     }
     77 }