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

82 lines
2.9 KiB
C

/**
* Behavior for bhvFloorSwitchHardcodedModel, bhvFloorSwitchGrills, and
* bhvFloorSwitchAnimatesObject.
*
* This controls the purple switches that Mario can step on to affect parts of
* the environment.
*/
void bhv_purple_switch_loop(void) {
UNUSED s32 unused;
switch (o->oAction) {
/**
* Set the switch's model and scale. If Mario is standing near the
* switch's middle section, transition to the pressed state.
*/
case PURPLE_SWITCH_IDLE:
cur_obj_set_model(MODEL_PURPLE_SWITCH);
cur_obj_scale(1.5f);
if (gMarioObject->platform == o && !(gMarioStates->action & MARIO_UNKNOWN_13)) {
if (lateral_dist_between_objects(o, gMarioObject) < 127.5) {
o->oAction = PURPLE_SWITCH_PRESSED;
}
}
break;
/**
* Collapse the switch downward, play a sound, and shake the screen.
* Immediately transition to the ticking state.
*/
case PURPLE_SWITCH_PRESSED:
cur_obj_scale_over_time(2, 3, 1.5f, 0.2f);
if (o->oTimer == 3) {
cur_obj_play_sound_2(SOUND_GENERAL2_PURPLE_SWITCH);
o->oAction = PURPLE_SWITCH_TICKING;
cur_obj_shake_screen(SHAKE_POS_SMALL);
#ifdef VERSION_SH
queue_rumble_data(5, 80);
#endif
}
break;
/**
* Play a continuous ticking sound that gets faster when time is almost
* up. When time is up, move to a waiting-while-pressed state.
*/
case PURPLE_SWITCH_TICKING:
if (o->oBehParams2ndByte != 0) {
if (o->oBehParams2ndByte == 1 && gMarioObject->platform != o) {
o->oAction++;
} else {
if (o->oTimer < 360) {
play_sound(SOUND_GENERAL2_SWITCH_TICK_FAST, gDefaultSoundArgs);
} else {
play_sound(SOUND_GENERAL2_SWITCH_TICK_SLOW, gDefaultSoundArgs);
}
if (o->oTimer > 400) {
o->oAction = PURPLE_SWITCH_WAIT_FOR_MARIO_TO_GET_OFF;
}
}
}
break;
/**
* Make the switch look unpressed again, and transition back to the
* idle state.
*/
case PURPLE_SWITCH_UNPRESSED:
cur_obj_scale_over_time(2, 3, 0.2f, 1.5f);
if (o->oTimer == 3) {
o->oAction = PURPLE_SWITCH_IDLE;
}
break;
/**
* Mario is standing on the switch, but time has expired. Wait for
* him to get off the switch, and when he does so, transition to the
* unpressed state.
*/
case PURPLE_SWITCH_WAIT_FOR_MARIO_TO_GET_OFF:
if (!cur_obj_is_mario_on_platform()) {
o->oAction = PURPLE_SWITCH_UNPRESSED;
}
break;
}
}