summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-02-17 19:38:48 -0800
committerGitHub <noreply@github.com>2018-02-17 19:38:48 -0800
commita1d9c4bc46a8ea99fe21e481382784143282fa18 (patch)
treec73a6908db9b1cabbb55386038bf47ab4a9ad77a /src
parent28987bb1cd0e6864257ff0434508dddcddb22e98 (diff)
parente74b0c6e51796d2c8c7fab6ef22f75d15a6c8786 (diff)
Merge pull request #553 from ProjectRevoTPP/evobjmv
merge field_map_obj helpers and ground effect into event_object_movement.c
Diffstat (limited to 'src')
-rw-r--r--src/battle/battle_setup.c1
-rw-r--r--src/easy_chat_2.c2
-rw-r--r--src/engine/naming_screen.c2
-rw-r--r--src/field/berry.c2
-rw-r--r--src/field/berry_tag_screen.c2
-rw-r--r--src/field/bike.c2
-rw-r--r--src/field/event_object_movement.c (renamed from src/field/field_map_obj.c)1156
-rw-r--r--src/field/field_effect.c4
-rw-r--r--src/field/field_effect_helpers.c4
-rw-r--r--src/field/field_fadetransition.c3
-rw-r--r--src/field/field_ground_effect.c772
-rw-r--r--src/field/field_map_obj_helpers.c387
-rw-r--r--src/field/field_player_avatar.c4
-rw-r--r--src/field/field_special_scene.c2
-rw-r--r--src/field/field_specials.c2
-rw-r--r--src/field/field_weather.c2
-rw-r--r--src/field/field_weather_effects.c2
-rw-r--r--src/field/fldeff_berrytree.c2
-rw-r--r--src/field/fldeff_cut.c2
-rw-r--r--src/field/fldeff_decoration.c2
-rw-r--r--src/field/fldeff_recordmixing.c2
-rw-r--r--src/field/item_menu.c2
-rw-r--r--src/field/item_use.c1
-rw-r--r--src/field/map_obj_lock.c3
-rw-r--r--src/field/overworld.c4
-rw-r--r--src/field/rotating_gate.c2
-rw-r--r--src/field/scrcmd.c3
-rw-r--r--src/field/script_movement.c3
-rw-r--r--src/field/shop.c2
-rw-r--r--src/field/start_menu.c1
-rw-r--r--src/field/trainer_see.c2
-rw-r--r--src/field/tv.c2
-rw-r--r--src/rom6.c2
-rw-r--r--src/scene/cable_car.c2
34 files changed, 1179 insertions, 1207 deletions
diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c
index 15555f833..ec4a26bc5 100644
--- a/src/battle/battle_setup.c
+++ b/src/battle/battle_setup.c
@@ -6,7 +6,6 @@
#include "event_data.h"
#include "field_control_avatar.h"
#include "field_fadetransition.h"
-#include "field_map_obj_helpers.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
#include "field_weather.h"
diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c
index c56fe7576..ed6a97ba2 100644
--- a/src/easy_chat_2.c
+++ b/src/easy_chat_2.c
@@ -5,7 +5,7 @@
#include "decompress.h"
#include "easy_chat.h"
#include "event_data.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_message_box.h"
#include "graphics.h"
#include "menu.h"
diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c
index ca77c5483..59b9b4d84 100644
--- a/src/engine/naming_screen.c
+++ b/src/engine/naming_screen.c
@@ -3,7 +3,7 @@
#include "data2.h"
#include "graphics.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "main.h"
#include "menu.h"
diff --git a/src/field/berry.c b/src/field/berry.c
index 588807755..33effb4ce 100644
--- a/src/field/berry.c
+++ b/src/field/berry.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "berry.h"
#include "field_control_avatar.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "fieldmap.h"
#include "item.h"
#include "item_menu.h"
diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c
index ed0ab86ae..9fbfd0681 100644
--- a/src/field/berry_tag_screen.c
+++ b/src/field/berry_tag_screen.c
@@ -2,7 +2,7 @@
#include "berry_tag_screen.h"
#include "berry.h"
#include "decompress.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "item_menu.h"
#include "constants/items.h"
#include "item_use.h"
diff --git a/src/field/bike.c b/src/field/bike.c
index 98966ebd4..28439e6bb 100644
--- a/src/field/bike.c
+++ b/src/field/bike.c
@@ -1,6 +1,6 @@
#include "global.h"
#include "bike.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "constants/flags.h"
diff --git a/src/field/field_map_obj.c b/src/field/event_object_movement.c
index 13d8ebb5b..1236cd9b6 100644
--- a/src/field/field_map_obj.c
+++ b/src/field/event_object_movement.c
@@ -1,12 +1,10 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "berry.h"
#include "event_data.h"
#include "field_camera.h"
#include "field_effect.h"
#include "field_effect_helpers.h"
-#include "field_ground_effect.h"
-#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "palette.h"
@@ -18,6 +16,8 @@
#include "constants/map_objects.h"
#include "trainer_see.h"
+// this file was known as evobjmv.c in Game Freak's original source
+
// rodata
const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
@@ -2917,7 +2917,7 @@ u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x
extern void sub_8064970(struct Sprite *);
extern void sub_8060470(s16 *, s16 *, s16, s16);
-extern void InitObjectPriorityByZCoord();
+void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z);
u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction)
{
@@ -3865,7 +3865,7 @@ u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite)
}
extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *);
-extern void sub_8064820(struct Sprite *, s16);
+void sub_8064820(struct Sprite *, s16);
u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite)
{
@@ -8871,3 +8871,1149 @@ void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sp
sprite->invisible = 1;
}
}
+
+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;
+ }
+}
+
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
+
+void Step1(struct Sprite *sprite, u8 dir);
+void Step2(struct Sprite *sprite, u8 dir);
+void Step3(struct Sprite *sprite, u8 dir);
+void Step4(struct Sprite *sprite, u8 dir);
+void Step8(struct Sprite *sprite, u8 dir);
+
+const SpriteStepFunc Unknown_83760F0[] = {
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1
+};
+
+const SpriteStepFunc Unknown_8376130[] = {
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2
+};
+
+const SpriteStepFunc Unknown_8376150[] = {
+ Step2,
+ Step3,
+ Step3,
+ Step2,
+ Step3,
+ Step3
+};
+
+const SpriteStepFunc Unknown_8376168[] = {
+ Step4,
+ Step4,
+ Step4,
+ Step4
+};
+
+const SpriteStepFunc Unknown_8376178[] = {
+ Step8,
+ Step8
+};
+
+const SpriteStepFunc *const gUnknown_08376180[] = {
+ Unknown_83760F0,
+ Unknown_8376130,
+ Unknown_8376150,
+ Unknown_8376168,
+ Unknown_8376178
+};
+
+const s16 gUnknown_08376194[] = {
+ 16, 8, 6, 4, 2
+};
+
+const s8 Unknown_837619E[] = {
+ -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0
+};
+
+const s8 Unknown_83761AE[] = {
+ 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0
+};
+
+const s8 Unknown_83761BE[] = {
+ -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0
+};
+
+const s8 *const gUnknown_083761D0[] = {
+ Unknown_837619E,
+ Unknown_83761AE,
+ Unknown_83761BE
+};
+
+bool8 FreezeMapObject(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8)
+ {
+ return TRUE;
+ }
+ else
+ {
+ mapObject->mapobj_bit_8 = 1;
+ mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused;
+ mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused;
+ gSprites[mapObject->spriteId].animPaused = 1;
+ gSprites[mapObject->spriteId].affineAnimPaused = 1;
+ return FALSE;
+ }
+}
+
+void FreezeMapObjects(void)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void FreezeMapObjectsExceptOne(u8 a1)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void UnfreezeMapObject(struct MapObject *mapObject)
+{
+ if (mapObject->active && mapObject->mapobj_bit_8)
+ {
+ mapObject->mapobj_bit_8 = 0;
+ gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23;
+ gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24;
+ }
+}
+
+void UnfreezeMapObjects(void)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (gMapObjects[i].active)
+ UnfreezeMapObject(&gMapObjects[i]);
+}
+
+void Step1(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += gDirectionToVector[dir].x;
+ sprite->pos1.y += gDirectionToVector[dir].y;
+}
+
+void Step2(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y;
+}
+
+void Step3(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y;
+}
+
+void Step4(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y;
+}
+
+void Step8(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y;
+}
+
+void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = 0;
+}
+
+bool8 obj_npc_ministep(struct Sprite *sprite)
+{
+ if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]])
+ return FALSE;
+
+ gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
+
+ sprite->data[5]++;
+
+ if (sprite->data[5] < gUnknown_08376194[sprite->data[4]])
+ return FALSE;
+
+ return TRUE;
+}
+
+void sub_806467C(struct Sprite *sprite, u8 a2)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+}
+
+bool8 sub_806468C(struct Sprite *sprite)
+{
+ if (!(sprite->data[4] & 1))
+ {
+ Step1(sprite, sprite->data[3]);
+ sprite->data[5]++;
+ }
+
+ sprite->data[4]++;
+
+ if (sprite->data[5] > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+s16 sub_80646C8(s16 a1, u8 a2)
+{
+ return gUnknown_083761D0[a2][a1];
+}
+
+void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = a4;
+ sprite->data[6] = 0;
+}
+
+u8 sub_8064704(struct Sprite *sprite)
+{
+ s16 v5[3] = {0x10, 0x10, 0x20};
+ u8 v6[3] = {0, 0, 1};
+ u8 v2 = 0;
+
+ if (sprite->data[4])
+ Step1(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+u8 sub_806478C(struct Sprite *sprite)
+{
+ s16 v5[3] = {0x20, 0x20, 0x40};
+ u8 v6[3] = {1, 1, 2};
+ u8 v2 = 0;
+
+ if (sprite->data[4] && !(sprite->data[6] & 1))
+ Step1(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+void sub_8064820(struct Sprite *sprite, s16 a2)
+{
+ sprite->data[3] = a2;
+}
+
+bool8 sub_8064824(struct Sprite *sprite)
+{
+ sprite->data[3]--;
+
+ if (sprite->data[3] == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->animNum = a2;
+ sprite->animPaused = 0 ;
+ SeekSpriteAnim(sprite, a3);
+}
+
+bool8 sub_8064864(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_806487C(struct Sprite *sprite, bool8 invisible)
+{
+ u16 x, y;
+ s16 x2, y2;
+
+ sprite->invisible = invisible;
+
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ }
+ else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+
+ x2 = x - (sprite->centerToCornerVecX >> 1);
+ y2 = y - (sprite->centerToCornerVecY >> 1);
+
+ if ((s16)x > 255 || x2 < -16)
+ sprite->invisible = 1;
+ if ((s16)y > 175 || y2 < -16)
+ sprite->invisible = 1;
+}
+
+void sub_8064970(struct Sprite *sprite)
+{
+ SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
+ sub_806487C(sprite, 0);
+}
+
+void sub_8064990(u8 a1, u8 dir)
+{
+ u8 i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1)
+ {
+ u8 animNum = FieldObjectDirectionToImageAnimId(dir);
+ StartSpriteAnim(sprite, animNum);
+ break;
+ }
+ }
+}
+
+u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ return FieldEffectStart(fieldEffectId);
+}
+
+void DoShadowFieldEffect(struct MapObject *mapObject)
+{
+ if (!mapObject->mapobj_bit_22)
+ {
+ mapObject->mapobj_bit_22 = 1;
+ oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject);
+ }
+}
+
+void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ gFieldEffectArguments[0] = sprite->pos1.x;
+ gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
+ gFieldEffectArguments[2] = 151;
+ gFieldEffectArguments[3] = 3;
+ FieldEffectStart(FLDEFF_RIPPLE);
+}
diff --git a/src/field/field_effect.c b/src/field/field_effect.c
index e1389c378..f85bc520e 100644
--- a/src/field/field_effect.c
+++ b/src/field/field_effect.c
@@ -15,14 +15,12 @@
#include "constants/songs.h"
#include "decoration.h"
#include "field_player_avatar.h"
-#include "field_map_obj_helpers.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "metatile_behavior.h"
#include "field_camera.h"
#include "field_effect.h"
#include "field_fadetransition.h"
#include "fieldmap.h"
-#include "field_map_obj.h"
#include "util.h"
#include "field_effect_helpers.h"
#include "pokemon_storage_system.h"
diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c
index c9d337de1..bc4a1770e 100644
--- a/src/field/field_effect_helpers.c
+++ b/src/field/field_effect_helpers.c
@@ -4,12 +4,10 @@
#include "metatile_behavior.h"
#include "constants/songs.h"
#include "sound.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_camera.h"
-#include "field_map_obj_helpers.h"
#include "field_weather.h"
#include "field_effect.h"
-#include "field_ground_effect.h"
#include "field_effect_helpers.h"
static void sub_81269E0(struct Sprite *);
diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c
index 21235500a..35ea3952a 100644
--- a/src/field/field_fadetransition.c
+++ b/src/field/field_fadetransition.c
@@ -4,8 +4,7 @@
#include "field_door.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "field_special_scene.h"
#include "field_weather.h"
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;
- }
-}
diff --git a/src/field/field_map_obj_helpers.c b/src/field/field_map_obj_helpers.c
deleted file mode 100644
index 328b66ed2..000000000
--- a/src/field/field_map_obj_helpers.c
+++ /dev/null
@@ -1,387 +0,0 @@
-#include "global.h"
-#include "field_map_obj_helpers.h"
-#include "field_effect.h"
-#include "field_ground_effect.h"
-#include "field_map_obj.h"
-#include "sprite.h"
-
-typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
-
-void Step1(struct Sprite *sprite, u8 dir);
-void Step2(struct Sprite *sprite, u8 dir);
-void Step3(struct Sprite *sprite, u8 dir);
-void Step4(struct Sprite *sprite, u8 dir);
-void Step8(struct Sprite *sprite, u8 dir);
-
-const SpriteStepFunc Unknown_83760F0[] = {
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1,
- Step1
-};
-
-const SpriteStepFunc Unknown_8376130[] = {
- Step2,
- Step2,
- Step2,
- Step2,
- Step2,
- Step2,
- Step2,
- Step2
-};
-
-const SpriteStepFunc Unknown_8376150[] = {
- Step2,
- Step3,
- Step3,
- Step2,
- Step3,
- Step3
-};
-
-const SpriteStepFunc Unknown_8376168[] = {
- Step4,
- Step4,
- Step4,
- Step4
-};
-
-const SpriteStepFunc Unknown_8376178[] = {
- Step8,
- Step8
-};
-
-const SpriteStepFunc *const gUnknown_08376180[] = {
- Unknown_83760F0,
- Unknown_8376130,
- Unknown_8376150,
- Unknown_8376168,
- Unknown_8376178
-};
-
-const s16 gUnknown_08376194[] = {
- 16, 8, 6, 4, 2
-};
-
-const s8 Unknown_837619E[] = {
- -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0
-};
-
-const s8 Unknown_83761AE[] = {
- 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0
-};
-
-const s8 Unknown_83761BE[] = {
- -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0
-};
-
-const s8 *const gUnknown_083761D0[] = {
- Unknown_837619E,
- Unknown_83761AE,
- Unknown_83761BE
-};
-
-bool8 FreezeMapObject(struct MapObject *mapObject)
-{
- if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8)
- {
- return TRUE;
- }
- else
- {
- mapObject->mapobj_bit_8 = 1;
- mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused;
- mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused;
- gSprites[mapObject->spriteId].animPaused = 1;
- gSprites[mapObject->spriteId].affineAnimPaused = 1;
- return FALSE;
- }
-}
-
-void FreezeMapObjects(void)
-{
- u8 i;
- for (i = 0; i < 16; i++)
- if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
- FreezeMapObject(&gMapObjects[i]);
-}
-
-void FreezeMapObjectsExceptOne(u8 a1)
-{
- u8 i;
- for (i = 0; i < 16; i++)
- if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
- FreezeMapObject(&gMapObjects[i]);
-}
-
-void UnfreezeMapObject(struct MapObject *mapObject)
-{
- if (mapObject->active && mapObject->mapobj_bit_8)
- {
- mapObject->mapobj_bit_8 = 0;
- gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23;
- gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24;
- }
-}
-
-void UnfreezeMapObjects(void)
-{
- u8 i;
- for (i = 0; i < 16; i++)
- if (gMapObjects[i].active)
- UnfreezeMapObject(&gMapObjects[i]);
-}
-
-void Step1(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += gDirectionToVector[dir].x;
- sprite->pos1.y += gDirectionToVector[dir].y;
-}
-
-void Step2(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y;
-}
-
-void Step3(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y;
-}
-
-void Step4(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y;
-}
-
-void Step8(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y;
-}
-
-void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
-{
- sprite->data[3] = a2;
- sprite->data[4] = a3;
- sprite->data[5] = 0;
-}
-
-bool8 obj_npc_ministep(struct Sprite *sprite)
-{
- if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]])
- return FALSE;
-
- gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
-
- sprite->data[5]++;
-
- if (sprite->data[5] < gUnknown_08376194[sprite->data[4]])
- return FALSE;
-
- return TRUE;
-}
-
-void sub_806467C(struct Sprite *sprite, u8 a2)
-{
- sprite->data[3] = a2;
- sprite->data[4] = 0;
- sprite->data[5] = 0;
-}
-
-bool8 sub_806468C(struct Sprite *sprite)
-{
- if (!(sprite->data[4] & 1))
- {
- Step1(sprite, sprite->data[3]);
- sprite->data[5]++;
- }
-
- sprite->data[4]++;
-
- if (sprite->data[5] > 15)
- return TRUE;
- else
- return FALSE;
-}
-
-s16 sub_80646C8(s16 a1, u8 a2)
-{
- return gUnknown_083761D0[a2][a1];
-}
-
-void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
-{
- sprite->data[3] = a2;
- sprite->data[4] = a3;
- sprite->data[5] = a4;
- sprite->data[6] = 0;
-}
-
-u8 sub_8064704(struct Sprite *sprite)
-{
- s16 v5[3] = {0x10, 0x10, 0x20};
- u8 v6[3] = {0, 0, 1};
- u8 v2 = 0;
-
- if (sprite->data[4])
- Step1(sprite, sprite->data[3]);
-
- sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
-
- sprite->data[6]++;
-
- if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
- v2 = 1;
-
- if (sprite->data[6] >= v5[sprite->data[4]])
- {
- sprite->pos2.y = 0;
- v2 = -1;
- }
-
- return v2;
-}
-
-u8 sub_806478C(struct Sprite *sprite)
-{
- s16 v5[3] = {0x20, 0x20, 0x40};
- u8 v6[3] = {1, 1, 2};
- u8 v2 = 0;
-
- if (sprite->data[4] && !(sprite->data[6] & 1))
- Step1(sprite, sprite->data[3]);
-
- sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
-
- sprite->data[6]++;
-
- if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
- v2 = 1;
-
- if (sprite->data[6] >= v5[sprite->data[4]])
- {
- sprite->pos2.y = 0;
- v2 = -1;
- }
-
- return v2;
-}
-
-void sub_8064820(struct Sprite *sprite, u16 a2)
-{
- sprite->data[3] = a2;
-}
-
-bool8 sub_8064824(struct Sprite *sprite)
-{
- sprite->data[3]--;
-
- if (sprite->data[3] == 0)
- return TRUE;
- else
- return FALSE;
-}
-
-void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3)
-{
- sprite->animNum = a2;
- sprite->animPaused = 0 ;
- SeekSpriteAnim(sprite, a3);
-}
-
-bool8 sub_8064864(struct Sprite *sprite)
-{
- if (sprite->animEnded)
- return TRUE;
- else
- return FALSE;
-}
-
-void sub_806487C(struct Sprite *sprite, bool8 invisible)
-{
- u16 x, y;
- s16 x2, y2;
-
- sprite->invisible = invisible;
-
- if (sprite->coordOffsetEnabled)
- {
- x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
- y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
- }
- else
- {
- x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
- y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
- }
-
- x2 = x - (sprite->centerToCornerVecX >> 1);
- y2 = y - (sprite->centerToCornerVecY >> 1);
-
- if ((s16)x > 255 || x2 < -16)
- sprite->invisible = 1;
- if ((s16)y > 175 || y2 < -16)
- sprite->invisible = 1;
-}
-
-void sub_8064970(struct Sprite *sprite)
-{
- SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
- sub_806487C(sprite, 0);
-}
-
-void sub_8064990(u8 a1, u8 dir)
-{
- u8 i;
- for (i = 0; i < MAX_SPRITES; i++)
- {
- struct Sprite *sprite = &gSprites[i];
- if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1)
- {
- u8 animNum = FieldObjectDirectionToImageAnimId(dir);
- StartSpriteAnim(sprite, animNum);
- break;
- }
- }
-}
-
-u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
-{
- FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
- return FieldEffectStart(fieldEffectId);
-}
-
-void DoShadowFieldEffect(struct MapObject *mapObject)
-{
- if (!mapObject->mapobj_bit_22)
- {
- mapObject->mapobj_bit_22 = 1;
- oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject);
- }
-}
-
-void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
-{
- const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
- gFieldEffectArguments[0] = sprite->pos1.x;
- gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
- gFieldEffectArguments[2] = 151;
- gFieldEffectArguments[3] = 3;
- FieldEffectStart(FLDEFF_RIPPLE);
-}
diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c
index a7594372d..c4ba8902e 100644
--- a/src/field/field_player_avatar.c
+++ b/src/field/field_player_avatar.c
@@ -4,9 +4,7 @@
#include "event_data.h"
#include "field_effect.h"
#include "field_effect_helpers.h"
-#include "field_ground_effect.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "fieldmap.h"
#include "main.h"
#include "constants/map_objects.h"
diff --git a/src/field/field_special_scene.c b/src/field/field_special_scene.c
index 67b652a57..2010ebcf4 100644
--- a/src/field/field_special_scene.c
+++ b/src/field/field_special_scene.c
@@ -3,7 +3,7 @@
#include "event_data.h"
#include "field_camera.h"
#include "field_fadetransition.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_specials.h"
#include "fieldmap.h"
#include "main.h"
diff --git a/src/field/field_specials.c b/src/field/field_specials.c
index e56d9ddbb..715086f00 100644
--- a/src/field/field_specials.c
+++ b/src/field/field_specials.c
@@ -4,7 +4,7 @@
#include "fieldmap.h"
#include "event_data.h"
#include "battle_tower.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "region_map.h"
#include "field_region_map.h"
#include "field_message_box.h"
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index fbc5431ae..3f500ba50 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -1,6 +1,6 @@
#include "global.h"
#include "blend_palette.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_weather.h"
#include "palette.h"
#include "random.h"
diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c
index eff702f8c..386925531 100644
--- a/src/field/field_weather_effects.c
+++ b/src/field/field_weather_effects.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_weather.h"
#include "overworld.h"
#include "random.h"
diff --git a/src/field/fldeff_berrytree.c b/src/field/fldeff_berrytree.c
index 0763c0314..6b03e9952 100644
--- a/src/field/fldeff_berrytree.c
+++ b/src/field/fldeff_berrytree.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "script.h"
diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c
index 5d39b87a9..5bf2c5c43 100644
--- a/src/field/fldeff_cut.c
+++ b/src/field/fldeff_cut.c
@@ -2,7 +2,7 @@
#include "fldeff_cut.h"
#include "field_camera.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "map_obj_lock.h"
diff --git a/src/field/fldeff_decoration.c b/src/field/fldeff_decoration.c
index 37f024b9f..1859fc00b 100644
--- a/src/field/fldeff_decoration.c
+++ b/src/field/fldeff_decoration.c
@@ -2,7 +2,7 @@
#include "event_data.h"
#include "field_camera.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "script.h"
diff --git a/src/field/fldeff_recordmixing.c b/src/field/fldeff_recordmixing.c
index ec72885b5..716447f9c 100644
--- a/src/field/fldeff_recordmixing.c
+++ b/src/field/fldeff_recordmixing.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "fldeff_recordmixing.h"
#include "sprite.h"
diff --git a/src/field/item_menu.c b/src/field/item_menu.c
index ae1465fbd..774fdf4b2 100644
--- a/src/field/item_menu.c
+++ b/src/field/item_menu.c
@@ -4,7 +4,7 @@
#include "data2.h"
#include "decompress.h"
#include "field_effect.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "graphics.h"
#include "item.h"
diff --git a/src/field/item_use.c b/src/field/item_use.c
index 219ef5080..a0fbb13b2 100644
--- a/src/field/item_use.c
+++ b/src/field/item_use.c
@@ -8,7 +8,6 @@
#include "event_data.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
#include "field_weather.h"
#include "fieldmap.h"
diff --git a/src/field/map_obj_lock.c b/src/field/map_obj_lock.c
index 954fcb446..3bd25dbdf 100644
--- a/src/field/map_obj_lock.c
+++ b/src/field/map_obj_lock.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "map_obj_lock.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "script_movement.h"
#include "task.h"
diff --git a/src/field/overworld.c b/src/field/overworld.c
index 07135080e..8ca8aeea9 100644
--- a/src/field/overworld.c
+++ b/src/field/overworld.c
@@ -9,9 +9,7 @@
#include "field_control_avatar.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_ground_effect.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
#include "field_screen_effect.h"
diff --git a/src/field/rotating_gate.c b/src/field/rotating_gate.c
index 00008c69c..69f655a65 100644
--- a/src/field/rotating_gate.c
+++ b/src/field/rotating_gate.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "bike.h"
#include "event_data.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "fieldmap.h"
#include "constants/maps.h"
#include "constants/songs.h"
diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c
index bc5cd0b1d..e5272bc9c 100644
--- a/src/field/scrcmd.c
+++ b/src/field/scrcmd.c
@@ -12,8 +12,7 @@
#include "field_door.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
#include "field_screen_effect.h"
diff --git a/src/field/script_movement.c b/src/field/script_movement.c
index c7ce55171..653dffcbf 100644
--- a/src/field/script_movement.c
+++ b/src/field/script_movement.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "script_movement.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "task.h"
#include "util.h"
diff --git a/src/field/shop.c b/src/field/shop.c
index fdee31178..0f53eef17 100644
--- a/src/field/shop.c
+++ b/src/field/shop.c
@@ -16,7 +16,7 @@
#include "task.h"
#include "tv.h"
#include "scanline_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "item.h"
diff --git a/src/field/start_menu.c b/src/field/start_menu.c
index 4904f4a80..75b600da0 100644
--- a/src/field/start_menu.c
+++ b/src/field/start_menu.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "start_menu.h"
#include "event_data.h"
-#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
#include "field_weather.h"
#include "fieldmap.h"
diff --git a/src/field/trainer_see.c b/src/field/trainer_see.c
index 3034b2b65..2913a0a5a 100644
--- a/src/field/trainer_see.c
+++ b/src/field/trainer_see.c
@@ -2,7 +2,7 @@
#include "trainer_see.h"
#include "battle_setup.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "script.h"
#include "sprite.h"
diff --git a/src/field/tv.c b/src/field/tv.c
index 8bd36bb9c..ebf304a6e 100644
--- a/src/field/tv.c
+++ b/src/field/tv.c
@@ -21,7 +21,7 @@
#include "battle.h"
#include "link.h"
#include "constants/easy_chat.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_specials.h"
#include "item.h"
#include "constants/items.h"
diff --git a/src/rom6.c b/src/rom6.c
index 06e84cc0f..ffd01fdb9 100644
--- a/src/rom6.c
+++ b/src/rom6.c
@@ -4,7 +4,7 @@
#include "rom6.h"
#include "braille_puzzles.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "item_use.h"
#include "pokemon_menu.h"
diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c
index 60efee67d..57cb17c58 100644
--- a/src/scene/cable_car.c
+++ b/src/scene/cable_car.c
@@ -14,7 +14,7 @@
#include "constants/songs.h"
#include "decompress.h"
#include "field_weather.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "scanline_effect.h"
#include "event_data.h"
#include "cable_car_util.h"