Prevent multiple star/key unlock animations on the same door

This commit is contained in:
MysterD 2020-10-04 23:23:17 -07:00
parent e9761cd3e6
commit 53f7a36819
1 changed files with 21 additions and 0 deletions

View File

@ -998,12 +998,30 @@ u32 display_door_dialog(struct MarioState *m, u32 actionArg) {
return set_mario_action(m, ACT_READING_AUTOMATIC_DIALOG, actionArg);
}
u8 prevent_interact_door(struct MarioState* m, struct Object* o) {
// prevent multiple star/key unlocks on the same door
for (int i = 0; i < MAX_PLAYERS; i++) {
struct MarioState* m2 = &gMarioStates[i];
if (m2 == m) { continue; }
if (!is_player_active(m2)) { continue; }
Vec3f diff = { 0 };
vec3f_dif(diff, m->pos, m2->pos);
if (vec3f_length(diff) > 200 && m2->usedObj != o) { continue; }
if (m2->action == ACT_UNLOCKING_STAR_DOOR || m2->action == ACT_UNLOCKING_KEY_DOOR) {
return TRUE;
}
}
return FALSE;
}
u32 interact_warp_door(struct MarioState *m, UNUSED u32 interactType, struct Object *o) {
u32 doorAction = 0;
u32 saveFlags = save_file_get_flags();
s16 warpDoorId = o->oBehParams >> 24;
u32 actionArg;
if (prevent_interact_door(m, o)) { return FALSE; }
if (m->action == ACT_WALKING || m->action == ACT_DECELERATING) {
if (warpDoorId == 1 && !(saveFlags & SAVE_FLAG_UNLOCKED_UPSTAIRS_DOOR)) {
if (!(saveFlags & SAVE_FLAG_HAVE_KEY_2)) {
@ -1095,6 +1113,9 @@ u32 interact_door(struct MarioState *m, UNUSED u32 interactType, struct Object *
if (o->oAction != 0) { return FALSE; }
// prevent interacting with the same door as someone unlocking it
if (prevent_interact_door(m, o)) { return FALSE; }
if (m->action == ACT_WALKING || m->action == ACT_DECELERATING) {
if (numStars >= requiredNumStars) {
u32 actionArg = should_push_or_pull_door(m, o);