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

64 lines
2.2 KiB
C

/**
* Behavior for bhvBbhTiltingTrapPlatform.
* This is the tilting platform trap in the upper floor of BBH
* that drops the player into the merry-go-round area.
*/
/**
* Update function for bhvBbhTiltingTrapPlatform.
*/
void bhv_bbh_tilting_trap_platform_loop(void) {
UNUSED s32 unused;
// US (and probably later) versions use oAction for the
// if statement, while immediately setting it over here.
// This was done so that Mario leaving or getting on the platform
// resets oTimer to 0.
#ifndef VERSION_JP
if (gMarioObject->platform == o) {
o->oAction = BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON;
} else {
o->oAction = BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_OFF;
}
if (o->oAction == BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON) {
#else
if (gMarioObject->platform == o) {
#endif
o->oAngleVelPitch = (s32)(o->oDistanceToMario * coss(o->oAngleToMario));
o->oFaceAnglePitch += o->oAngleVelPitch;
} else
#ifndef VERSION_JP
// In the US version, if the platform has tilted more than 3000 angle units
// in less than 16 frames since Mario got on it, and he has stepped off,
// this code will not run, so it will continue to rotate with the same
// angular velocity for 16 more frames. This was probably done to make
// the platform more dangerous. This code will not work correctly
// without the oAction changes above, since oTimer will not ever
// reset to 0 without them.
if ((absi(o->oFaceAnglePitch) < 3000) || (o->oTimer >= 16))
#endif
{
// Make the platform return to the horizontal at a speed of
// 200 angle units/frame, and clamp it to 0 if it's within 200 units of 0.
o->oAngleVelPitch = 0;
if ((s16) o->oFaceAnglePitch > 0) {
if (o->oFaceAnglePitch < 200) {
o->oFaceAnglePitch = 0;
} else {
o->oAngleVelPitch = -200;
}
} else {
if (o->oFaceAnglePitch > -200) {
o->oFaceAnglePitch = 0;
} else {
o->oAngleVelPitch = 200;
}
}
}
// Update angle
o->oFaceAnglePitch += o->oAngleVelPitch;
}