sm64pc/src/game/behaviors/floating_platform.inc.c

67 lines
1.9 KiB
C

// floating_platform.c.inc
f32 func_802F54F8(void) {
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);
if (sp20 > sp1C + o->oUnknownUnkFC_F32) {
o->oUnknownUnkF4_S32 = 0;
return sp20 + o->oUnknownUnkFC_F32;
} else {
o->oUnknownUnkF4_S32 = 1;
return sp1C + o->oUnknownUnkFC_F32;
}
}
void func_802F55CC(void) {
s16 sp6 = (gMarioObject->header.gfx.pos[0] - o->oPosX) * coss(-o->oMoveAngleYaw)
+ (gMarioObject->header.gfx.pos[2] - o->oPosZ) * sins(-o->oMoveAngleYaw);
s16 sp4 = (gMarioObject->header.gfx.pos[2] - o->oPosZ) * coss(-o->oMoveAngleYaw)
- (gMarioObject->header.gfx.pos[0] - o->oPosX) * sins(-o->oMoveAngleYaw);
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;
o->oUnknownUnkF8_F32 += o->oVelY;
if (o->oUnknownUnkF8_F32 > 90.0f)
o->oUnknownUnkF8_F32 = 90.0f;
} else {
o->oFaceAnglePitch /= 2;
o->oFaceAngleRoll /= 2;
o->oUnknownUnkF8_F32 -= 5.0;
o->oVelY = 10.0f;
if (o->oUnknownUnkF8_F32 < 0.0f)
o->oUnknownUnkF8_F32 = 0.0f;
}
o->oPosY = o->oHomeY - 64.0f - o->oUnknownUnkF8_F32 + sins(o->oUnknownUnk100_S32 * 0x800) * 10.0f;
o->oUnknownUnk100_S32++;
if (o->oUnknownUnk100_S32 == 32)
o->oUnknownUnk100_S32 = 0;
}
void bhv_floating_platform_loop(void) {
o->oHomeY = func_802F54F8();
if (o->oFloatingPlatformUnkFC == 0)
o->oAction = 0;
else
o->oAction = 1;
switch (o->oAction) {
case 0:
func_802F55CC();
break;
case 1:
o->oPosY = o->oHomeY;
break;
}
}