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 }