2019-08-25 04:46:40 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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) {
|
2020-04-03 18:57:26 +00:00
|
|
|
o->oTTCElevatorDir = random_sign();
|
2019-08-25 04:46:40 +00:00
|
|
|
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
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_move_using_fvel_and_gravity();
|
2019-08-25 04:46:40 +00:00
|
|
|
|
|
|
|
// Flip directions if the elevator tries to run away
|
|
|
|
if (clamp_f32(&o->oPosY, o->oHomeY, o->oTTCElevatorPeakY)) {
|
|
|
|
o->oTTCElevatorDir = -o->oTTCElevatorDir;
|
|
|
|
}
|
|
|
|
}
|