2019-08-25 04:46:40 +00:00
|
|
|
// floating_platform.c.inc
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
f32 floating_platform_find_home_y(void) {
|
2019-08-25 04:46:40 +00:00
|
|
|
struct Surface *sp24;
|
|
|
|
f32 sp20;
|
|
|
|
f32 sp1C;
|
|
|
|
|
|
|
|
sp20 = find_water_level(o->oPosX, o->oPosZ);
|
|
|
|
sp1C = find_floor(o->oPosX, o->oPosY, o->oPosZ, &sp24);
|
2019-10-05 19:08:05 +00:00
|
|
|
if (sp20 > sp1C + o->oFloatingPlatformUnkFC) {
|
|
|
|
o->oFloatingPlatformUnkF4 = 0;
|
|
|
|
return sp20 + o->oFloatingPlatformUnkFC;
|
2019-08-25 04:46:40 +00:00
|
|
|
} else {
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oFloatingPlatformUnkF4 = 1;
|
|
|
|
return sp1C + o->oFloatingPlatformUnkFC;
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void floating_platform_act_0(void) {
|
2020-02-03 05:51:26 +00:00
|
|
|
s16 sp6 = (gMarioObject->header.gfx.pos[0] - o->oPosX) * coss(-1*o->oMoveAngleYaw)
|
|
|
|
+ (gMarioObject->header.gfx.pos[2] - o->oPosZ) * sins(-1*o->oMoveAngleYaw);
|
|
|
|
s16 sp4 = (gMarioObject->header.gfx.pos[2] - o->oPosZ) * coss(-1*o->oMoveAngleYaw)
|
|
|
|
- (gMarioObject->header.gfx.pos[0] - o->oPosX) * sins(-1*o->oMoveAngleYaw);
|
2019-08-25 04:46:40 +00:00
|
|
|
|
|
|
|
if (gMarioObject->platform == o) {
|
|
|
|
o->oFaceAnglePitch = sp4 * 2;
|
|
|
|
o->oFaceAngleRoll = -sp6 * 2;
|
|
|
|
o->oVelY -= 1.0f;
|
|
|
|
if (o->oVelY < 0.0f)
|
|
|
|
o->oVelY = 0.0f;
|
|
|
|
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oFloatingPlatformUnkF8 += o->oVelY;
|
|
|
|
if (o->oFloatingPlatformUnkF8 > 90.0f)
|
|
|
|
o->oFloatingPlatformUnkF8 = 90.0f;
|
2019-08-25 04:46:40 +00:00
|
|
|
} else {
|
|
|
|
o->oFaceAnglePitch /= 2;
|
|
|
|
o->oFaceAngleRoll /= 2;
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oFloatingPlatformUnkF8 -= 5.0;
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oVelY = 10.0f;
|
2019-10-05 19:08:05 +00:00
|
|
|
if (o->oFloatingPlatformUnkF8 < 0.0f)
|
|
|
|
o->oFloatingPlatformUnkF8 = 0.0f;
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oPosY = o->oHomeY - 64.0f - o->oFloatingPlatformUnkF8 + sins(o->oFloatingPlatformUnk100 * 0x800) * 10.0f;
|
|
|
|
o->oFloatingPlatformUnk100++;
|
|
|
|
if (o->oFloatingPlatformUnk100 == 32)
|
|
|
|
o->oFloatingPlatformUnk100 = 0;
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_floating_platform_loop(void) {
|
2020-03-02 03:42:52 +00:00
|
|
|
o->oHomeY = floating_platform_find_home_y();
|
2019-10-05 19:08:05 +00:00
|
|
|
if (o->oFloatingPlatformUnkF4 == 0)
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oAction = 0;
|
|
|
|
else
|
|
|
|
o->oAction = 1;
|
|
|
|
|
|
|
|
switch (o->oAction) {
|
|
|
|
case 0:
|
2020-03-02 03:42:52 +00:00
|
|
|
floating_platform_act_0();
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
o->oPosY = o->oHomeY;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|