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

56 lines
1.4 KiB
C

/**
* Behavior for bhvTTCCog. This includes both the hexagonal cogs and the
* triangular prisms that rotate around the y axis.
*/
/**
* Collision model for hexagon and triangle, respectively.
*/
static void *sTTCCogCollisionModels[] = {
ttc_seg7_collision_07015584,
ttc_seg7_collision_07015650,
};
/**
* The direction that the cog moves on non-random settings.
*/
static s8 sTTCCogDirections[] = { 1, -1 };
/**
* The speed that the cog moves on the slow and fast settings, respectively.
*/
static s16 sTTCCogNormalSpeeds[] = { 200, 400 };
/**
* Init function for bhvTTCCog.
*/
void bhv_ttc_cog_init(void) {
o->collisionData = segmented_to_virtual(
sTTCCogCollisionModels[(o->oBehParams2ndByte & TTC_COG_BP_SHAPE_MASK) >> 1]);
o->oTTCCogDir = sTTCCogDirections[o->oBehParams2ndByte & TTC_COG_BP_DIR_MASK];
}
/**
* Update function for bhvTTCCog.
*/
void bhv_ttc_cog_update(void) {
switch (gTTCSpeedSetting) {
case TTC_SPEED_SLOW:
case TTC_SPEED_FAST:
o->oTTCCogSpeed = sTTCCogNormalSpeeds[gTTCSpeedSetting];
break;
case TTC_SPEED_RANDOM:
if (approach_f32_ptr(&o->oTTCCogSpeed, o->oTTCCogTargetVel, 50.0f)) {
o->oTTCCogTargetVel = 200.0f * (random_u16() % 7) * random_sign();
}
case TTC_SPEED_STOPPED:
break;
}
o->oAngleVelYaw = (s32)(o->oTTCCogSpeed * o->oTTCCogDir);
o->oFaceAngleYaw += o->oAngleVelYaw;
}