Document disguise field effects

This commit is contained in:
GriffinR 2021-04-06 14:51:39 -04:00
parent 756fad0e61
commit 8bad478b49
3 changed files with 48 additions and 42 deletions

View File

@ -17,8 +17,8 @@ u8 StartUnderwaterSurfBlobBobbing(u8 oldSpriteId);
void SetSurfBlob_BobState(u8 spriteId, u8 state); void SetSurfBlob_BobState(u8 spriteId, u8 state);
void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 dontSync); void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 dontSync);
void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset); void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset);
bool8 sub_8155DA0(struct ObjectEvent *); bool8 UpdateRevealDisguise(struct ObjectEvent *);
void sub_8155D78(struct ObjectEvent *); void StartRevealDisguise(struct ObjectEvent *);
void StartAshFieldEffect(s16, s16, u16, s16); void StartAshFieldEffect(s16, s16, u16, s16);
void SetUpReflection(struct ObjectEvent*, struct Sprite*, u8); void SetUpReflection(struct ObjectEvent*, struct Sprite*, u8);
u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*); u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*);

View File

@ -4396,10 +4396,9 @@ movement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerI
bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER)
{
return FALSE; return FALSE;
}
return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass); return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass);
} }
@ -6577,14 +6576,14 @@ bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *objectEvent, struct
sprite->sActionFuncId = 2; sprite->sActionFuncId = 2;
return TRUE; return TRUE;
} }
sub_8155D78(objectEvent); StartRevealDisguise(objectEvent);
sprite->sActionFuncId = 1; sprite->sActionFuncId = 1;
return MovementAction_RevealTrainer_Step1(objectEvent, sprite); return MovementAction_RevealTrainer_Step1(objectEvent, sprite);
} }
bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if (sub_8155DA0(objectEvent)) if (UpdateRevealDisguise(objectEvent))
{ {
sprite->sActionFuncId = 2; sprite->sActionFuncId = 2;
return TRUE; return TRUE;

View File

@ -32,6 +32,9 @@ static void UpdateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sp
static void SpriteCB_UnderwaterSurfBlob(struct Sprite *); static void SpriteCB_UnderwaterSurfBlob(struct Sprite *);
static u32 ShowDisguiseFieldEffect(u8, u8, u8); static u32 ShowDisguiseFieldEffect(u8, u8, u8);
// Used by several field effects to determine which of a group it is
#define sFldEff data[1]
#define sReflectionObjEventId data[0] #define sReflectionObjEventId data[0]
#define sReflectionObjEventLocalId data[1] #define sReflectionObjEventLocalId data[1]
#define sReflectionVerticalOffset data[2] #define sReflectionVerticalOffset data[2]
@ -360,9 +363,6 @@ void UpdateTallGrassFieldEffect(struct Sprite *sprite)
} }
} }
// Sprite data for FLDEFF_JUMP_TALL_GRASS and FLDEFF_JUMP_LONG_GRASS
#define sFldEff data[1]
u32 FldEff_JumpTallGrass(void) u32 FldEff_JumpTallGrass(void)
{ {
u8 spriteId; u8 spriteId;
@ -1301,6 +1301,13 @@ u32 FldEff_BerryTreeGrowthSparkle(void)
return 0; return 0;
} }
// Sprite data for FLDEFF_TREE_DISGUISE / FLDEFF_MOUNTAIN_DISGUISE / FLDEFF_SAND_DISGUISE
#define sState data[0]
#define sLocalId data[2]
#define sMapNum data[3]
#define sMapGroup data[4]
#define sReadyToEnd data[7]
u32 ShowTreeDisguiseFieldEffect(void) u32 ShowTreeDisguiseFieldEffect(void)
{ {
return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, FLDEFFOBJ_TREE_DISGUISE, 4); return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, FLDEFFOBJ_TREE_DISGUISE, 4);
@ -1332,10 +1339,10 @@ static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 fldEffObj, u8 paletteNum)
sprite = &gSprites[spriteId]; sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled ++; sprite->coordOffsetEnabled ++;
sprite->oam.paletteNum = paletteNum; sprite->oam.paletteNum = paletteNum;
sprite->data[1] = fldEff; sprite->sFldEff = fldEff;
sprite->data[2] = gFieldEffectArguments[0]; sprite->sLocalId = gFieldEffectArguments[0];
sprite->data[3] = gFieldEffectArguments[1]; sprite->sMapNum = gFieldEffectArguments[1];
sprite->data[4] = gFieldEffectArguments[2]; sprite->sMapGroup = gFieldEffectArguments[2];
} }
return spriteId; return spriteId;
} }
@ -1346,10 +1353,8 @@ void UpdateDisguiseFieldEffect(struct Sprite *sprite)
const struct ObjectEventGraphicsInfo *graphicsInfo; const struct ObjectEventGraphicsInfo *graphicsInfo;
struct Sprite *linkedSprite; struct Sprite *linkedSprite;
if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &objectEventId)) if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId))
{ FieldEffectStop(sprite, sprite->sFldEff);
FieldEffectStop(sprite, sprite->data[1]);
}
graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];
@ -1357,51 +1362,56 @@ void UpdateDisguiseFieldEffect(struct Sprite *sprite)
sprite->pos1.x = linkedSprite->pos1.x; sprite->pos1.x = linkedSprite->pos1.x;
sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16; sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16;
sprite->subpriority = linkedSprite->subpriority - 1; sprite->subpriority = linkedSprite->subpriority - 1;
if (sprite->data[0] == 1)
if (sprite->sState == 1)
{ {
sprite->data[0] ++; sprite->sState++;
StartSpriteAnim(sprite, 1); StartSpriteAnim(sprite, 1);
} }
if (sprite->data[0] == 2 && sprite->animEnded)
{ if (sprite->sState == 2 && sprite->animEnded)
sprite->data[7] = 1; sprite->sReadyToEnd = TRUE;
}
if (sprite->data[0] == 3) if (sprite->sState == 3)
{ FieldEffectStop(sprite, sprite->sFldEff);
FieldEffectStop(sprite, sprite->data[1]);
}
} }
void sub_8155D78(struct ObjectEvent *objectEvent) void StartRevealDisguise(struct ObjectEvent *objectEvent)
{ {
if (objectEvent->directionSequenceIndex == 1) if (objectEvent->directionSequenceIndex == 1)
{ gSprites[objectEvent->fieldEffectSpriteId].sState++;
gSprites[objectEvent->fieldEffectSpriteId].data[0]++;
}
} }
bool8 sub_8155DA0(struct ObjectEvent *objectEvent) bool8 UpdateRevealDisguise(struct ObjectEvent *objectEvent)
{ {
struct Sprite *sprite; struct Sprite *sprite;
if (objectEvent->directionSequenceIndex == 2) if (objectEvent->directionSequenceIndex == 2)
{
return TRUE; return TRUE;
}
if (objectEvent->directionSequenceIndex == 0) if (objectEvent->directionSequenceIndex == 0)
{
return TRUE; return TRUE;
}
sprite = &gSprites[objectEvent->fieldEffectSpriteId]; sprite = &gSprites[objectEvent->fieldEffectSpriteId];
if (sprite->data[7]) if (sprite->sReadyToEnd)
{ {
objectEvent->directionSequenceIndex = 2; objectEvent->directionSequenceIndex = 2;
sprite->data[0]++; sprite->sState++;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
#undef sState
#undef sLocalId
#undef sMapNum
#undef sMapGroup
#undef sReadyToEnd
// Sprite data for FLDEFF_SPARKLE
#define sFinished data[0]
#define sEndTimer data[1]
u32 FldEff_Sparkle(void) u32 FldEff_Sparkle(void)
{ {
u8 spriteId; u8 spriteId;
@ -1418,9 +1428,6 @@ u32 FldEff_Sparkle(void)
return 0; return 0;
} }
#define sFinished data[0]
#define sEndTimer data[1]
void UpdateSparkleFieldEffect(struct Sprite *sprite) void UpdateSparkleFieldEffect(struct Sprite *sprite)
{ {
if (!sprite->sFinished) if (!sprite->sFinished)