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

89 lines
2.8 KiB
C

/**
* Behavior for bhvTTC2DRotator.
* This includes the hand (in TTC, not the clock in the castle), as well as the
* purely visual 2D cogs in TTC.
*/
/**
* Speeds for the hand and the 2D cog, respectively. Negative because clockwise.
*/
static s16 sTTC2DRotatorSpeeds[] = {
-0x444,
-0xCCC,
};
/**
* The time between each increment to target yaw. On random setting, this is
* only used for the first turn, after which it is chosen randomly.
* These values are for the hand and the 2D cog, respectively.
*/
static s16 sTTC2DRotatorTimeBetweenTurns[][4] = {
{
/* TTC_SPEED_SLOW */ 40,
/* TTC_SPEED_FAST */ 10,
/* TTC_SPEED_RANDOM */ 10,
/* TTC_SPEED_STOPPED */ 0,
},
{
/* TTC_SPEED_SLOW */ 20,
/* TTC_SPEED_FAST */ 5,
/* TTC_SPEED_RANDOM */ 5,
/* TTC_SPEED_STOPPED */ 0,
},
};
/**
* Init function for bhvTTC2DRotator.
*/
void bhv_ttc_2d_rotator_init(void) {
o->oTTC2DRotatorMinTimeUntilNextTurn =
sTTC2DRotatorTimeBetweenTurns[o->oBehParams2ndByte][gTTCSpeedSetting];
o->oTTC2DRotatorIncrement = o->oTTC2DRotatorSpeed = sTTC2DRotatorSpeeds[o->oBehParams2ndByte];
}
/**
* Update function for bhvTTC2DRotator.
* Rotate to target yaw, and make sure we've waited long enough since the last
* turn, then increment the target yaw and possibly change direction.
*/
void bhv_ttc_2d_rotator_update(void) {
s32 startYaw = o->oFaceAngleYaw;
if (o->oTTC2DRotatorRandomDirTimer != 0) {
o->oTTC2DRotatorRandomDirTimer -= 1;
}
// Wait until rotated to target yaw
if (o->oTTC2DRotatorMinTimeUntilNextTurn != 0
&& obj_face_yaw_approach(o->oTTC2DRotatorTargetYaw, 0xC8)) {
// and until MinTimeUntilNextTurn has passed.
if (o->oTimer > o->oTTC2DRotatorMinTimeUntilNextTurn) {
// Increment target yaw
o->oTTC2DRotatorTargetYaw += o->oTTC2DRotatorIncrement;
o->oTimer = 0;
if (gTTCSpeedSetting == TTC_SPEED_RANDOM) {
// If ready for a change in direction, then pick a new
// direction
if (o->oTTC2DRotatorRandomDirTimer == 0) {
if (random_u16() & 0x3) {
o->oTTC2DRotatorIncrement = o->oTTC2DRotatorSpeed;
o->oTTC2DRotatorRandomDirTimer = random_mod_offset(90, 60, 4);
} else {
o->oTTC2DRotatorIncrement = -o->oTTC2DRotatorSpeed;
o->oTTC2DRotatorRandomDirTimer = random_mod_offset(30, 30, 3);
}
}
o->oTTC2DRotatorMinTimeUntilNextTurn = random_mod_offset(10, 20, 3);
}
}
}
o->oAngleVelYaw = o->oFaceAngleYaw - startYaw;
if (o->oBehParams2ndByte == TTC_2D_ROTATOR_BP_HAND) {
load_object_collision_model();
}
}