From a59564fc1ea11ed59d81c71ec654630e335bbb2c Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Tue, 27 Dec 2022 15:28:52 -0500 Subject: [PATCH] Improved follower pokemon animation code. --- include/event_object_movement.h | 1 + src/event_object_movement.c | 15 ++++++++------- src/field_effect.c | 1 - src/field_screen_effect.c | 1 - src/scrcmd.c | 4 +--- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 4cfff28ccc..f2383272fc 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -439,6 +439,7 @@ bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *, struct Sprite *, u8, boo u8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *, struct Sprite *); u8 MovementType_FollowPlayer_Active(struct ObjectEvent *, struct Sprite *); u8 MovementType_FollowPlayer_Moving(struct ObjectEvent *, struct Sprite *); +void StartSpriteAnimInDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum); bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); bool8 FollowablePlayerMovement_FaceDirection(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f29f7c10ea..265918d653 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -4981,7 +4981,6 @@ bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct S ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_ENTER_POKEBALL); objectEvent->singleMovementActive = 1; - sprite->animCmdIndex = 0; // Needed for animCmdIndex weirdness sprite->sTypeFuncId = 2; // movement action sets state to 0 return TRUE; } @@ -5051,7 +5050,6 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri MoveObjectEventToMapCoords(objectEvent, targetX, targetY); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); objectEvent->singleMovementActive = 1; - sprite->animCmdIndex = 0; // Needed because of weird animCmdIndex stuff sprite->sTypeFuncId = 2; return TRUE; } else if (x == targetX && y == targetY) { // don't move if already in the player's last position @@ -6654,11 +6652,13 @@ bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct u8 direction = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; objectEvent->invisible = FALSE; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // If player is dashing, the pokemon must come out faster - InitMoveInPlace(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction) + 4, 8); - sprite->data[6] = 0; // fast speed + StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction) + 4); + sprite->data[3] = 8; // duration + sprite->data[6] = 0; // fast speed } else { - InitMoveInPlace(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction), 16); - sprite->data[6] = 1; // slow speed + StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction)); + sprite->data[3] = 16; // duration + sprite->data[6] = 1; // slow speed } sprite->data[6] |= (direction == DIR_EAST ? 1 : 0) << 4; ObjectEventSetGraphicsId(objectEvent, OBJ_EVENT_GFX_ANIMATED_BALL); @@ -6741,7 +6741,8 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_EnterPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction = objectEvent->facingDirection; - InitMoveInPlace(objectEvent, sprite, direction, GetMoveDirectionFasterAnimNum(direction), 16); + StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFasterAnimNum(direction)); + sprite->data[3] = 16; // duration sprite->data[6] = direction == DIR_EAST ? 3 : 2; // affine animation number EndFollowerTransformEffect(objectEvent, sprite); return MovementAction_EnterPokeball_Step1(objectEvent, sprite); diff --git a/src/field_effect.c b/src/field_effect.c index 4dfb981477..9980a0559c 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1567,7 +1567,6 @@ static void HideFollowerForFieldEffect(void) { if (!followerObj || followerObj->invisible) return; ClearObjectEventMovement(followerObj, &gSprites[followerObj->spriteId]); - gSprites[followerObj->spriteId].animCmdIndex = 0; // Avoids a visual glitch with follower's animation frame ObjectEventSetHeldMovement(followerObj, MOVEMENT_ACTION_ENTER_POKEBALL); } diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index a47ff7fd7f..dd7ca79064 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -689,7 +689,6 @@ static void Task_DoDoorWarp(u8 taskId) PlaySE(GetDoorSoundEffect(*x, *y - 1)); if (followerObject) { // Put follower into pokeball ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]); - gSprites[followerObject->spriteId].animCmdIndex = 0; // Needed because of weird animCmdIndex stuff ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL); } task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); diff --git a/src/scrcmd.c b/src/scrcmd.c index c7d881e216..8e278bb153 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1013,11 +1013,9 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) { // Force follower into pokeball objEvent = GetFollowerObject(); // return early if no follower or in shadowing state - if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) { + if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) return FALSE; - } ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); - gSprites[objEvent->spriteId].animCmdIndex = 0; // Needed to set start frame of animation ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement); } return FALSE;