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

51 lines
2.3 KiB
C

/**
* Main loop of the hour and minute hands of the Tick Tock Clock painting.
*/
void bhv_rotating_clock_arm_loop(void) {
struct Surface *marioSurface;
u16 rollAngle = o->oFaceAngleRoll;
o->oFloorHeight =
find_floor(gMarioObject->oPosX, gMarioObject->oPosY, gMarioObject->oPosZ, &marioSurface);
// Seems to make sure Mario is on a default surface & 4 frames pass before
// allowing him to change the Tick Tock Clock speed setting.
// Probably a safety check for when you leave the level through the painting
// to make sure the setting isn't accidentally locked in as you fly out.
if (o->oAction == 0) {
if (marioSurface->type == SURFACE_DEFAULT)
if (o->oTimer >= 4)
o->oAction++;
} else if (o->oAction == 1) {
// If Mario is touching the Tick Tock Clock painting...
if (marioSurface != NULL
&& (marioSurface->type == SURFACE_TTC_PAINTING_1
|| marioSurface->type == SURFACE_TTC_PAINTING_2
|| marioSurface->type == SURFACE_TTC_PAINTING_3)) {
// And this is the minute hand...
if (cur_obj_has_behavior(bhvClockMinuteHand)) {
// Set Tick Tick Clock's speed based on the angle of the hand.
// The angle actually counting down from 0xFFFF to 0 so
// 11 o'clock is a small value and 1 o'clock is a large value.
if (rollAngle < 0xAAA) // > 345 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_STOPPED;
else if (rollAngle < 0x6aa4) // 210..345 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_FAST;
else if (rollAngle < 0x954C) // 150..210 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_RANDOM;
else if (rollAngle < 0xf546) // 15..150 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_SLOW;
else // < 15 degrees from 12 o'clock.
gTTCSpeedSetting = TTC_SPEED_STOPPED;
}
// Increment the action to stop animating the hands.
o->oAction++;
} else {
}
}
// Only rotate the hands until Mario enters the painting.
if (o->oAction < 2)
cur_obj_rotate_face_angle_using_vel();
}