fix: improved follower pokemon lock and applymovement code

fixed #30, fixed #32
This commit is contained in:
Ariel A 2024-04-27 23:15:49 -04:00
parent d7a021a914
commit dbc11ad3d2

View File

@ -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 // 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) { if (localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) {
ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); 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); ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript);
sMovingNpcId = localId; sMovingNpcId = localId;
objEvent = GetFollowerObject();
// Force follower into pokeball // Force follower into pokeball
if (localId != OBJ_EVENT_ID_FOLLOWER if (localId != OBJ_EVENT_ID_FOLLOWER
&& !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT) && !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]); 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); ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement);
} }
return FALSE; 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. // The player and selected object are frozen after waiting for their current movement to finish.
bool8 ScrCmd_lock(struct ScriptContext *ctx) bool8 ScrCmd_lock(struct ScriptContext *ctx)
{ {
@ -1256,16 +1256,22 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx)
} }
else else
{ {
struct ObjectEvent *followerObj = GetFollowerObject();
if (gObjectEvents[gSelectedObjectEvent].active) if (gObjectEvents[gSelectedObjectEvent].active)
{ {
FreezeObjects_WaitForPlayerAndSelected(); FreezeObjects_WaitForPlayerAndSelected();
SetupNativeScript(ctx, IsFreezeSelectedObjectAndPlayerFinished); SetupNativeScript(ctx, IsFreezeSelectedObjectAndPlayerFinished);
// follower is being talked to; keep it frozen
if (gObjectEvents[gSelectedObjectEvent].localId == OBJ_EVENT_ID_FOLLOWER)
followerObj = NULL;
} }
else else
{ {
FreezeObjects_WaitForPlayer(); FreezeObjects_WaitForPlayer();
SetupNativeScript(ctx, IsFreezePlayerFinished); SetupNativeScript(ctx, IsFreezePlayerFinished);
} }
if (followerObj) // Unfreeze follower object
UnfreezeObjectEvent(followerObj);
return TRUE; return TRUE;
} }
} }