diff options
Diffstat (limited to 'src/field_effect_helpers.c')
-rwxr-xr-x | src/field_effect_helpers.c | 599 |
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, }; |