feat: added OW_MON_WANDER_WALK config option

This commit is contained in:
Ariel A 2024-09-01 17:15:29 -04:00
parent 839cf2e790
commit 42d9f24c84
4 changed files with 37 additions and 37 deletions

View file

@ -293,6 +293,9 @@
// If true, follower pokemon will bob up and down
// during their idle & walking animations
#define OW_MON_BOBBING TRUE
// If true, OW pokemon with `MOVEMENT_TYPE_WANDER*`
// will walk-in-place in between steps
#define OW_MON_WANDER_WALK TRUE
// If true, adds a small amount of overhead
// to OW code so that large (48x48, 64x64) OWs

View file

@ -295,7 +295,7 @@ u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority);
u8 MovementType_WanderAround_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderAround_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderAround_Step2(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderAround_Step3(struct ObjectEvent *, struct Sprite *);
u8 MovementType_Wander_Step3(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderAround_Step4(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderAround_Step5(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderAround_Step6(struct ObjectEvent *, struct Sprite *);
@ -318,14 +318,12 @@ u8 MovementType_LookAround_Step4(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *, struct Sprite *);
u8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *, struct Sprite *);

View file

@ -2,7 +2,7 @@ u8 (*const gMovementTypeFuncs_WanderAround[])(struct ObjectEvent *, struct Sprit
MovementType_WanderAround_Step0,
MovementType_WanderAround_Step1,
MovementType_WanderAround_Step2,
MovementType_WanderAround_Step3,
MovementType_Wander_Step3,
MovementType_WanderAround_Step4,
MovementType_WanderAround_Step5,
MovementType_WanderAround_Step6,
@ -36,7 +36,7 @@ u8 (*const gMovementTypeFuncs_WanderUpAndDown[])(struct ObjectEvent *, struct Sp
MovementType_WanderUpAndDown_Step0,
MovementType_WanderUpAndDown_Step1,
MovementType_WanderUpAndDown_Step2,
MovementType_WanderUpAndDown_Step3,
MovementType_Wander_Step3,
MovementType_WanderUpAndDown_Step4,
MovementType_WanderUpAndDown_Step5,
MovementType_WanderUpAndDown_Step6,
@ -48,7 +48,7 @@ u8 (*const gMovementTypeFuncs_WanderLeftAndRight[])(struct ObjectEvent *, struct
MovementType_WanderLeftAndRight_Step0,
MovementType_WanderLeftAndRight_Step1,
MovementType_WanderLeftAndRight_Step2,
MovementType_WanderLeftAndRight_Step3,
MovementType_Wander_Step3,
MovementType_WanderLeftAndRight_Step4,
MovementType_WanderLeftAndRight_Step5,
MovementType_WanderLeftAndRight_Step6,

View file

@ -103,6 +103,7 @@ static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0};
static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16);
static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *);
static bool32 UpdateMonMoveInPlace(struct ObjectEvent *, struct Sprite *);
static void SetMovementDelay(struct Sprite *, s16);
static bool8 WaitForMovementDelay(struct Sprite *);
static u8 GetCollisionInDirection(struct ObjectEvent *, u8);
@ -3436,12 +3437,20 @@ bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sp
return TRUE;
}
bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)
// common; used by all MovementType_Wander*_Step3
bool8 MovementType_Wander_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (WaitForMovementDelay(sprite))
{
// resets a mid-movement sprite
ClearObjectEventMovement(objectEvent, sprite);
sprite->sTypeFuncId = 4;
return TRUE;
} else if (
OW_MON_WANDER_WALK == TRUE
&& IS_OW_MON_OBJ(objectEvent))
{
UpdateMonMoveInPlace(objectEvent, sprite);
}
return FALSE;
}
@ -3768,16 +3777,6 @@ bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct
return TRUE;
}
bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (WaitForMovementDelay(sprite))
{
sprite->sTypeFuncId = 4;
return TRUE;
}
return FALSE;
}
bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
u8 direction;
@ -3836,16 +3835,6 @@ bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, str
return TRUE;
}
bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (WaitForMovementDelay(sprite))
{
sprite->sTypeFuncId = 4;
return TRUE;
}
return FALSE;
}
bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
u8 direction;
@ -5328,19 +5317,27 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S
return FALSE;
}
bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
{
// single function for updating an OW mon's walk-in-place movements
static bool32 UpdateMonMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
if (!objectEvent->singleMovementActive) {
// walk in place
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection));
sprite->sTypeFuncId = 1;
objectEvent->singleMovementActive = TRUE;
return TRUE;
ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection));
objectEvent->singleMovementActive = TRUE;
return TRUE;
} else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) {
// finish movement action
objectEvent->singleMovementActive = FALSE;
} else if (OW_MON_BOBBING == TRUE && (sprite->data[3] & 7) == 2)
sprite->y2 ^= -1;
return FALSE;
}
bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8))
{
if (UpdateMonMoveInPlace(objectEvent, sprite)) {
sprite->sTypeFuncId = 1;
return TRUE;
}
UpdateFollowerTransformEffect(objectEvent, sprite);
return FALSE;
}
@ -5611,7 +5608,7 @@ bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Spr
{
if (ObjectEventExecSingleMovementAction(objectEvent, sprite))
sprite->sTypeFuncId = 0;
// similar to FollowablePlayerMovement_Idle
// similar to UpdateMonMoveInPlace
else if (
OW_MON_BOBBING == TRUE
&& IS_OW_MON_OBJ(objectEvent)
@ -10058,14 +10055,16 @@ static u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite)
static void SetMovementDelay(struct Sprite *sprite, s16 timer)
{
sprite->data[3] = timer;
sprite->data[3] = timer; // kept for legacy reasons
sprite->data[7] = timer; // actual timer
}
static bool8 WaitForMovementDelay(struct Sprite *sprite)
{
if (--sprite->data[3] == 0)
if (--sprite->data[7] == 0) {
sprite->data[3] = 0; // reset animation timer
return TRUE;
else
} else
return FALSE;
}