summaryrefslogtreecommitdiff
path: root/src/field/field_ground_effect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/field/field_ground_effect.c')
-rw-r--r--src/field/field_ground_effect.c772
1 files changed, 0 insertions, 772 deletions
diff --git a/src/field/field_ground_effect.c b/src/field/field_ground_effect.c
deleted file mode 100644
index 25b678ff9..000000000
--- a/src/field/field_ground_effect.c
+++ /dev/null
@@ -1,772 +0,0 @@
-#include "global.h"
-#include "field_ground_effect.h"
-#include "field_effect.h"
-#include "field_effect_helpers.h"
-#include "field_map_obj_helpers.h"
-#include "fieldmap.h"
-#include "metatile_behavior.h"
-
-static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8);
-static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8);
-static void DoTracksGroundEffect_BikeTireTracks(
- struct MapObject *mapObj, struct Sprite *sprite, u8);
-void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite);
-void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite);
-void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite);
-void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite);
-void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite);
-void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite);
-void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite);
-u8 GetReflectionTypeByMetatileBehavior(u32 behavior);
-
-static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags)
-{
- FieldObjectUpdateMetatileBehaviors(mapObj);
- GetGroundEffectFlags_Reflection(mapObj, flags);
- GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags);
- GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags);
- GetGroundEffectFlags_SandPile(mapObj, flags);
- GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
- GetGroundEffectFlags_ShortGrass(mapObj, flags);
- GetGroundEffectFlags_HotSprings(mapObj, flags);
-}
-
-static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags)
-{
- FieldObjectUpdateMetatileBehaviors(mapObj);
- GetGroundEffectFlags_Reflection(mapObj, flags);
- GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags);
- GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags);
- GetGroundEffectFlags_Tracks(mapObj, flags);
- GetGroundEffectFlags_SandPile(mapObj, flags);
- GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
- GetGroundEffectFlags_Puddle(mapObj, flags);
- GetGroundEffectFlags_ShortGrass(mapObj, flags);
- GetGroundEffectFlags_HotSprings(mapObj, flags);
-}
-
-static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags)
-{
- FieldObjectUpdateMetatileBehaviors(mapObj);
- GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
- GetGroundEffectFlags_SandPile(mapObj, flags);
- GetGroundEffectFlags_Puddle(mapObj, flags);
- GetGroundEffectFlags_Ripple(mapObj, flags);
- GetGroundEffectFlags_ShortGrass(mapObj, flags);
- GetGroundEffectFlags_HotSprings(mapObj, flags);
- GetGroundEffectFlags_Seaweed(mapObj, flags);
- GetGroundEffectFlags_JumpLanding(mapObj, flags);
-}
-
-void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj)
-{
- mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y);
- mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y);
-}
-
-void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags)
-{
- u32 reflectionFlags[2] = { 0x00000020, 0x00000010 };
- u8 type = FieldObjectCheckForReflectiveSurface(mapObj);
-
- if (type)
- {
- if (!mapObj->mapobj_bit_17)
- {
- mapObj->mapobj_bit_17 = 0;
- mapObj->mapobj_bit_17 = 1;
- *flags |= reflectionFlags[type - 1];
- }
- }
- else
- {
- mapObj->mapobj_bit_17 = 0;
- }
-}
-
-void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x1;
-}
-
-void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x2;
-}
-
-void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x4;
-}
-
-void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x8;
-}
-
-void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F))
- {
- *flags |= 0x100;
- }
- else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F)
- || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F))
- {
- *flags |= 0x80;
- }
-}
-
-void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F))
- {
- if (!mapObj->mapobj_bit_20)
- {
- mapObj->mapobj_bit_20 = 0;
- mapObj->mapobj_bit_20 = 1;
- *flags |= 0x800;
- }
- }
- else
- {
- mapObj->mapobj_bit_20 = 0;
- }
-}
-
-void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags)
-{
- if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F))
- || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F)))
- {
- if (!mapObj->mapobj_bit_19)
- {
- mapObj->mapobj_bit_19 = 0;
- mapObj->mapobj_bit_19 = 1;
- *flags |= 0x40;
- }
- }
- else
- {
- mapObj->mapobj_bit_19 = 0;
- }
-}
-
-void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F))
- {
- *flags |= 0x400;
- }
-}
-
-void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E))
- *flags |= 0x200;
-}
-
-void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F))
- {
- if (!mapObj->mapobj_bit_18)
- {
- mapObj->mapobj_bit_18 = 0;
- mapObj->mapobj_bit_18 = 1;
- *flags |= 0x20000;
- }
- }
- else
- {
- mapObj->mapobj_bit_18 = 0;
- }
-}
-
-void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F))
- {
- if (!mapObj->mapobj_bit_21)
- {
- mapObj->mapobj_bit_21 = 0;
- mapObj->mapobj_bit_21 = 1;
- *flags |= 0x40000;
- }
- }
- else
- {
- mapObj->mapobj_bit_21 = 0;
- }
-}
-
-void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E))
- *flags |= 0x80000;
-}
-
-void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags)
-{
- typedef bool8 (*MetatileFunc)(u8);
-
- static const MetatileFunc metatileFuncs[] = {
- MetatileBehavior_IsTallGrass,
- MetatileBehavior_IsLongGrass,
- MetatileBehavior_IsPuddle,
- MetatileBehavior_IsSurfableWaterOrUnderwater,
- MetatileBehavior_IsShallowFlowingWater,
- MetatileBehavior_IsATile,
- };
-
- static const u32 jumpLandingFlags[] = {
- 0x00001000, // Landing in tall grass
- 0x00002000, // Landing in long grass
- 0x00004000, // Landing on puddle
- 0x00008000, // Landing on surfable water or underwater
- 0x00004000, // Landing on shallow flowing water
- 0x00010000, // Landing on any other type of ground
- };
-
- if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25)
- {
- u8 i;
-
- for (i = 0; i < 6; i++)
- {
- if (metatileFuncs[i](mapObj->mapobj_unk_1E))
- {
- *flags |= jumpLandingFlags[i];
- return;
- }
- }
- }
-}
-
-u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj)
-{
- const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId);
-
- // ceil div by tile width?
- s16 width = (info->width + 8) >> 4;
- s16 height = (info->height + 8) >> 4;
- s16 i;
- s16 j;
- u8 result;
- u8 b;
- s16 one;
-
-#define RETURN_REFLECTION_TYPE_AT(x, y) \
- b = MapGridGetMetatileBehaviorAt(x, y); \
- result = GetReflectionTypeByMetatileBehavior(b); \
- if (result != 0) \
- return result;
-
- for (i = 0, one = 1; i < height; i++)
- {
- RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i)
- RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i)
- for (j = 1; j < width; j++)
- {
- RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i)
- RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i)
- RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i)
- RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i)
- }
- }
- return 0;
-
-#undef RETURN_REFLECTION_TYPE_AT
-}
-
-u8 GetReflectionTypeByMetatileBehavior(u32 behavior)
-{
- if (MetatileBehavior_IsIce(behavior))
- return 1;
- else if (MetatileBehavior_IsReflective(behavior))
- return 2;
- else
- return 0;
-}
-
-u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z)
-{
- static bool8 (*const unknown_08376040[])(u8) = {
- MetatileBehavior_IsJumpSouth,
- MetatileBehavior_IsJumpNorth,
- MetatileBehavior_IsJumpWest,
- MetatileBehavior_IsJumpEast,
- };
-
- u8 b;
- u8 index = z;
-
- if (index == 0)
- return 0;
- else if (index > 4)
- index -= 4;
-
- index--;
- b = MapGridGetMetatileBehaviorAt(x, y);
-
- if (unknown_08376040[index](b) == 1)
- return index + 1;
-
- return 0;
-}
-
-void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite)
-{
- if (mapObj->mapobj_bit_4)
- return;
-
- if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
- return;
-
- if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F))
- return;
-
- sprite->subspriteTableNum = 4;
-
- if (ZCoordToPriority(mapObj->elevation) == 1)
- sprite->subspriteTableNum = 5;
-}
-
-bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y)
-{
- u8 mapZ;
-
- if (z == 0)
- return FALSE;
-
- mapZ = MapGridGetZCoordAt(x, y);
-
- if (mapZ == 0 || mapZ == 0xF)
- return FALSE;
-
- if (mapZ != z)
- return TRUE;
-
- return FALSE;
-}
-
-static const u8 sUnknown_08376050[] = {
- 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73
-};
-
-// Each byte corresponds to a sprite priority for a field object.
-// This is directly the inverse of gFieldObjectPriorities_08376070.
-static const u8 sFieldObjectPriorities_08376060[] = {
- 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2
-};
-
-// Each byte corresponds to a sprite priority for a field object.
-// This is the inverse of gFieldObjectPriorities_08376060.
-// 1 = Above player sprite
-// 2 = Below player sprite
-static const u8 sFieldObjectPriorities_08376070[] = {
- 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1,
-};
-
-void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite)
-{
- if (mapObj->mapobj_bit_26)
- return;
-
- FieldObjectUpdateZCoord(mapObj);
-
- sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation];
- sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation];
-}
-
-void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z)
-{
- sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z];
- sprite->oam.priority = sFieldObjectPriorities_08376060[z];
-}
-
-u8 ZCoordToPriority(u8 z)
-{
- return sFieldObjectPriorities_08376060[z];
-}
-
-void FieldObjectUpdateZCoord(struct MapObject *mapObj)
-{
- u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y);
- u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y);
-
- if (z == 0xF || z2 == 0xF)
- return;
-
- mapObj->mapobj_unk_0B_0 = z;
-
- if (z != 0 && z != 0xF)
- mapObj->elevation = z;
-}
-
-void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b)
-{
- s32 tmp = sprite->centerToCornerVecY;
- u32 tmpa = *(u16 *)&sprite->pos1.y;
- u32 tmpb = *(u16 *)&gSpriteCoordOffsetY;
- s32 tmp2 = (tmpa - tmp) + tmpb;
- u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2;
- sprite->subpriority = tmp3 + sUnknown_08376050[a] + b;
-}
-
-void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite)
-{
- if (mapObj->mapobj_bit_26)
- return;
-
- SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1);
-}
-
-bool8 AreZCoordsCompatible(u8 a, u8 b)
-{
- if (a == 0 || b == 0)
- return TRUE;
-
- if (a != b)
- return FALSE;
-
- return TRUE;
-}
-
-void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = 2;
- gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum;
- gFieldEffectArguments[5] = mapObj->mapGroup;
- gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
- gFieldEffectArguments[7] = 1;
- FieldEffectStart(FLDEFF_TALL_GRASS);
-}
-
-void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = 2;
- gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum;
- gFieldEffectArguments[5] = mapObj->mapGroup;
- gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
- gFieldEffectArguments[7] = 0;
- FieldEffectStart(FLDEFF_TALL_GRASS);
-}
-
-void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = 2;
- gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum;
- gFieldEffectArguments[5] = mapObj->mapGroup;
- gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
- gFieldEffectArguments[7] = 1;
- FieldEffectStart(FLDEFF_LONG_GRASS);
-}
-
-void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = 2;
- gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum;
- gFieldEffectArguments[5] = mapObj->mapGroup;
- gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
- gFieldEffectArguments[7] = 0;
- FieldEffectStart(FLDEFF_LONG_GRASS);
-}
-
-void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite)
-{
- SetUpReflection(mapObj, sprite, 0);
-}
-
-void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite)
-{
- SetUpReflection(mapObj, sprite, 1);
-}
-
-void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite)
-{
- oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj);
-}
-
-static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = {
- nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks,
-};
-
-void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite)
-{
- const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId);
- gUnknown_08376080[info->tracks](mapObj, sprite, 0);
-}
-
-void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite)
-{
- const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId);
- gUnknown_08376080[info->tracks](mapObj, sprite, 1);
-}
-
-static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a)
-{
-}
-
-static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a)
-{
- // First half-word is a Field Effect script id. (gFieldEffectScriptPointers)
- u16 sandFootprints_FieldEffectData[2] = {
- FLDEFF_SAND_FOOTPRINTS,
- FLDEFF_DEEP_SAND_FOOTPRINTS
- };
-
- gFieldEffectArguments[0] = mapObj->coords3.x;
- gFieldEffectArguments[1] = mapObj->coords3.y;
- gFieldEffectArguments[2] = 149;
- gFieldEffectArguments[3] = 2;
- gFieldEffectArguments[4] = mapObj->mapobj_unk_18;
- FieldEffectStart(sandFootprints_FieldEffectData[a]);
-}
-
-static void DoTracksGroundEffect_BikeTireTracks(
- struct MapObject *mapObj, struct Sprite *sprite, u8 a)
-{
- // Specifies which bike track shape to show next.
- // For example, when the bike turns from up to right, it will show
- // a track that curves to the right.
- // Each 4-byte row corresponds to the initial direction of the bike, and
- // each byte in that row is for the next direction of the bike in the order
- // of down, up, left, right.
- static const u8 bikeTireTracks_Transitions[4][4] = {
- 1, 2, 7, 8,
- 1, 2, 6, 5,
- 5, 8, 3, 4,
- 6, 7, 3, 4,
- };
-
- if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y)
- {
- gFieldEffectArguments[0] = mapObj->coords3.x;
- gFieldEffectArguments[1] = mapObj->coords3.y;
- gFieldEffectArguments[2] = 149;
- gFieldEffectArguments[3] = 2;
- gFieldEffectArguments[4] =
- bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5];
- FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS);
- }
-}
-
-void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite)
-{
- DoRippleFieldEffect(mapObj, sprite);
-}
-
-void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite)
-{
- oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj);
-}
-
-void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite)
-{
- oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj);
-}
-
-void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite)
-{
- u8 spriteId;
-
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = 2;
- FieldEffectStart(FLDEFF_JUMP_TALL_GRASS);
-
- spriteId = sub_8126FF0(
- mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y);
-
- if (spriteId == MAX_SPRITES)
- GroundEffect_SpawnOnTallGrass(mapObj, sprite);
-}
-
-void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = 2;
- FieldEffectStart(FLDEFF_JUMP_LONG_GRASS);
-}
-
-void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = sprite->oam.priority;
- FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH);
-}
-
-void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = sprite->oam.priority;
- FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH);
-}
-
-void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- gFieldEffectArguments[2] = mapObj->elevation;
- gFieldEffectArguments[3] = sprite->oam.priority;
- FieldEffectStart(FLDEFF_DUST);
-}
-
-void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite)
-{
- oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj);
-}
-
-void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite)
-{
- oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj);
-}
-
-void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite)
-{
- gFieldEffectArguments[0] = mapObj->coords2.x;
- gFieldEffectArguments[1] = mapObj->coords2.y;
- FieldEffectStart(FLDEFF_BUBBLES);
-}
-
-static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = {
- GroundEffect_SpawnOnTallGrass,
- sub_8063E94,
- sub_8063EE0,
- sub_8063F2C,
- GroundEffect_WaterReflection,
- GroundEffect_IceReflection,
- GroundEffect_FlowingWater,
- sub_8063FA0,
- sub_8063FCC,
- GroundEffect_Ripple,
- GroundEffect_StepOnPuddle,
- GroundEffect_SandPile,
- GroundEffect_JumpOnTallGrass,
- GroundEffect_JumpOnLongGrass,
- GroundEffect_JumpOnShallowWater,
- GroundEffect_JumpOnWater,
- GroundEffect_JumpLandingDust,
- GroundEffect_ShortGrass,
- GroundEffect_HotSprings,
- GroundEffect_Seaweed
-};
-
-void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags)
-{
- u8 i;
- for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1)
- if (flags & 1)
- gUnknown_083760A0[i](mapObj, sprite);
-}
-
-void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags)
-{
- if (mapObj->mapobj_bit_4)
- {
- mapObj->mapobj_bit_18 = 0;
- mapObj->mapobj_bit_20 = 0;
- mapObj->mapobj_bit_19 = 0;
- mapObj->mapobj_bit_21 = 0;
- *flags &= 0xFFF9F7BD;
- }
-}
-
-void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags)
-{
- if (mapObj->mapobj_bit_5)
- *flags &= 0xFFFFFBFF;
-}
-
-void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite)
-{
- u32 flags;
-
- if (mapObj->mapobj_bit_2)
- {
- flags = 0;
- FieldObjectUpdateZCoordAndPriority(mapObj, sprite);
- GetAllGroundEffectFlags_OnSpawn(mapObj, &flags);
- FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite);
- sub_8064218(mapObj, sprite, flags);
- mapObj->mapobj_bit_2 = 0;
- mapObj->mapobj_bit_4 = 0;
- }
-}
-
-void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite)
-{
- u32 flags;
-
- if (mapObj->mapobj_bit_2)
- {
- flags = 0;
- FieldObjectUpdateZCoordAndPriority(mapObj, sprite);
- GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags);
- FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite);
- filters_out_some_ground_effects(mapObj, &flags);
- sub_8064218(mapObj, sprite, flags);
- mapObj->mapobj_bit_2 = 0;
- mapObj->mapobj_bit_4 = 0;
- }
-}
-
-void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite)
-{
- u32 flags;
-
- if (mapObj->mapobj_bit_3)
- {
- flags = 0;
- FieldObjectUpdateZCoordAndPriority(mapObj, sprite);
- GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags);
- FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite);
- FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags);
- sub_8064218(mapObj, sprite, flags);
- mapObj->mapobj_bit_3 = 0;
- mapObj->mapobj_bit_5 = 0;
- }
-}