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

53 lines
1.4 KiB
C

/**
* Behavior for bhvTTCElevator.
*/
/**
* The speed on each setting.
*/
static s8 sTTCElevatorSpeeds[] = {
/* TTC_SPEED_SLOW */ 6,
/* TTC_SPEED_FAST */ 10,
/* TTC_SPEED_RANDOM */ 6,
/* TTC_SPEED_STOPPED */ 0,
};
/**
* Init function for bhvTTCElevator.
*/
void bhv_ttc_elevator_init(void) {
// If behParam is nonzero, then move 100 * behParam units. Otherwise default
// to 500
f32 peakOffset =
((o->oBehParams >> 16) & 0xFFFF) != 0 ? 100.0f * ((o->oBehParams >> 16) & 0xFFFF) : 500.0f;
o->oTTCElevatorPeakY = o->oPosY + peakOffset;
}
/**
* Update function for bhvTTCElevator.
*/
void bhv_ttc_elevator_update(void) {
o->oVelY = sTTCElevatorSpeeds[gTTCSpeedSetting] * o->oTTCElevatorDir;
if (gTTCSpeedSetting == TTC_SPEED_RANDOM) {
// Occasionally stop for 5 frames then change direction
if (o->oTimer > o->oTTCElevatorMoveTime) {
o->oTTCElevatorDir = random_sign();
o->oTTCElevatorMoveTime = random_mod_offset(30, 30, 6);
o->oTimer = 0;
} else if (o->oTimer < 5) {
o->oVelY = 0.0f;
}
}
// This is basically equivalent to posY += velY
cur_obj_move_using_fvel_and_gravity();
// Flip directions if the elevator tries to run away
if (clamp_f32(&o->oPosY, o->oHomeY, o->oTTCElevatorPeakY)) {
o->oTTCElevatorDir = -o->oTTCElevatorDir;
}
}