Merge branch 'followers' into followers-expanded-id

This commit is contained in:
Ariel A 2023-07-29 17:26:31 -04:00
commit 394b4cb3a5
3 changed files with 43 additions and 20 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View file

@ -283,6 +283,10 @@
#define OW_SPECIES(x) (((x)->graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE)
#define OW_FORM(x) ((x)->graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS)
// If true, follower pokemon will bob up and down
// during their idle & walking animations
#define OW_MON_BOBBING TRUE
#define SHADOW_SIZE_S 0
#define SHADOW_SIZE_M 1
#define SHADOW_SIZE_L 2

View file

@ -4993,19 +4993,17 @@ bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct S
bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (gPlayerAvatar.tileTransitionState == T_NOT_MOVING && !gObjectEvents[gPlayerAvatar.objectEventId].heldMovementActive ) { // do nothing if player is stationary
return FALSE;
} else if (!IsFollowerVisible()) {
if (objectEvent->invisible) { // Return to shadowing state
sprite->sTypeFuncId = 0;
return FALSE;
}
// Animate entering pokeball
ClearObjectEventMovement(objectEvent, sprite);
ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_ENTER_POKEBALL);
objectEvent->singleMovementActive = 1;
sprite->sTypeFuncId = 2; // movement action sets state to 0
return TRUE;
if (!IsFollowerVisible()) {
if (objectEvent->invisible) { // Return to shadowing state
sprite->sTypeFuncId = 0;
return FALSE;
}
// Animate entering pokeball
ClearObjectEventMovement(objectEvent, sprite);
ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_ENTER_POKEBALL);
objectEvent->singleMovementActive = 1;
sprite->sTypeFuncId = 2; // movement action sets state to 0
return TRUE;
}
// TODO: Remove dependence on PlayerGetCopyableMovement
return gFollowPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL);
@ -5025,23 +5023,33 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S
if (sprite->sTypeFuncId) { // restore nonzero state
sprite->sTypeFuncId = 1;
}
} else if (objectEvent->movementActionId != MOVEMENT_ACTION_EXIT_POKEBALL) {
} else if (objectEvent->movementActionId < MOVEMENT_ACTION_EXIT_POKEBALL) {
UpdateFollowerTransformEffect(objectEvent, sprite);
#if OW_MON_BOBBING == TRUE
if ((sprite->data[5] & 7) == 2)
sprite->y2 ^= -1;
#endif
}
return FALSE;
}
bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
{
u8 direction;
if (!objectEvent->singleMovementActive) { // walk in place
if (!objectEvent->singleMovementActive)
{ // walk in place
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection));
sprite->sTypeFuncId = 1;
objectEvent->singleMovementActive = 1;
return TRUE;
} else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { // finish movement action
}
else if (ObjectEventExecSingleMovementAction(objectEvent, sprite))
{ // finish movement action
objectEvent->singleMovementActive = 0;
}
#if OW_MON_BOBBING == TRUE
else if ((sprite->data[3] & 7) == 2)
sprite->y2 ^= -1;
#endif
UpdateFollowerTransformEffect(objectEvent, sprite);
return FALSE;
}
@ -5054,7 +5062,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
s16 targetX;
s16 targetY;
#ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE
u8 playerAction = gObjectEvents[gPlayerAvatar.objectEventId].movementActionId;
u32 playerAction = gObjectEvents[gPlayerAvatar.objectEventId].movementActionId;
#endif
targetX = gObjectEvents[gPlayerAvatar.objectEventId].previousCoords.x;
@ -5079,6 +5087,9 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL);
objectEvent->singleMovementActive = 1;
sprite->sTypeFuncId = 2;
#if OW_MON_BOBBING == TRUE
sprite->y2 = 0;
#endif
return TRUE;
} else if (x == targetX && y == targetY) { // don't move if already in the player's last position
return FALSE;
@ -5102,8 +5113,12 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
} else {
if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT)
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction));
else
else {
objectEvent->movementActionId = GetWalkNormalMovementAction(direction);
#if OW_MON_BOBBING == TRUE
sprite->y2 = -1;
#endif
}
}
sprite->sActionFuncId = 0;
#else
@ -5114,8 +5129,12 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri
// If *player* jumps, make step take twice as long
else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2)
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction));
else
else {
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction));
#if OW_MON_BOBBING == TRUE
sprite->y2 = -1;
#endif
}
#endif
objectEvent->singleMovementActive = 1;
sprite->sTypeFuncId = 2;