mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-10-20 04:02:39 +00:00
50 lines
2.3 KiB
C
50 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();
|
|
}
|