summaryrefslogtreecommitdiff
path: root/src/field_effect_helpers.c
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2021-07-31 13:30:40 -0400
committerGitHub <noreply@github.com>2021-07-31 13:30:40 -0400
commit3e60a7840653e50845abf10bb02cd1b519dcd80f (patch)
treecb4a0d227a238ebdeb3b6cb9fdb92781bcc4f5e7 /src/field_effect_helpers.c
parent602855ea99d8015ef5b7709f6fb1e9fd167239e2 (diff)
parentd391486247cc9f29d85787d6711f7cb993cf6585 (diff)
Merge branch 'master' into doc-frontierpass2
Diffstat (limited to 'src/field_effect_helpers.c')
-rwxr-xr-xsrc/field_effect_helpers.c599
1 files changed, 344 insertions, 255 deletions
diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c
index 67102a83b..eab7d85ef 100755
--- a/src/field_effect_helpers.c
+++ b/src/field_effect_helpers.c
@@ -19,19 +19,22 @@ static void UpdateObjectReflectionSprite(struct Sprite *);
static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct Sprite *sprite);
static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *, u8);
static void LoadObjectRegularReflectionPalette(struct ObjectEvent *, u8);
-static void sub_81561FC(struct Sprite *, u8, u8);
+static void UpdateGrassFieldEffectSubpriority(struct Sprite *, u8, u8);
static void FadeFootprintsTireTracks_Step0(struct Sprite *);
static void FadeFootprintsTireTracks_Step1(struct Sprite *);
static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *);
-static void UpdateAshFieldEffect_Step0(struct Sprite *);
-static void UpdateAshFieldEffect_Step1(struct Sprite *);
-static void UpdateAshFieldEffect_Step2(struct Sprite *);
+static void UpdateAshFieldEffect_Wait(struct Sprite *);
+static void UpdateAshFieldEffect_Show(struct Sprite *);
+static void UpdateAshFieldEffect_End(struct Sprite *);
static void SynchroniseSurfAnim(struct ObjectEvent *, struct Sprite *);
-static void sub_81556E8(struct ObjectEvent *, struct Sprite *);
-static void CreateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *);
-static void sub_8155850(struct Sprite *);
+static void SynchroniseSurfPosition(struct ObjectEvent *, struct Sprite *);
+static void UpdateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *);
+static void SpriteCB_UnderwaterSurfBlob(struct Sprite *);
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 sReflectionObjEventLocalId data[1]
#define sReflectionVerticalOffset data[2]
@@ -41,7 +44,7 @@ void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, boo
{
struct Sprite *reflectionSprite;
- reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->pos1.x, sprite->pos1.y, 0x98)];
+ reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->x, sprite->y, 0x98)];
reflectionSprite->callback = UpdateObjectReflectionSprite;
reflectionSprite->oam.priority = 3;
reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[reflectionSprite->oam.paletteNum];
@@ -139,12 +142,12 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite)
reflectionSprite->subspriteTables = mainSprite->subspriteTables;
reflectionSprite->subspriteTableNum = mainSprite->subspriteTableNum;
reflectionSprite->invisible = mainSprite->invisible;
- reflectionSprite->pos1.x = mainSprite->pos1.x;
- reflectionSprite->pos1.y = mainSprite->pos1.y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->sReflectionVerticalOffset;
+ reflectionSprite->x = mainSprite->x;
+ reflectionSprite->y = mainSprite->y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->sReflectionVerticalOffset;
reflectionSprite->centerToCornerVecX = mainSprite->centerToCornerVecX;
reflectionSprite->centerToCornerVecY = mainSprite->centerToCornerVecY;
- reflectionSprite->pos2.x = mainSprite->pos2.x;
- reflectionSprite->pos2.y = -mainSprite->pos2.y;
+ reflectionSprite->x2 = mainSprite->x2;
+ reflectionSprite->y2 = -mainSprite->y2;
reflectionSprite->coordOffsetEnabled = mainSprite->coordOffsetEnabled;
if (objectEvent->hideReflection == TRUE)
@@ -201,8 +204,8 @@ void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y)
{
SetSpritePosToMapCoords(x, y, &x2, &y2);
sprite = &gSprites[spriteId];
- sprite->pos1.x = x2 + 8;
- sprite->pos1.y = y2 + 8;
+ sprite->x = x2 + 8;
+ sprite->y = y2 + 8;
sprite->invisible = FALSE;
sprite->data[0] = x;
sprite->data[1] = y;
@@ -259,8 +262,8 @@ void UpdateShadowFieldEffect(struct Sprite *sprite)
objectEvent = &gObjectEvents[objectEventId];
linkedSprite = &gSprites[objectEvent->spriteId];
sprite->oam.priority = linkedSprite->oam.priority;
- sprite->pos1.x = linkedSprite->pos1.x;
- sprite->pos1.y = linkedSprite->pos1.y + sprite->data[3];
+ sprite->x = linkedSprite->x;
+ sprite->y = linkedSprite->y + sprite->data[3];
if (!objectEvent->active || !objectEvent->hasShadow
|| MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior)
|| MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior)
@@ -273,6 +276,16 @@ void UpdateShadowFieldEffect(struct Sprite *sprite)
}
}
+// Sprite data for FLDEFF_TALL_GRASS and FLDEFF_LONG_GRASS
+#define sElevation data[0]
+#define sX data[1]
+#define sY data[2]
+#define sMapNum data[3] // Lower 8 bits
+#define sLocalId data[3] >> 8 // Upper 8 bits
+#define sMapGroup data[4]
+#define sCurrentMap data[5]
+#define sObjectMoved data[7]
+
u32 FldEff_TallGrass(void)
{
s16 x;
@@ -289,16 +302,15 @@ u32 FldEff_TallGrass(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = gFieldEffectArguments[3];
- sprite->data[0] = gFieldEffectArguments[2];
- sprite->data[1] = gFieldEffectArguments[0];
- sprite->data[2] = gFieldEffectArguments[1];
- sprite->data[3] = gFieldEffectArguments[4];
- sprite->data[4] = gFieldEffectArguments[5];
- sprite->data[5] = gFieldEffectArguments[6];
+ sprite->sElevation = gFieldEffectArguments[2];
+ sprite->sX = gFieldEffectArguments[0];
+ sprite->sY = gFieldEffectArguments[1];
+ sprite->sMapNum = gFieldEffectArguments[4]; // Also sLocalId
+ sprite->sMapGroup = gFieldEffectArguments[5];
+ sprite->sCurrentMap = gFieldEffectArguments[6];
+
if (gFieldEffectArguments[7])
- {
- SeekSpriteAnim(sprite, 4);
- }
+ SeekSpriteAnim(sprite, 4); // Skip to end of anim
}
return 0;
}
@@ -312,34 +324,42 @@ void UpdateTallGrassFieldEffect(struct Sprite *sprite)
u8 objectEventId;
struct ObjectEvent *objectEvent;
- mapNum = sprite->data[5] >> 8;
- mapGroup = sprite->data[5];
+ mapNum = sprite->sCurrentMap >> 8;
+ mapGroup = sprite->sCurrentMap;
if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup))
{
- sprite->data[1] -= gCamera.x;
- sprite->data[2] -= gCamera.y;
- sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;
+ sprite->sX -= gCamera.x;
+ sprite->sY -= gCamera.y;
+ sprite->sCurrentMap = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;
}
- localId = sprite->data[3] >> 8;
- mapNum = sprite->data[3];
- mapGroup = sprite->data[4];
- metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);
- if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded))
+ localId = sprite->sLocalId;
+ mapNum = sprite->sMapNum;
+ mapGroup = sprite->sMapGroup;
+ metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->sX, sprite->sY);
+
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)
+ || !MetatileBehavior_IsTallGrass(metatileBehavior)
+ || (sprite->sObjectMoved && sprite->animEnded))
{
FieldEffectStop(sprite, FLDEFF_TALL_GRASS);
}
else
{
+ // Check if the object that triggered the effect has moved away
objectEvent = &gObjectEvents[objectEventId];
- if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2]))
- sprite->data[7] = TRUE;
+ if ((objectEvent->currentCoords.x != sprite->sX
+ || objectEvent->currentCoords.y != sprite->sY)
+ && (objectEvent->previousCoords.x != sprite->sX
+ || objectEvent->previousCoords.y != sprite->sY))
+ sprite->sObjectMoved = TRUE;
+ // Metatile behavior var re-used
metatileBehavior = 0;
if (sprite->animCmdIndex == 0)
metatileBehavior = 4;
- UpdateObjectEventSpriteVisibility(sprite, 0);
- sub_81561FC(sprite, sprite->data[0], metatileBehavior);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
+ UpdateGrassFieldEffectSubpriority(sprite, sprite->sElevation, metatileBehavior);
}
}
@@ -355,8 +375,8 @@ u32 FldEff_JumpTallGrass(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = gFieldEffectArguments[3];
- sprite->data[0] = gFieldEffectArguments[2];
- sprite->data[1] = FLDEFF_JUMP_TALL_GRASS;
+ sprite->sElevation = gFieldEffectArguments[2];
+ sprite->sFldEff = FLDEFF_JUMP_TALL_GRASS;
}
return 0;
}
@@ -371,11 +391,14 @@ u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s
if (gSprites[i].inUse)
{
sprite = &gSprites[i];
- if (sprite->callback == UpdateTallGrassFieldEffect && (x == sprite->data[1] && y == sprite->data[2]) && (localId == (u8)(sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4]))
+ if (sprite->callback == UpdateTallGrassFieldEffect
+ && (x == sprite->sX && y == sprite->sY)
+ && localId == (u8)(sprite->sLocalId)
+ && mapNum == (sprite->sMapNum & 0xFF)
+ && mapGroup == sprite->sMapGroup)
return i;
}
}
-
return MAX_SPRITES;
}
@@ -395,16 +418,15 @@ u32 FldEff_LongGrass(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]);
- sprite->data[0] = gFieldEffectArguments[2];
- sprite->data[1] = gFieldEffectArguments[0];
- sprite->data[2] = gFieldEffectArguments[1];
- sprite->data[3] = gFieldEffectArguments[4];
- sprite->data[4] = gFieldEffectArguments[5];
- sprite->data[5] = gFieldEffectArguments[6];
+ sprite->sElevation = gFieldEffectArguments[2];
+ sprite->sX = gFieldEffectArguments[0];
+ sprite->sY = gFieldEffectArguments[1];
+ sprite->sMapNum = gFieldEffectArguments[4]; // Also sLocalId
+ sprite->sMapGroup = gFieldEffectArguments[5];
+ sprite->sCurrentMap = gFieldEffectArguments[6];
+
if (gFieldEffectArguments[7])
- {
- SeekSpriteAnim(sprite, 6);
- }
+ SeekSpriteAnim(sprite, 6); // Skip to end of anim
}
return 0;
}
@@ -418,34 +440,47 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite)
u8 objectEventId;
struct ObjectEvent *objectEvent;
- mapNum = sprite->data[5] >> 8;
- mapGroup = sprite->data[5];
+ mapNum = sprite->sCurrentMap >> 8;
+ mapGroup = sprite->sCurrentMap;
if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup))
{
- sprite->data[1] -= gCamera.x;
- sprite->data[2] -= gCamera.y;
- sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;
+ sprite->sX -= gCamera.x;
+ sprite->sY -= gCamera.y;
+ sprite->sCurrentMap = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup;
}
- localId = sprite->data[3] >> 8;
- mapNum = sprite->data[3];
- mapGroup = sprite->data[4];
+ localId = sprite->sLocalId;
+ mapNum = sprite->sMapNum;
+ mapGroup = sprite->sMapGroup;
metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);
- if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded))
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)
+ || !MetatileBehavior_IsLongGrass(metatileBehavior)
+ || (sprite->sObjectMoved && sprite->animEnded))
{
FieldEffectStop(sprite, FLDEFF_LONG_GRASS);
}
else
{
+ // Check if the object that triggered the effect has moved away
objectEvent = &gObjectEvents[objectEventId];
- if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2]))
- {
- sprite->data[7] = TRUE;
- }
- UpdateObjectEventSpriteVisibility(sprite, 0);
- sub_81561FC(sprite, sprite->data[0], 0);
+ if ((objectEvent->currentCoords.x != sprite->data[1]
+ || objectEvent->currentCoords.y != sprite->data[2])
+ && (objectEvent->previousCoords.x != sprite->data[1]
+ || objectEvent->previousCoords.y != sprite->data[2]))
+ sprite->sObjectMoved = TRUE;
+
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
+ UpdateGrassFieldEffectSubpriority(sprite, sprite->sElevation, 0);
}
}
+#undef sX
+#undef sY
+#undef sMapNum
+#undef sLocalId
+#undef sMapGroup
+#undef sCurrentMap
+#undef sObjectMoved
+
u32 FldEff_JumpLongGrass(void)
{
u8 spriteId;
@@ -458,8 +493,8 @@ u32 FldEff_JumpLongGrass(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = gFieldEffectArguments[3];
- sprite->data[0] = gFieldEffectArguments[2];
- sprite->data[1] = FLDEFF_JUMP_LONG_GRASS;
+ sprite->sElevation = gFieldEffectArguments[2];
+ sprite->sFldEff = FLDEFF_JUMP_LONG_GRASS;
}
return 0;
}
@@ -482,8 +517,8 @@ u32 FldEff_ShortGrass(void)
sprite->data[0] = gFieldEffectArguments[0];
sprite->data[1] = gFieldEffectArguments[1];
sprite->data[2] = gFieldEffectArguments[2];
- sprite->data[3] = gSprites[objectEvent->spriteId].pos1.x;
- sprite->data[4] = gSprites[objectEvent->spriteId].pos1.y;
+ sprite->data[3] = gSprites[objectEvent->spriteId].x;
+ sprite->data[4] = gSprites[objectEvent->spriteId].y;
}
return 0;
}
@@ -504,8 +539,8 @@ void UpdateShortGrassFieldEffect(struct Sprite *sprite)
{
graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];
- y = linkedSprite->pos1.y;
- x = linkedSprite->pos1.x;
+ y = linkedSprite->y;
+ x = linkedSprite->x;
if (x != sprite->data[3] || y != sprite->data[4])
{
sprite->data[3] = x;
@@ -515,12 +550,12 @@ void UpdateShortGrassFieldEffect(struct Sprite *sprite)
StartSpriteAnim(sprite, 0);
}
}
- sprite->pos1.x = x;
- sprite->pos1.y = y;
- sprite->pos2.y = (graphicsInfo->height >> 1) - 8;
+ sprite->x = x;
+ sprite->y = y;
+ sprite->y2 = (graphicsInfo->height >> 1) - 8;
sprite->subpriority = linkedSprite->subpriority - 1;
sprite->oam.priority = linkedSprite->oam.priority;
- UpdateObjectEventSpriteVisibility(sprite, linkedSprite->invisible);
+ UpdateObjectEventSpriteInvisibility(sprite, linkedSprite->invisible);
}
}
@@ -594,14 +629,14 @@ static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite)
if (++sprite->data[1] > 40)
sprite->data[0] = 1;
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
}
static void FadeFootprintsTireTracks_Step1(struct Sprite *sprite)
{
sprite->invisible ^= 1;
sprite->data[1]++;
- UpdateObjectEventSpriteVisibility(sprite, sprite->invisible);
+ UpdateObjectEventSpriteInvisibility(sprite, sprite->invisible);
if (sprite->data[1] > 56)
{
FieldEffectStop(sprite, sprite->data[7]);
@@ -630,7 +665,7 @@ u32 FldEff_Splash(void)
sprite->data[0] = gFieldEffectArguments[0];
sprite->data[1] = gFieldEffectArguments[1];
sprite->data[2] = gFieldEffectArguments[2];
- sprite->pos2.y = (graphicsInfo->height >> 1) - 4;
+ sprite->y2 = (graphicsInfo->height >> 1) - 4;
PlaySE(SE_PUDDLE);
}
return 0;
@@ -646,9 +681,9 @@ void UpdateSplashFieldEffect(struct Sprite *sprite)
}
else
{
- sprite->pos1.x = gSprites[gObjectEvents[objectEventId].spriteId].pos1.x;
- sprite->pos1.y = gSprites[gObjectEvents[objectEventId].spriteId].pos1.y;
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ sprite->x = gSprites[gObjectEvents[objectEventId].spriteId].x;
+ sprite->y = gSprites[gObjectEvents[objectEventId].spriteId].y;
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
}
}
@@ -711,7 +746,7 @@ u32 FldEff_FeetInFlowingWater(void)
sprite->data[2] = gFieldEffectArguments[2];
sprite->data[3] = -1;
sprite->data[4] = -1;
- sprite->pos2.y = (graphicsInfo->height >> 1) - 4;
+ sprite->y2 = (graphicsInfo->height >> 1) - 4;
StartSpriteAnim(sprite, 1);
}
return 0;
@@ -731,10 +766,10 @@ static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite)
{
objectEvent = &gObjectEvents[objectEventId];
linkedSprite = &gSprites[objectEvent->spriteId];
- sprite->pos1.x = linkedSprite->pos1.x;
- sprite->pos1.y = linkedSprite->pos1.y;
+ sprite->x = linkedSprite->x;
+ sprite->y = linkedSprite->y;
sprite->subpriority = linkedSprite->subpriority;
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
if (objectEvent->currentCoords.x != sprite->data[3] || objectEvent->currentCoords.y != sprite->data[4])
{
sprite->data[3] = objectEvent->currentCoords.x;
@@ -781,8 +816,8 @@ u32 FldEff_HotSpringsWater(void)
sprite->data[0] = gFieldEffectArguments[0];
sprite->data[1] = gFieldEffectArguments[1];
sprite->data[2] = gFieldEffectArguments[2];
- sprite->data[3] = gSprites[objectEvent->spriteId].pos1.x;
- sprite->data[4] = gSprites[objectEvent->spriteId].pos1.y;
+ sprite->data[3] = gSprites[objectEvent->spriteId].x;
+ sprite->data[4] = gSprites[objectEvent->spriteId].y;
}
return 0;
}
@@ -801,10 +836,10 @@ void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite)
{
graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];
- sprite->pos1.x = linkedSprite->pos1.x;
- sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 8;
+ sprite->x = linkedSprite->x;
+ sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 8;
sprite->subpriority = linkedSprite->subpriority - 1;
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
}
}
@@ -876,14 +911,21 @@ u32 FldEff_WaterSurfacing(void)
return 0;
}
-void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 d)
+// Sprite data for FLDEFF_ASH
+#define sState data[0]
+#define sX data[1]
+#define sY data[2]
+#define sMetatileId data[3]
+#define sDelay data[4]
+
+void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 delay)
{
gFieldEffectArguments[0] = x;
gFieldEffectArguments[1] = y;
- gFieldEffectArguments[2] = 0x52;
- gFieldEffectArguments[3] = 1;
+ gFieldEffectArguments[2] = 82; // subpriority
+ gFieldEffectArguments[3] = 1; // priority
gFieldEffectArguments[4] = metatileId;
- gFieldEffectArguments[5] = d;
+ gFieldEffectArguments[5] = delay;
FieldEffectStart(FLDEFF_ASH);
}
@@ -903,50 +945,62 @@ u32 FldEff_Ash(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = gFieldEffectArguments[3];
- sprite->data[1] = gFieldEffectArguments[0];
- sprite->data[2] = gFieldEffectArguments[1];
- sprite->data[3] = gFieldEffectArguments[4];
- sprite->data[4] = gFieldEffectArguments[5];
+ sprite->sX = gFieldEffectArguments[0];
+ sprite->sY = gFieldEffectArguments[1];
+ sprite->sMetatileId = gFieldEffectArguments[4];
+ sprite->sDelay = gFieldEffectArguments[5];
}
return 0;
}
void (*const gAshFieldEffectFuncs[])(struct Sprite *) = {
- UpdateAshFieldEffect_Step0,
- UpdateAshFieldEffect_Step1,
- UpdateAshFieldEffect_Step2
+ UpdateAshFieldEffect_Wait,
+ UpdateAshFieldEffect_Show,
+ UpdateAshFieldEffect_End
};
void UpdateAshFieldEffect(struct Sprite *sprite)
{
- gAshFieldEffectFuncs[sprite->data[0]](sprite);
+ gAshFieldEffectFuncs[sprite->sState](sprite);
}
-static void UpdateAshFieldEffect_Step0(struct Sprite *sprite)
+static void UpdateAshFieldEffect_Wait(struct Sprite *sprite)
{
sprite->invisible = TRUE;
sprite->animPaused = TRUE;
- if (--sprite->data[4] == 0)
- sprite->data[0] = 1;
+ if (--sprite->sDelay == 0)
+ sprite->sState = 1;
}
-static void UpdateAshFieldEffect_Step1(struct Sprite *sprite)
+static void UpdateAshFieldEffect_Show(struct Sprite *sprite)
{
sprite->invisible = FALSE;
sprite->animPaused = FALSE;
- MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]);
- CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]);
+ MapGridSetMetatileIdAt(sprite->sX, sprite->sY, sprite->sMetatileId);
+ CurrentMapDrawMetatileAt(sprite->sX, sprite->sY);
gObjectEvents[gPlayerAvatar.objectEventId].triggerGroundEffectsOnMove = TRUE;
- sprite->data[0] = 2;
+ sprite->sState = 2;
}
-static void UpdateAshFieldEffect_Step2(struct Sprite *sprite)
+static void UpdateAshFieldEffect_End(struct Sprite *sprite)
{
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
if (sprite->animEnded)
FieldEffectStop(sprite, FLDEFF_ASH);
}
+#undef sState
+#undef sX
+#undef sY
+#undef sMetatileId
+#undef sDelay
+
+// Sprite data for FLDEFF_SURF_BLOB
+#define tBitfield data[0]
+#define tPlayerOffset data[1]
+#define tPlayerObjId data[2]
+
+
u32 FldEff_SurfBlob(void)
{
u8 spriteId;
@@ -954,12 +1008,12 @@ u32 FldEff_SurfBlob(void)
SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SURF_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96);
- if (spriteId !=MAX_SPRITES)
+ if (spriteId != MAX_SPRITES)
{
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.paletteNum = 0;
- sprite->data[2] = gFieldEffectArguments[2];
+ sprite->tPlayerObjId = gFieldEffectArguments[2];
sprite->data[3] = -1;
sprite->data[6] = -1;
sprite->data[7] = -1;
@@ -968,53 +1022,55 @@ u32 FldEff_SurfBlob(void)
return spriteId;
}
-// States for bobbing up and down while surfing
-void SetSurfBobState(u8 spriteId, u8 value)
+
+void SetSurfBlob_BobState(u8 spriteId, u8 state)
{
- gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (value & 0xF);
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (state & 0xF);
}
-void SetSurfBobWhileFlyingOutState(u8 spriteId, u8 value)
+void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 dontSync)
{
- gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((value & 0xF) << 4);
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((dontSync & 0xF) << 4);
}
-void SetSurfBobWhileFishingState(u8 spriteId, u8 value, s16 data1)
+void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset)
{
- gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((value & 0xF) << 8);
- gSprites[spriteId].data[1] = data1;
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((hasOffset & 0xF) << 8);
+ gSprites[spriteId].tPlayerOffset = offset;
}
-static u8 GetSurfBobState(struct Sprite *sprite)
+static u8 GetSurfBlob_BobState(struct Sprite *sprite)
{
return sprite->data[0] & 0xF;
}
-static u8 GetSurfBobWhileFlyingOutState(struct Sprite *sprite)
+// Never TRUE
+static u8 GetSurfBlob_DontSyncAnim(struct Sprite *sprite)
{
return (sprite->data[0] & 0xF0) >> 4;
}
-static u8 GetSurfBobWhileFishingState(struct Sprite *sprite)
+static u8 GetSurfBlob_HasPlayerOffset(struct Sprite *sprite)
{
return (sprite->data[0] & 0xF00) >> 8;
}
void UpdateSurfBlobFieldEffect(struct Sprite *sprite)
{
- struct ObjectEvent *objectEvent;
- struct Sprite *linkedSprite;
+ struct ObjectEvent *playerObj;
+ struct Sprite *playerSprite;
- objectEvent = &gObjectEvents[sprite->data[2]];
- linkedSprite = &gSprites[objectEvent->spriteId];
- SynchroniseSurfAnim(objectEvent, sprite);
- sub_81556E8(objectEvent, sprite);
- CreateBobbingEffect(objectEvent, linkedSprite, sprite);
- sprite->oam.priority = linkedSprite->oam.priority;
+ playerObj = &gObjectEvents[sprite->tPlayerObjId];
+ playerSprite = &gSprites[playerObj->spriteId];
+ SynchroniseSurfAnim(playerObj, sprite);
+ SynchroniseSurfPosition(playerObj, sprite);
+ UpdateBobbingEffect(playerObj, playerSprite, sprite);
+ sprite->oam.priority = playerSprite->oam.priority;
}
-static void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+static void SynchroniseSurfAnim(struct ObjectEvent *playerObj, struct Sprite *sprite)
{
+ // Indexes into sAnimTable_SurfBlob
u8 surfBlobDirectionAnims[] = {
[DIR_NONE] = 0,
[DIR_SOUTH] = 0,
@@ -1027,16 +1083,16 @@ static void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite *
[DIR_NORTHEAST] = 1,
};
- if (GetSurfBobWhileFlyingOutState(sprite) == 0)
- StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[objectEvent->movementDirection]);
+ if (!GetSurfBlob_DontSyncAnim(sprite))
+ StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[playerObj->movementDirection]);
}
-void sub_81556E8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+void SynchroniseSurfPosition(struct ObjectEvent *playerObj, struct Sprite *sprite)
{
u8 i;
- s16 x = objectEvent->currentCoords.x;
- s16 y = objectEvent->currentCoords.y;
- s32 spriteY = sprite->pos2.y;
+ s16 x = playerObj->currentCoords.x;
+ s16 y = playerObj->currentCoords.y;
+ s32 spriteY = sprite->y2;
if (spriteY == 0 && (x != sprite->data[6] || y != sprite->data[7]))
{
@@ -1048,68 +1104,81 @@ void sub_81556E8(struct ObjectEvent *objectEvent, struct Sprite *sprite)
MoveCoords(i, &x, &y);
if (MapGridGetZCoordAt(x, y) == 3)
{
- sprite->data[5] ++;
+ sprite->data[5]++;
break;
}
}
}
}
-static void CreateBobbingEffect(struct ObjectEvent *objectEvent, struct Sprite *linkedSprite, struct Sprite *sprite)
+static void UpdateBobbingEffect(struct ObjectEvent *playerObj, struct Sprite *playerSprite, struct Sprite *sprite)
{
- u16 unk_085CDC6A[] = {3, 7};
- u8 bobState = GetSurfBobState(sprite);
- if (bobState != 0)
+ u16 intervals[] = {3, 7};
+ u8 bobState = GetSurfBlob_BobState(sprite);
+ if (bobState != BOB_NONE)
{
- if (((u16)(++ sprite->data[4]) & unk_085CDC6A[sprite->data[5]]) == 0)
+ // Update bobbing position of surf blob
+ if (((u16)(++sprite->data[4]) & intervals[sprite->data[5]]) == 0)
{
- sprite->pos2.y += sprite->data[3];
+ sprite->y2 += sprite->data[3];
}
- if ((sprite->data[4] & 0x0F) == 0)
+ if ((sprite->data[4] & 15) == 0)
{
sprite->data[3] = -sprite->data[3];
}
- if (bobState != 2)
+ if (bobState != BOB_JUST_MON)
{
- if (GetSurfBobWhileFishingState(sprite) == 0)
- linkedSprite->pos2.y = sprite->pos2.y;
+ // Update bobbing position of player
+ if (!GetSurfBlob_HasPlayerOffset(sprite))
+ playerSprite->y2 = sprite->y2;
else
- linkedSprite->pos2.y = sprite->data[1] + sprite->pos2.y;
- sprite->pos1.x = linkedSprite->pos1.x;
- sprite->pos1.y = linkedSprite->pos1.y + 8;
+ playerSprite->y2 = sprite->tPlayerOffset + sprite->y2;
+ sprite->x = playerSprite->x;
+ sprite->y = playerSprite->y + 8;
}
}
}
-u8 sub_8155800(u8 oldSpriteId)
+#define sSpriteId data[0]
+#define sBobY data[1]
+#define sTimer data[2]
+
+u8 StartUnderwaterSurfBlobBobbing(u8 blobSpriteId)
{
u8 spriteId;
struct Sprite *sprite;
+ // Create a dummy sprite with its own callback
+ // that tracks the actual surf blob sprite and
+ // makes it bob up and down underwater
spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1);
sprite = &gSprites[spriteId];
- sprite->callback = sub_8155850;
+ sprite->callback = SpriteCB_UnderwaterSurfBlob;
sprite->invisible = TRUE;
- sprite->data[0] = oldSpriteId;
- sprite->data[1] = 1;
+ sprite->sSpriteId = blobSpriteId;
+ sprite->sBobY = 1;
return spriteId;
}
-static void sub_8155850(struct Sprite *sprite)
+static void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite)
{
- struct Sprite *oldSprite;
+ struct Sprite *blobSprite;
- oldSprite = &gSprites[sprite->data[0]];
- if (((sprite->data[2]++) & 0x03) == 0)
+ blobSprite = &gSprites[sprite->sSpriteId];
+ if (((sprite->sTimer++) & 3) == 0)
{
- oldSprite->pos2.y += sprite->data[1];
+ blobSprite->y2 += sprite->sBobY;
}
- if ((sprite->data[2] & 0x0F) == 0)
+ if ((sprite->sTimer & 15) == 0)
{
- sprite->data[1] = -sprite->data[1];
+ sprite->sBobY = -sprite->sBobY;
}
}
+#undef sSpriteId
+#undef sBobY
+#undef sTimer
+
u32 FldEff_Dust(void)
{
u8 spriteId;
@@ -1148,9 +1217,9 @@ u32 FldEff_SandPile(void)
sprite->data[0] = gFieldEffectArguments[0];
sprite->data[1] = gFieldEffectArguments[1];
sprite->data[2] = gFieldEffectArguments[2];
- sprite->data[3] = gSprites[objectEvent->spriteId].pos1.x;
- sprite->data[4] = gSprites[objectEvent->spriteId].pos1.y;
- sprite->pos2.y = (graphicsInfo->height >> 1) - 2;
+ sprite->data[3] = gSprites[objectEvent->spriteId].x;
+ sprite->data[4] = gSprites[objectEvent->spriteId].y;
+ sprite->y2 = (graphicsInfo->height >> 1) - 2;
SeekSpriteAnim(sprite, 2);
}
return 0;
@@ -1168,8 +1237,8 @@ void UpdateSandPileFieldEffect(struct Sprite *sprite)
}
else
{
- y = gSprites[gObjectEvents[objectEventId].spriteId].pos1.y;
- x = gSprites[gObjectEvents[objectEventId].spriteId].pos1.x;
+ y = gSprites[gObjectEvents[objectEventId].spriteId].y;
+ x = gSprites[gObjectEvents[objectEventId].spriteId].x;
if (x != sprite->data[3] || y != sprite->data[4])
{
sprite->data[3] = x;
@@ -1179,10 +1248,10 @@ void UpdateSandPileFieldEffect(struct Sprite *sprite)
StartSpriteAnim(sprite, 0);
}
}
- sprite->pos1.x = x;
- sprite->pos1.y = y;
+ sprite->x = x;
+ sprite->y = y;
sprite->subpriority = gSprites[gObjectEvents[objectEventId].spriteId].subpriority;
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
}
}
@@ -1206,8 +1275,8 @@ void UpdateBubblesFieldEffect(struct Sprite *sprite)
{
sprite->data[0] += 0x80;
sprite->data[0] &= 0x100;
- sprite->pos1.y -= sprite->data[0] >> 8;
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ sprite->y -= sprite->data[0] >> 8;
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
if (sprite->invisible || sprite->animEnded)
{
FieldEffectStop(sprite, FLDEFF_BUBBLES);
@@ -1232,6 +1301,13 @@ u32 FldEff_BerryTreeGrowthSparkle(void)
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)
{
return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, FLDEFFOBJ_TREE_DISGUISE, 4);
@@ -1263,10 +1339,10 @@ static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 fldEffObj, u8 paletteNum)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled ++;
sprite->oam.paletteNum = paletteNum;
- sprite->data[1] = fldEff;
- sprite->data[2] = gFieldEffectArguments[0];
- sprite->data[3] = gFieldEffectArguments[1];
- sprite->data[4] = gFieldEffectArguments[2];
+ sprite->sFldEff = fldEff;
+ sprite->sLocalId = gFieldEffectArguments[0];
+ sprite->sMapNum = gFieldEffectArguments[1];
+ sprite->sMapGroup = gFieldEffectArguments[2];
}
return spriteId;
}
@@ -1277,62 +1353,65 @@ void UpdateDisguiseFieldEffect(struct Sprite *sprite)
const struct ObjectEventGraphicsInfo *graphicsInfo;
struct Sprite *linkedSprite;
- if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &objectEventId))
- {
- FieldEffectStop(sprite, sprite->data[1]);
- }
+ if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId))
+ FieldEffectStop(sprite, sprite->sFldEff);
graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId);
linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId];
sprite->invisible = linkedSprite->invisible;
- sprite->pos1.x = linkedSprite->pos1.x;
- sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16;
+ sprite->x = linkedSprite->x;
+ sprite->y = (graphicsInfo->height >> 1) + linkedSprite->y - 16;
sprite->subpriority = linkedSprite->subpriority - 1;
- if (sprite->data[0] == 1)
+
+ if (sprite->sState == 1)
{
- sprite->data[0] ++;
+ sprite->sState++;
StartSpriteAnim(sprite, 1);
}
- if (sprite->data[0] == 2 && sprite->animEnded)
- {
- sprite->data[7] = 1;
- }
- if (sprite->data[0] == 3)
- {
- FieldEffectStop(sprite, sprite->data[1]);
- }
+
+ if (sprite->sState == 2 && sprite->animEnded)
+ sprite->sReadyToEnd = TRUE;
+
+ if (sprite->sState == 3)
+ FieldEffectStop(sprite, sprite->sFldEff);
}
-void sub_8155D78(struct ObjectEvent *objectEvent)
+void StartRevealDisguise(struct ObjectEvent *objectEvent)
{
if (objectEvent->directionSequenceIndex == 1)
- {
- gSprites[objectEvent->fieldEffectSpriteId].data[0]++;
- }
+ gSprites[objectEvent->fieldEffectSpriteId].sState++;
}
-bool8 sub_8155DA0(struct ObjectEvent *objectEvent)
+bool8 UpdateRevealDisguise(struct ObjectEvent *objectEvent)
{
struct Sprite *sprite;
if (objectEvent->directionSequenceIndex == 2)
- {
return TRUE;
- }
+
if (objectEvent->directionSequenceIndex == 0)
- {
return TRUE;
- }
+
sprite = &gSprites[objectEvent->fieldEffectSpriteId];
- if (sprite->data[7])
+ if (sprite->sReadyToEnd)
{
objectEvent->directionSequenceIndex = 2;
- sprite->data[0]++;
+ sprite->sState++;
return TRUE;
}
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)
{
u8 spriteId;
@@ -1351,22 +1430,22 @@ u32 FldEff_Sparkle(void)
void UpdateSparkleFieldEffect(struct Sprite *sprite)
{
- if (sprite->data[0] == 0)
+ if (!sprite->sFinished)
{
if (sprite->animEnded)
{
sprite->invisible = TRUE;
- sprite->data[0]++;
+ sprite->sFinished++;
}
-
- if (sprite->data[0] == 0)
- return;
}
- if (++sprite->data[1] > 34)
+ if (sprite->sFinished && ++sprite->sEndTimer > 34)
FieldEffectStop(sprite, FLDEFF_SPARKLE);
}
+#undef sFinished
+#undef sEndTimer
+
#define sTimer data[0]
#define sState data[2]
#define sStartY data[4]
@@ -1389,25 +1468,25 @@ static bool8 AnimateRayquazaInFigure8(struct Sprite *sprite)
switch (sprite->sAnimState)
{
case 0:
- sprite->pos2.x += GetFigure8XOffset(sprite->sAnimCounter);
- sprite->pos2.y += GetFigure8YOffset(sprite->sAnimCounter);
+ sprite->x2 += GetFigure8XOffset(sprite->sAnimCounter);
+ sprite->y2 += GetFigure8YOffset(sprite->sAnimCounter);
break;
case 1:
- sprite->pos2.x -= GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
- sprite->pos2.y += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
+ sprite->x2 -= GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
+ sprite->y2 += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
break;
case 2:
- sprite->pos2.x -= GetFigure8XOffset(sprite->sAnimCounter);
- sprite->pos2.y += GetFigure8YOffset(sprite->sAnimCounter);
+ sprite->x2 -= GetFigure8XOffset(sprite->sAnimCounter);
+ sprite->y2 += GetFigure8YOffset(sprite->sAnimCounter);
break;
case 3:
- sprite->pos2.x += GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
- sprite->pos2.y += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
+ sprite->x2 += GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
+ sprite->y2 += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->sAnimCounter);
break;
}
// Update spotlight to sweep left and right with Rayquaza
- SetGpuReg(REG_OFFSET_BG0HOFS, -sprite->pos2.x);
+ SetGpuReg(REG_OFFSET_BG0HOFS, -sprite->x2);
if (++sprite->sAnimCounter == FIGURE_8_LENGTH)
{
@@ -1416,8 +1495,8 @@ static bool8 AnimateRayquazaInFigure8(struct Sprite *sprite)
}
if (sprite->sAnimState == 4)
{
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
+ sprite->y2 = 0;
+ sprite->x2 = 0;
finished = TRUE;
}
@@ -1449,7 +1528,7 @@ void UpdateRayquazaSpotlightEffect(struct Sprite *sprite)
}
break;
case 1:
- sprite->pos1.y = (gSineTable[sprite->sTimer / 3] >> 2) + sprite->sStartY;
+ sprite->y = (gSineTable[sprite->sTimer / 3] >> 2) + sprite->sStartY;
if (sprite->sTimer == 189)
{
sprite->sState = 2;
@@ -1470,7 +1549,7 @@ void UpdateRayquazaSpotlightEffect(struct Sprite *sprite)
}
break;
case 3:
- if (sprite->pos2.y == 0)
+ if (sprite->y2 == 0)
{
sprite->sTimer = 0;
sprite->sState++;
@@ -1478,10 +1557,10 @@ void UpdateRayquazaSpotlightEffect(struct Sprite *sprite)
if (sprite->sTimer == 5)
{
sprite->sTimer = 0;
- if (sprite->pos2.y > 0)
- sprite->pos2.y--;
+ if (sprite->y2 > 0)
+ sprite->y2--;
else
- sprite->pos2.y++;
+ sprite->y2++;
}
break;
case 4:
@@ -1535,7 +1614,7 @@ void UpdateRayquazaSpotlightEffect(struct Sprite *sprite)
if (sprite->sState == 1)
{
if ((sprite->data[1] & 7) == 0)
- sprite->pos2.y += sprite->data[3];
+ sprite->y2 += sprite->data[3];
if ((sprite->data[1] & 15) == 0)
sprite->data[3] = -sprite->data[3];
sprite->data[1]++;
@@ -1551,16 +1630,17 @@ void UpdateRayquazaSpotlightEffect(struct Sprite *sprite)
#undef sAnimCounter
#undef sAnimState
+// Used by FLDEFF_JUMP_TALL_GRASS and FLDEFF_JUMP_LONG_GRASS
void UpdateJumpImpactEffect(struct Sprite *sprite)
{
if (sprite->animEnded)
{
- FieldEffectStop(sprite, sprite->data[1]);
+ FieldEffectStop(sprite, sprite->sFldEff);
}
else
{
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
- SetObjectSubpriorityByZCoord(sprite->data[0], sprite, 0);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
+ SetObjectSubpriorityByZCoord(sprite->sElevation, sprite, 0);
}
}
@@ -1569,10 +1649,10 @@ void WaitFieldEffectSpriteAnim(struct Sprite *sprite)
if (sprite->animEnded)
FieldEffectStop(sprite, sprite->data[0]);
else
- UpdateObjectEventSpriteVisibility(sprite, FALSE);
+ UpdateObjectEventSpriteInvisibility(sprite, FALSE);
}
-static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset)
+static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset)
{
u8 i;
s16 var, xhi, lyhi, yhi, ylo;
@@ -1587,13 +1667,13 @@ static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset)
{
graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId);
linkedSprite = &gSprites[objectEvent->spriteId];
- xhi = sprite->pos1.x + sprite->centerToCornerVecX;
- var = sprite->pos1.x - sprite->centerToCornerVecX;
- if (xhi < linkedSprite->pos1.x && var > linkedSprite->pos1.x)
+ xhi = sprite->x + sprite->centerToCornerVecX;
+ var = sprite->x - sprite->centerToCornerVecX;
+ if (xhi < linkedSprite->x && var > linkedSprite->x)
{
- lyhi = linkedSprite->pos1.y + linkedSprite->centerToCornerVecY;
- var = linkedSprite->pos1.y;
- ylo = sprite->pos1.y - sprite->centerToCornerVecY;
+ lyhi = linkedSprite->y + linkedSprite->centerToCornerVecY;
+ var = linkedSprite->y;
+ ylo = sprite->y - sprite->centerToCornerVecY;
yhi = ylo + linkedSprite->centerToCornerVecY;
if ((lyhi < yhi || lyhi < ylo) && var > yhi && sprite->subpriority <= linkedSprite->subpriority)
{
@@ -1605,18 +1685,27 @@ static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset)
}
}
-// Unused data. Feel free to remove.
-static const u8 gUnknown_085CDC6E[] =
-{
- 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02,
- 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02,
- 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
- 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01,
- 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
- 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00
+// Unused, duplicates of data in event_object_movement.c
+static const s8 sFigure8XOffsets[FIGURE_8_LENGTH] = {
+ 1, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 1, 2, 2, 1, 2,
+ 2, 1, 2, 2, 1, 2, 1, 1,
+ 2, 1, 1, 2, 1, 1, 2, 1,
+ 1, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 1, 0, 1, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0,
+};
+
+static const s8 sFigure8YOffsets[FIGURE_8_LENGTH] = {
+ 0, 0, 1, 0, 0, 1, 0, 0,
+ 1, 0, 1, 1, 0, 1, 1, 0,
+ 1, 1, 0, 1, 1, 0, 1, 1,
+ 0, 0, 1, 0, 0, 1, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1, 0, 0, -1, 0, 0,
+ -1, 0, -1, -1, 0, -1, -1, 0,
+ -1, -1, -1, -1, -1, -1, -1, -2,
};