Improved follower pokemon animation code.

This commit is contained in:
Ariel A 2022-12-27 15:28:52 -05:00
parent beb282a359
commit a59564fc1e
5 changed files with 10 additions and 12 deletions

View file

@ -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));

View file

@ -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,10 +6652,12 @@ 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);
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);
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;
@ -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);

View file

@ -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);
}

View file

@ -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);

View file

@ -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;