mirror of https://github.com/sm64pc/sm64pc.git
64 lines
2.2 KiB
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;
|
||
|
}
|