mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-10-20 04:02:39 +00:00
66 lines
2.3 KiB
C
66 lines
2.3 KiB
C
|
|
/**
|
|
* Behavior for bhvTTCTreadmill.
|
|
* The first treadmill in processing order is the "master treadmill". It is
|
|
* responsible for playing sounds and calling RNG to control all the other
|
|
* treadmills.
|
|
*/
|
|
|
|
/**
|
|
* Collision models for the different sized treadmills.
|
|
*/
|
|
static Collision const *sTTCTreadmillCollisionModels[] = {
|
|
ttc_seg7_collision_070152B4,
|
|
ttc_seg7_collision_070153E0,
|
|
};
|
|
|
|
static s16 sTTCTreadmillSpeeds[] = {
|
|
/* TTC_SPEED_SLOW */ 50,
|
|
/* TTC_SPEED_FAST */ 100,
|
|
/* TTC_SPEED_RANDOM */ 0,
|
|
/* TTC_SPEED_STOPPED */ 0,
|
|
};
|
|
|
|
extern s16 ttc_movtex_tris_big_surface_treadmill[];
|
|
extern s16 ttc_movtex_tris_small_surface_treadmill[];
|
|
|
|
void bhv_ttc_treadmill_init(void) {
|
|
o->collisionData = segmented_to_virtual(sTTCTreadmillCollisionModels[o->oBehParams2ndByte & 0x1]);
|
|
|
|
o->oTTCTreadmillBigSurface = segmented_to_virtual(ttc_movtex_tris_big_surface_treadmill);
|
|
o->oTTCTreadmillSmallSurface = segmented_to_virtual(ttc_movtex_tris_small_surface_treadmill);
|
|
|
|
*o->oTTCTreadmillBigSurface = *o->oTTCTreadmillSmallSurface = sTTCTreadmillSpeeds[gTTCSpeedSetting];
|
|
|
|
sMasterTreadmill = NULL;
|
|
}
|
|
|
|
/**
|
|
* Update function for bhvTTCTreadmill. It calls cur_obj_compute_vel_xz afterward.
|
|
*/
|
|
void bhv_ttc_treadmill_update(void) {
|
|
if (sMasterTreadmill == o || sMasterTreadmill == NULL) {
|
|
sMasterTreadmill = o;
|
|
|
|
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR2);
|
|
|
|
if (gTTCSpeedSetting == TTC_SPEED_RANDOM) {
|
|
// Stay still for 5 frames, then accelerate toward the target speed
|
|
// until it's time to switch
|
|
if (o->oTimer > o->oTTCTreadmillTimeUntilSwitch) {
|
|
// Then stop and select new target speed and time until switch
|
|
if (approach_f32_ptr(&o->oTTCTreadmillSpeed, 0.0f, 10.0f)) {
|
|
o->oTTCTreadmillTimeUntilSwitch = random_mod_offset(10, 20, 7);
|
|
o->oTTCTreadmillTargetSpeed = random_sign() * 50.0f;
|
|
o->oTimer = 0;
|
|
}
|
|
} else if (o->oTimer > 5) {
|
|
approach_f32_ptr(&o->oTTCTreadmillSpeed, o->oTTCTreadmillTargetSpeed, 10.0f);
|
|
}
|
|
|
|
*o->oTTCTreadmillBigSurface = *o->oTTCTreadmillSmallSurface = o->oTTCTreadmillSpeed;
|
|
}
|
|
}
|
|
|
|
o->oForwardVel = 0.084f * *o->oTTCTreadmillBigSurface;
|
|
}
|