From dbc11ad3d2028702c12d9677b74b0946292d7189 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:15:49 -0400 Subject: [PATCH] fix: improved follower pokemon `lock` and `applymovement` code fixed #30, fixed #32 --- src/scrcmd.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/scrcmd.c b/src/scrcmd.c index 3b4ad9ddd6..d29df1748d 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1006,20 +1006,20 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) // When applying script movements to follower, it may have frozen animation that must be cleared if (localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) { ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); - gSprites[objEvent->spriteId].animCmdIndex = 0; // Needed to set start frame of animation + gSprites[objEvent->spriteId].animCmdIndex = 0; // Reset start frame of animation } ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; + objEvent = GetFollowerObject(); // Force follower into pokeball if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT) - && (movementScript < Common_Movement_FollowerSafeStart || movementScript > Common_Movement_FollowerSafeEnd)) + && (movementScript < Common_Movement_FollowerSafeStart || movementScript > Common_Movement_FollowerSafeEnd) + && (objEvent = GetFollowerObject()) + && !objEvent->invisible) { - objEvent = GetFollowerObject(); - // return early if no follower or in shadowing state - if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) - return FALSE; ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); + gSprites[objEvent->spriteId].animCmdIndex = 0; // Reset start frame of animation ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement); } return FALSE; @@ -1246,7 +1246,7 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx) } } -// lock freezes all object events except the player and the selected object immediately. +// lock freezes all object events except the player, follower, and the selected object immediately. // The player and selected object are frozen after waiting for their current movement to finish. bool8 ScrCmd_lock(struct ScriptContext *ctx) { @@ -1256,16 +1256,22 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx) } else { + struct ObjectEvent *followerObj = GetFollowerObject(); if (gObjectEvents[gSelectedObjectEvent].active) { FreezeObjects_WaitForPlayerAndSelected(); SetupNativeScript(ctx, IsFreezeSelectedObjectAndPlayerFinished); + // follower is being talked to; keep it frozen + if (gObjectEvents[gSelectedObjectEvent].localId == OBJ_EVENT_ID_FOLLOWER) + followerObj = NULL; } else { FreezeObjects_WaitForPlayer(); SetupNativeScript(ctx, IsFreezePlayerFinished); } + if (followerObj) // Unfreeze follower object + UnfreezeObjectEvent(followerObj); return TRUE; } }