summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-06-11 10:34:51 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-06-11 10:56:14 -0500
commiteb8dbff4a783e880d950be73963e523c86a54615 (patch)
tree0f4b63177727fa9c5db911a99bc076edbc93e056 /src
parent73327f0d44195f26d1af8b894326e1b98b609681 (diff)
Move event_object_movement_helpers into event_object_movement
Diffstat (limited to 'src')
-rw-r--r--src/event_object_movement.c747
-rwxr-xr-xsrc/event_object_movement_helpers.c704
2 files changed, 721 insertions, 730 deletions
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index 5c6f503ef..a935f20d6 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -23,6 +23,7 @@
#include "decoration.h"
#include "event_object_movement.h"
#include "pokenav.h"
+#include "util.h"
#define NUM_FIELD_MAP_OBJECT_TEMPLATES 0x51
@@ -110,7 +111,7 @@ u8 GetJumpLedgeAnimId(u32);
void sub_8092F88(u32, s16 *, s16 *, s16, s16);
bool8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *);
-void SetFieldObjectStepTimer(struct Sprite *, s16);
+static void SetFieldObjectStepTimer(struct Sprite *, s16);
bool8 RunFieldObjectStepTimer(struct Sprite *);
bool8 npc_block_way__next_tile(struct MapObject *, u8);
static u32 state_to_direction(u8, u32, u32);
@@ -129,8 +130,8 @@ static void npc_update_obj_anim_flag(struct MapObject *, struct Sprite *);
// ROM data
extern void (*const gUnknown_08505438[NUM_FIELD_MAP_OBJECT_TEMPLATES])(struct Sprite *);
-extern const u8 gUnknown_0850557C[NUM_FIELD_MAP_OBJECT_TEMPLATES];
-extern const u8 gUnknown_085055CD[NUM_FIELD_MAP_OBJECT_TEMPLATES];
+extern const u8 gRangedMovementTypes[NUM_FIELD_MAP_OBJECT_TEMPLATES];
+extern const u8 gInitialMovementTypeFacingDirections[NUM_FIELD_MAP_OBJECT_TEMPLATES];
extern const struct MapObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[7];
extern const struct MapObjectGraphicsInfo *const gFieldObjectGraphicsInfoPointers[0xEF];
extern u8 (*const gUnknown_0850D714[11])(s16, s16, s16, s16);
@@ -175,6 +176,18 @@ extern u8 (*const gUnknown_0850DEE8[5])(u8);
extern const s16 gUnknown_0850DFBC[3];
extern const s16 gUnknown_0850DFC2[3];
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
+
+extern s16 gUnknown_0850E768[];
+extern SpriteStepFunc *const gUnknown_0850E754[];
+extern const s8 gUnknown_0850E772[];
+extern const s8 gUnknown_0850E7BA[];
+extern const s8 *const gUnknown_0850E834[];
+extern s16 gUnknown_0850E840[];
+extern u8 gUnknown_0850E846[];
+extern s16 gUnknown_0850E84A[];
+extern u8 gUnknown_0850E850[];
+
static void FieldObjectUpdateMetatileBehaviors(struct MapObject*);
/*static*/ void GetAllGroundEffectFlags_OnBeginStep(struct MapObject*, u32*);
/*static*/ void GetGroundEffectFlags_Reflection(struct MapObject*, u32*);
@@ -202,6 +215,8 @@ static void DoTracksGroundEffect_BikeTireTracks(struct MapObject*, struct Sprite
static void DoGroundEffects_OnSpawn(struct MapObject*, struct Sprite*);
static void DoGroundEffects_OnBeginStep(struct MapObject*, struct Sprite*);
static void DoGroundEffects_OnFinishStep(struct MapObject*, struct Sprite*);
+static void sub_8097D68(struct Sprite*);
+static void sub_8097FE4(u8);
// Code
@@ -359,15 +374,15 @@ static u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u
mapObject->currentElevation = template->elevation;
mapObject->previousElevation = template->elevation;
// For some reason, 0x0F is placed in r9, to be used later
- mapObject->range.as_nybbles.x = template->unkA_0;
- mapObject->range.as_nybbles.y = template->unkA_4;
- mapObject->trainerType = template->unkC;
- mapObject->trainerRange_berryTreeId = template->unkE;
- mapObject->previousMovementDirection = gUnknown_085055CD[template->movementType];
+ mapObject->range.as_nybbles.x = template->movementRangeX;
+ mapObject->range.as_nybbles.y = template->movementRangeY;
+ mapObject->trainerType = template->trainerType;
+ mapObject->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
+ mapObject->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType];
FieldObjectSetDirection(mapObject, mapObject->previousMovementDirection);
FieldObjectHandleDynamicGraphicsId(mapObject);
- if (gUnknown_0850557C[mapObject->movementType])
+ if (gRangedMovementTypes[mapObject->movementType])
{
if ((mapObject->range.as_nybbles.x) == 0)
{
@@ -478,7 +493,7 @@ static NAKED u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *templ
"\tstrb r0, [r4, 0x7]\n"
"\tldrh r0, [r5, 0xE]\n"
"\tstrb r0, [r4, 0x1D]\n"
- "\tldr r1, =gUnknown_085055CD\n"
+ "\tldr r1, =gInitialMovementTypeFacingDirections\n"
"\tldrb r0, [r5, 0x9]\n"
"\tadds r0, r1\n"
"\tldrb r1, [r0]\n"
@@ -490,7 +505,7 @@ static NAKED u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *templ
"\tbl FieldObjectSetDirection\n"
"\tadds r0, r4, 0\n"
"\tbl FieldObjectHandleDynamicGraphicsId\n"
- "\tldr r1, =gUnknown_0850557C\n"
+ "\tldr r1, =gRangedMovementTypes\n"
"\tldrb r0, [r4, 0x6]\n"
"\tadds r0, r1\n"
"\tldrb r0, [r0]\n"
@@ -744,10 +759,10 @@ u8 SpawnSpecialFieldObjectParametrized(u8 graphicsId, u8 movementBehavior, u8 lo
mapObjectTemplate.y = y;
mapObjectTemplate.elevation = z;
mapObjectTemplate.movementType = movementBehavior;
- mapObjectTemplate.unkA_0 = 0;
- mapObjectTemplate.unkA_4 = 0;
- mapObjectTemplate.unkC = 0;
- mapObjectTemplate.unkE = 0;
+ mapObjectTemplate.movementRangeX = 0;
+ mapObjectTemplate.movementRangeY = 0;
+ mapObjectTemplate.trainerType = 0;
+ mapObjectTemplate.trainerRange_berryTreeId = 0;
return SpawnSpecialFieldObject(&mapObjectTemplate);
}
@@ -3125,7 +3140,7 @@ bool8 sub_8090F30 (struct MapObject *mapObject, struct Sprite *sprite)
{
u8 direction;
- direction = gUnknown_085055CD[mapObject->movementType];
+ direction = gInitialMovementTypeFacingDirections[mapObject->movementType];
if (mapObject->directionSequenceIndex)
{
direction = GetOppositeDirection(direction);
@@ -3284,7 +3299,7 @@ bool8 sub_8091F48(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
bool8 sub_8091F4C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8))
{
- FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, playerDirection)));
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, playerDirection)));
mapObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
return TRUE;
@@ -3303,7 +3318,7 @@ bool8 sub_8091F94(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
if (direction == 0)
{
direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
mapObject->singleMovementActive = TRUE;
@@ -3313,7 +3328,7 @@ bool8 sub_8091F94(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
}
else
{
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
}
FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction));
@@ -3333,7 +3348,7 @@ bool8 sub_80920A4(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
s16 y;
direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed1AnimId(direction));
if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
@@ -3352,7 +3367,7 @@ bool8 sub_809215C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
s16 y;
direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed3AnimId(direction));
if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
@@ -3371,7 +3386,7 @@ bool8 sub_8092214(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
s16 y;
direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
FieldObjectSetRegularAnim(mapObject, sprite, sub_8093438(direction));
if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
@@ -3388,7 +3403,7 @@ bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 pl
u32 direction;
direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
FieldObjectSetRegularAnim(mapObject, sprite, sub_80934BC(direction));
mapObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
@@ -3402,7 +3417,7 @@ bool8 sub_8092314(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
s16 y;
direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
FieldObjectSetRegularAnim(mapObject, sprite, sub_8093514(direction));
if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y))))
@@ -3421,7 +3436,7 @@ bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerD
s16 y;
direction = playerDirection;
- direction = state_to_direction(gUnknown_085055CD[mapObject->movementType], mapObject->directionSequenceIndex, direction);
+ direction = state_to_direction(gInitialMovementTypeFacingDirections[mapObject->movementType], mapObject->directionSequenceIndex, direction);
x = mapObject->currentCoords.x;
y = mapObject->currentCoords.y;
sub_8092F88(direction, &x, &y, 2, 2);
@@ -4669,7 +4684,7 @@ maybe_shadow_1_macro(sub_80953E0, maybe_shadow_1, sub_80941E0, DIR_EAST, 0, 2)
bool8 sub_8095438(struct MapObject *mapObject, struct Sprite *sprite)
{
- an_look_any(mapObject, sprite, gUnknown_085055CD[mapObject->movementType]);
+ an_look_any(mapObject, sprite, gInitialMovementTypeFacingDirections[mapObject->movementType]);
return TRUE;
}
@@ -5894,3 +5909,683 @@ static void DoGroundEffects_OnFinishStep(struct MapObject *eventObj, struct Spri
eventObj->landingJump = 0;
}
}
+
+bool8 FreezeMapObject(struct MapObject *mapObject)
+{
+ if (mapObject->heldMovementActive || mapObject->frozen)
+ {
+ return TRUE;
+ }
+ else
+ {
+ mapObject->frozen = 1;
+ mapObject->spriteAnimPausedBackup = gSprites[mapObject->spriteId].animPaused;
+ mapObject->spriteAffineAnimPausedBackup = 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 < MAP_OBJECTS_COUNT; i++)
+ if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void FreezeMapObjectsExceptOne(u8 a1)
+{
+ u8 i;
+ for (i = 0; i < MAP_OBJECTS_COUNT; i++)
+ if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void npc_sync_anim_pause_bits(struct MapObject *mapObject)
+{
+ if (mapObject->active && mapObject->frozen)
+ {
+ mapObject->frozen = 0;
+ gSprites[mapObject->spriteId].animPaused = mapObject->spriteAnimPausedBackup;
+ gSprites[mapObject->spriteId].affineAnimPaused = mapObject->spriteAffineAnimPausedBackup;
+ }
+}
+
+void UnfreezeMapObjects(void)
+{
+ u8 i;
+ for (i = 0; i < MAP_OBJECTS_COUNT; i++)
+ if (gMapObjects[i].active)
+ npc_sync_anim_pause_bits(&gMapObjects[i]);
+}
+
+void little_step(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += gUnknown_0850DB7C[dir].y;
+}
+
+void double_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y;
+}
+
+void triple_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x + (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y + (u16) gUnknown_0850DB7C[dir].y;
+}
+
+void quad_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 4 * (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 4 * (u16) gUnknown_0850DB7C[dir].y;
+}
+
+void oct_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 8 * (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 8 * (u16) gUnknown_0850DB7C[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_0850E768[sprite->data[4]])
+ return FALSE;
+
+ gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
+
+ sprite->data[5]++;
+
+ if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]])
+ return FALSE;
+
+ return TRUE;
+}
+
+void sub_80976DC(struct Sprite *sprite, u8 a2)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+}
+
+bool8 sub_80976EC(struct Sprite *sprite)
+{
+ if (!(sprite->data[4] & 1))
+ {
+ little_step(sprite, sprite->data[3]);
+ sprite->data[5]++;
+ }
+
+ sprite->data[4]++;
+
+ if (sprite->data[5] > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+// new helper added here in the middle. Perhaps Game Freak kept these organized in alphebetical order or some other heirarchy?
+
+s16 sub_8097728(s16 a1)
+{
+ return gUnknown_0850E7BA[a1];
+}
+
+s16 sub_809773C(s16 a1)
+{
+ return gUnknown_0850E772[a1];
+}
+
+void sub_8097750(struct Sprite *sprite)
+{
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
+}
+
+bool8 sub_8097758(struct Sprite *sprite)
+{
+ bool8 result = FALSE;
+
+ switch(sprite->data[7])
+ {
+ case 0:
+ sprite->pos2.x += sub_809773C(sprite->data[6]);
+ sprite->pos2.y += sub_8097728(sprite->data[6]);
+ break;
+ case 1:
+ sprite->pos2.x -= sub_809773C(0x47 - sprite->data[6]);
+ sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
+ break;
+ case 2:
+ sprite->pos2.x -= sub_809773C(sprite->data[6]);
+ sprite->pos2.y += sub_8097728(sprite->data[6]);
+ break;
+ case 3:
+ sprite->pos2.x += sub_809773C(0x47 - sprite->data[6]);
+ sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
+ break;
+ }
+ if(++sprite->data[6] == 0x48)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7]++;
+ }
+ if(sprite->data[7] == 0x4)
+ {
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ result = TRUE;
+ }
+ return result;
+}
+
+s16 sub_8097820(s16 a1, u8 a2)
+{
+ return gUnknown_0850E834[a2][a1];
+}
+
+void sub_809783C(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_809785C(struct Sprite *sprite)
+{
+ s16 v5[3];
+ u8 v6[3];
+ u8 v2;
+
+ memcpy(v5, gUnknown_0850E840, 6); // TODO: get rid of memcpy
+ memcpy(v6, gUnknown_0850E846, 3);
+ v2 = 0;
+
+ if (sprite->data[4])
+ little_step(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_8097820(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_80978E4(struct Sprite *sprite)
+{
+ s16 v5[3];
+ u8 v6[3];
+ u8 v2;
+
+ memcpy(v5, gUnknown_0850E84A, 6);
+ memcpy(v6, gUnknown_0850E850, 3);
+ v2 = 0;
+
+ if (sprite->data[4] && !(sprite->data[6] & 1))
+ little_step(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_8097820(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 SetFieldObjectStepTimer(struct Sprite *sprite, s16 timer)
+{
+ sprite->data[3] = timer;
+}
+
+bool8 RunFieldObjectStepTimer(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_80979BC(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_80979D4(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_8097AC8(struct Sprite *sprite)
+{
+ sub_8097D68(sprite);
+ SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
+ sub_80979D4(sprite, sprite->data[2]);
+}
+
+void sub_8097AF0(void)
+{
+ int i;
+
+ for(i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if(sprite->inUse && sprite->callback == sub_8097AC8)
+ DestroySprite(sprite);
+ }
+}
+
+int sub_8097B2C(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
+{
+ int i;
+
+ for(i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if(sprite->inUse && sprite->callback == sub_8097AC8 && (u8)sprite->data[0] == var)
+ return i;
+ }
+ return MAX_SPRITES;
+}
+
+void sub_8097B78(u8 var1, u8 var2)
+{
+ u8 spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(var2));
+}
+
+void sub_8097BB4(u8 var1, u8 var2)
+{
+ int spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(var2);
+ u16 tileNum = sprite->oam.tileNum;
+
+ sprite->oam = *gfxInfo->oam;
+ sprite->oam.tileNum = tileNum;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->images = gfxInfo->images;
+
+ if(gfxInfo->subspriteTables == NULL)
+ {
+ sprite->subspriteTables = NULL;
+ sprite->subspriteTableNum = 0;
+ sprite->subspriteMode = 0;
+ }
+ else
+ {
+ SetSubspriteTables(sprite, gfxInfo->subspriteTables);
+ sprite->subspriteMode = 2;
+ }
+ StartSpriteAnim(sprite, 0);
+ }
+}
+
+void sub_8097C44(u8 var, bool32 var2)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return;
+
+ if(var2)
+ gSprites[spriteId].data[2] = 1;
+ else
+ gSprites[spriteId].data[2] = 0;
+}
+
+bool32 sub_8097C8C(u8 var)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return FALSE;
+
+ return (gSprites[spriteId].data[2] == TRUE);
+}
+
+void sub_8097CC4(u8 var1, u8 var2)
+{
+ u8 spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[3] = var2;
+ gSprites[spriteId].data[4] = 0;
+ }
+}
+
+void sub_8097CF4(struct Sprite *sprite)
+{
+ switch(sprite->data[4])
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ sprite->data[4]++;
+ case 1:
+ sprite->pos2.y -= 8;
+ if(sprite->pos2.y == -160)
+ {
+ sprite->pos2.y = 0;
+ sprite->data[2] = 1;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+ }
+}
+
+void sub_8097D30(struct Sprite *sprite)
+{
+ switch(sprite->data[4])
+ {
+ case 0:
+ sprite->pos2.y = -160;
+ sprite->data[4]++;
+ case 1:
+ sprite->pos2.y += 8;
+ if(sprite->pos2.y == 0)
+ {
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+ }
+}
+
+static void sub_8097D68(struct Sprite *sprite)
+{
+ switch(sprite->data[3])
+ {
+ case 1:
+ sub_8097D30(sprite);
+ break;
+ case 2:
+ sub_8097CF4(sprite);
+ break;
+ case 0:
+ break;
+ default:
+ sprite->data[3] = 0;
+ break;
+ }
+}
+
+bool32 sub_8097D9C(u8 var)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return FALSE;
+
+ if(gSprites[spriteId].data[3] != FALSE)
+ return TRUE;
+
+ return FALSE;
+}
+
+u32 StartFieldEffectForEventObject(u8 fieldEffectId, struct MapObject *mapObject)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ return FieldEffectStart(fieldEffectId);
+}
+
+void DoShadowFieldEffect(struct MapObject *mapObject)
+{
+ if (!mapObject->hasShadow)
+ {
+ mapObject->hasShadow = 1;
+ StartFieldEffectForEventObject(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);
+}
+
+bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u32 one;
+ bool32 ableToStore = FALSE;
+ if (gUnknown_020375B8 == NULL)
+ {
+ gUnknown_020375B8 = AllocZeroed(0x14);
+ gUnknown_020375B8[0] = mapObject->localId;
+ // needed to match
+ gUnknown_020375B8[16] = (one = 1);
+ ableToStore = one;
+ }
+ else
+ {
+ u8 i;
+ u8 firstFreeSlot;
+ bool32 found;
+ for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
+ {
+ if (firstFreeSlot == 16 && gUnknown_020375B8[i] == 0)
+ firstFreeSlot = i;
+
+ if (gUnknown_020375B8[i] == mapObject->localId)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found && firstFreeSlot != 16)
+ {
+ gUnknown_020375B8[firstFreeSlot] = mapObject->localId;
+ gUnknown_020375B8[16]++;
+ ableToStore = TRUE;
+ }
+ }
+
+ if (ableToStore == TRUE)
+ {
+ mapObject->inanimate = TRUE;
+ mapObject->facingDirectionLocked = TRUE;
+ }
+
+ sprite->data[2] = 1;
+ return TRUE;
+}
+
+bool32 sub_8097EF0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ bool32 ableToStore;
+ u8 id;
+
+ sprite->data[2] = 1;
+ if (gUnknown_020375B8 != NULL)
+ {
+ ableToStore = FALSE;
+ id = sub_8097F78(mapObject);
+ if (id != 16)
+ {
+ gUnknown_020375B8[id] = 0;
+ gUnknown_020375B8[16]--;
+ ableToStore = TRUE;
+ }
+ if (gUnknown_020375B8[16] == 0)
+ FREE_AND_SET_NULL(gUnknown_020375B8);
+ if (ableToStore == TRUE)
+ {
+ mapObject->inanimate = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate;
+ mapObject->facingDirectionLocked = 0;
+ sprite->animPaused = 0;
+ }
+ }
+
+ return TRUE;
+}
+
+u8 sub_8097F78(struct MapObject *mapObject)
+{
+ u8 i;
+
+ for(i = 0; i < MAP_OBJECTS_COUNT; i++)
+ {
+ if(gUnknown_020375B8[i] == mapObject->localId)
+ return i;
+ }
+ return MAP_OBJECTS_COUNT;
+}
+
+void sub_8097FA4(struct MapObject *mapObject)
+{
+ u8 taskId = CreateTask(sub_8097FE4, 0xFF);
+ struct Task *task = &gTasks[taskId];
+
+ StoreWordInTwoHalfwords(&task->data[0], (u32)mapObject);
+ mapObject->warpArrowSpriteId = taskId;
+ task->data[3] = 0xFFFF;
+}
+
+static void sub_8097FE4(u8 taskId)
+{
+ struct MapObject *mapObject;
+ struct Sprite *sprite;
+ struct Task *task = &gTasks[taskId];
+
+ LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&mapObject); // load the map object pointer.
+ sprite = &gSprites[mapObject->spriteId];
+
+ if(!(task->data[2] & 0x3))
+ sprite->pos2.y += task->data[3];
+
+ if(!(task->data[2] & 0xF))
+ task->data[3] = -task->data[3];
+
+ task->data[2]++;
+}
+
+void sub_8098044(u8 taskId)
+{
+ u32 word;
+ struct Task *task = &gTasks[taskId];
+
+ LoadWordFromTwoHalfwords(&task->data[0], &word); // huh??? why does it load a word that never gets used???
+ DestroyTask(taskId);
+}
+
+void sub_8098074(u8 var1, u8 var2)
+{
+ u8 i;
+
+ for(i = 0; i < MAP_OBJECTS_COUNT; i++)
+ {
+ if(i != var1 && i != var2 &&
+ gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+ }
+}
+
+bool32 sub_80980C0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y = 0;
+ sprite->data[2]++;
+ return FALSE;
+}
+
+bool32 sub_80980D0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y -= 8;
+
+ if(sprite->pos2.y == -160)
+ sprite->data[2]++;
+ return FALSE;
+}
+
+bool32 sub_80980F4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y = -160;
+ sprite->data[2]++;
+ return FALSE;
+}
+
+bool32 sub_8098108(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y += 8;
+
+ if(!sprite->pos2.y)
+ sprite->data[2]++;
+ return FALSE;
+}
+
+// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it.
+bool32 sub_8098124(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return TRUE;
+}
diff --git a/src/event_object_movement_helpers.c b/src/event_object_movement_helpers.c
deleted file mode 100755
index 6a8b410f5..000000000
--- a/src/event_object_movement_helpers.c
+++ /dev/null
@@ -1,704 +0,0 @@
-#include "global.h"
-#include "event_object_movement.h"
-#include "field_effect.h"
-#include "event_object_movement_helpers.h"
-#include "malloc.h"
-#include "task.h"
-#include "util.h"
-
-typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
-
-extern const struct Coords16 gUnknown_0850DB7C[4];
-extern s16 gUnknown_0850E768[];
-extern SpriteStepFunc *const gUnknown_0850E754[];
-extern const s8 gUnknown_0850E772[];
-extern const s8 gUnknown_0850E7BA[];
-extern const s8 *const gUnknown_0850E834[];
-extern s16 gUnknown_0850E840[];
-extern u8 gUnknown_0850E846[];
-extern s16 gUnknown_0850E84A[];
-extern u8 gUnknown_0850E850[];
-
-void sub_8097D68(struct Sprite *sprite);
-void sub_8097FE4(u8);
-
-bool8 FreezeMapObject(struct MapObject *mapObject)
-{
- if (mapObject->heldMovementActive || mapObject->frozen)
- {
- return TRUE;
- }
- else
- {
- mapObject->frozen = 1;
- mapObject->spriteAnimPausedBackup = gSprites[mapObject->spriteId].animPaused;
- mapObject->spriteAffineAnimPausedBackup = 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 < MAP_OBJECTS_COUNT; i++)
- if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
- FreezeMapObject(&gMapObjects[i]);
-}
-
-void FreezeMapObjectsExceptOne(u8 a1)
-{
- u8 i;
- for (i = 0; i < MAP_OBJECTS_COUNT; i++)
- if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
- FreezeMapObject(&gMapObjects[i]);
-}
-
-void npc_sync_anim_pause_bits(struct MapObject *mapObject)
-{
- if (mapObject->active && mapObject->frozen)
- {
- mapObject->frozen = 0;
- gSprites[mapObject->spriteId].animPaused = mapObject->spriteAnimPausedBackup;
- gSprites[mapObject->spriteId].affineAnimPaused = mapObject->spriteAffineAnimPausedBackup;
- }
-}
-
-void UnfreezeMapObjects(void)
-{
- u8 i;
- for (i = 0; i < MAP_OBJECTS_COUNT; i++)
- if (gMapObjects[i].active)
- npc_sync_anim_pause_bits(&gMapObjects[i]);
-}
-
-void little_step(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += gUnknown_0850DB7C[dir].x;
- sprite->pos1.y += gUnknown_0850DB7C[dir].y;
-}
-
-void double_little_steps(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x;
- sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y;
-}
-
-void triple_little_steps(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x + (u16) gUnknown_0850DB7C[dir].x;
- sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y + (u16) gUnknown_0850DB7C[dir].y;
-}
-
-void quad_little_steps(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 4 * (u16) gUnknown_0850DB7C[dir].x;
- sprite->pos1.y += 4 * (u16) gUnknown_0850DB7C[dir].y;
-}
-
-void oct_little_steps(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 8 * (u16) gUnknown_0850DB7C[dir].x;
- sprite->pos1.y += 8 * (u16) gUnknown_0850DB7C[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_0850E768[sprite->data[4]])
- return FALSE;
-
- gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
-
- sprite->data[5]++;
-
- if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]])
- return FALSE;
-
- return TRUE;
-}
-
-void sub_80976DC(struct Sprite *sprite, u8 a2)
-{
- sprite->data[3] = a2;
- sprite->data[4] = 0;
- sprite->data[5] = 0;
-}
-
-bool8 sub_80976EC(struct Sprite *sprite)
-{
- if (!(sprite->data[4] & 1))
- {
- little_step(sprite, sprite->data[3]);
- sprite->data[5]++;
- }
-
- sprite->data[4]++;
-
- if (sprite->data[5] > 15)
- return TRUE;
- else
- return FALSE;
-}
-
-// new helper added here in the middle. Perhaps Game Freak kept these organized in alphebetical order or some other heirarchy?
-
-s16 sub_8097728(s16 a1)
-{
- return gUnknown_0850E7BA[a1];
-}
-
-s16 sub_809773C(s16 a1)
-{
- return gUnknown_0850E772[a1];
-}
-
-void sub_8097750(struct Sprite *sprite)
-{
- sprite->data[6] = 0;
- sprite->data[7] = 0;
-}
-
-bool8 sub_8097758(struct Sprite *sprite)
-{
- bool8 result = FALSE;
-
- switch(sprite->data[7])
- {
- case 0:
- sprite->pos2.x += sub_809773C(sprite->data[6]);
- sprite->pos2.y += sub_8097728(sprite->data[6]);
- break;
- case 1:
- sprite->pos2.x -= sub_809773C(0x47 - sprite->data[6]);
- sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
- break;
- case 2:
- sprite->pos2.x -= sub_809773C(sprite->data[6]);
- sprite->pos2.y += sub_8097728(sprite->data[6]);
- break;
- case 3:
- sprite->pos2.x += sub_809773C(0x47 - sprite->data[6]);
- sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
- break;
- }
- if(++sprite->data[6] == 0x48)
- {
- sprite->data[6] = 0;
- sprite->data[7]++;
- }
- if(sprite->data[7] == 0x4)
- {
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
- result = TRUE;
- }
- return result;
-}
-
-s16 sub_8097820(s16 a1, u8 a2)
-{
- return gUnknown_0850E834[a2][a1];
-}
-
-void sub_809783C(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_809785C(struct Sprite *sprite)
-{
- s16 v5[3];
- u8 v6[3];
- u8 v2;
-
- memcpy(v5, gUnknown_0850E840, 6); // TODO: get rid of memcpy
- memcpy(v6, gUnknown_0850E846, 3);
- v2 = 0;
-
- if (sprite->data[4])
- little_step(sprite, sprite->data[3]);
-
- sprite->pos2.y = sub_8097820(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_80978E4(struct Sprite *sprite)
-{
- s16 v5[3];
- u8 v6[3];
- u8 v2;
-
- memcpy(v5, gUnknown_0850E84A, 6);
- memcpy(v6, gUnknown_0850E850, 3);
- v2 = 0;
-
- if (sprite->data[4] && !(sprite->data[6] & 1))
- little_step(sprite, sprite->data[3]);
-
- sprite->pos2.y = sub_8097820(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 SetFieldObjectStepTimer(struct Sprite *sprite, u16 timer)
-{
- sprite->data[3] = timer;
-}
-
-
-bool8 RunFieldObjectStepTimer(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_80979BC(struct Sprite *sprite)
-{
- if (sprite->animEnded)
- return TRUE;
- else
- return FALSE;
-}
-
-void sub_80979D4(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_8097AC8(struct Sprite *sprite)
-{
- sub_8097D68(sprite);
- SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
- sub_80979D4(sprite, sprite->data[2]);
-}
-
-void sub_8097AF0(void)
-{
- int i;
-
- for(i = 0; i < MAX_SPRITES; i++)
- {
- struct Sprite *sprite = &gSprites[i];
- if(sprite->inUse && sprite->callback == sub_8097AC8)
- DestroySprite(sprite);
- }
-}
-
-int sub_8097B2C(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
-{
- int i;
-
- for(i = 0; i < MAX_SPRITES; i++)
- {
- struct Sprite *sprite = &gSprites[i];
- if(sprite->inUse && sprite->callback == sub_8097AC8 && (u8)sprite->data[0] == var)
- return i;
- }
- return MAX_SPRITES;
-}
-
-void sub_8097B78(u8 var1, u8 var2)
-{
- u8 spriteId = sub_8097B2C(var1);
-
- if(spriteId != MAX_SPRITES)
- StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(var2));
-}
-
-void sub_8097BB4(u8 var1, u8 var2)
-{
- int spriteId = sub_8097B2C(var1);
-
- if(spriteId != MAX_SPRITES)
- {
- struct Sprite *sprite = &gSprites[spriteId];
- const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(var2);
- u16 tileNum = sprite->oam.tileNum;
-
- sprite->oam = *gfxInfo->oam;
- sprite->oam.tileNum = tileNum;
- sprite->oam.paletteNum = gfxInfo->paletteSlot;
- sprite->images = gfxInfo->images;
-
- if(gfxInfo->subspriteTables == NULL)
- {
- sprite->subspriteTables = NULL;
- sprite->subspriteTableNum = 0;
- sprite->subspriteMode = 0;
- }
- else
- {
- SetSubspriteTables(sprite, gfxInfo->subspriteTables);
- sprite->subspriteMode = 2;
- }
- StartSpriteAnim(sprite, 0);
- }
-}
-
-void sub_8097C44(u8 var, bool32 var2)
-{
- u8 spriteId = sub_8097B2C(var);
-
- if(spriteId == MAX_SPRITES)
- return;
-
- if(var2)
- gSprites[spriteId].data[2] = 1;
- else
- gSprites[spriteId].data[2] = 0;
-}
-
-bool32 sub_8097C8C(u8 var)
-{
- u8 spriteId = sub_8097B2C(var);
-
- if(spriteId == MAX_SPRITES)
- return FALSE;
-
- return (gSprites[spriteId].data[2] == TRUE);
-}
-
-void sub_8097CC4(u8 var1, u8 var2)
-{
- u8 spriteId = sub_8097B2C(var1);
-
- if(spriteId != MAX_SPRITES)
- {
- gSprites[spriteId].data[3] = var2;
- gSprites[spriteId].data[4] = 0;
- }
-}
-
-void sub_8097CF4(struct Sprite *sprite)
-{
- switch(sprite->data[4])
- {
- case 0:
- sprite->pos2.y = 0;
- sprite->data[4]++;
- case 1:
- sprite->pos2.y -= 8;
- if(sprite->pos2.y == -160)
- {
- sprite->pos2.y = 0;
- sprite->data[2] = 1;
- sprite->data[3] = 0;
- sprite->data[4] = 0;
- }
- }
-}
-
-void sub_8097D30(struct Sprite *sprite)
-{
- switch(sprite->data[4])
- {
- case 0:
- sprite->pos2.y = -160;
- sprite->data[4]++;
- case 1:
- sprite->pos2.y += 8;
- if(sprite->pos2.y == 0)
- {
- sprite->data[3] = 0;
- sprite->data[4] = 0;
- }
- }
-}
-
-void sub_8097D68(struct Sprite *sprite)
-{
- switch(sprite->data[3])
- {
- case 1:
- sub_8097D30(sprite);
- break;
- case 2:
- sub_8097CF4(sprite);
- break;
- case 0:
- break;
- default:
- sprite->data[3] = 0;
- break;
- }
-}
-
-bool32 sub_8097D9C(u8 var)
-{
- u8 spriteId = sub_8097B2C(var);
-
- if(spriteId == MAX_SPRITES)
- return FALSE;
-
- if(gSprites[spriteId].data[3] != FALSE)
- return TRUE;
-
- return FALSE;
-}
-
-u32 StartFieldEffectForEventObject(u8 fieldEffectId, struct MapObject *mapObject)
-{
- FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
- return FieldEffectStart(fieldEffectId);
-}
-
-void DoShadowFieldEffect(struct MapObject *mapObject)
-{
- if (!mapObject->hasShadow)
- {
- mapObject->hasShadow = 1;
- StartFieldEffectForEventObject(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);
-}
-
-bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
-{
- u32 one;
- bool32 ableToStore = FALSE;
- if (gUnknown_020375B8 == NULL)
- {
- gUnknown_020375B8 = AllocZeroed(0x14);
- gUnknown_020375B8[0] = mapObject->localId;
- // needed to match
- gUnknown_020375B8[16] = (one = 1);
- ableToStore = one;
- }
- else
- {
- u8 i;
- u8 firstFreeSlot;
- bool32 found;
- for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
- {
- if (firstFreeSlot == 16 && gUnknown_020375B8[i] == 0)
- firstFreeSlot = i;
-
- if (gUnknown_020375B8[i] == mapObject->localId)
- {
- found = TRUE;
- break;
- }
- }
-
- if (!found && firstFreeSlot != 16)
- {
- gUnknown_020375B8[firstFreeSlot] = mapObject->localId;
- gUnknown_020375B8[16]++;
- ableToStore = TRUE;
- }
- }
-
- if (ableToStore == TRUE)
- {
- mapObject->inanimate = TRUE;
- mapObject->facingDirectionLocked = TRUE;
- }
-
- sprite->data[2] = 1;
- return TRUE;
-}
-
-bool32 sub_8097EF0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- bool32 ableToStore;
- u8 id;
-
- sprite->data[2] = 1;
- if (gUnknown_020375B8 != NULL)
- {
- ableToStore = FALSE;
- id = sub_8097F78(mapObject);
- if (id != 16)
- {
- gUnknown_020375B8[id] = 0;
- gUnknown_020375B8[16]--;
- ableToStore = TRUE;
- }
- if (gUnknown_020375B8[16] == 0)
- FREE_AND_SET_NULL(gUnknown_020375B8);
- if (ableToStore == TRUE)
- {
- mapObject->inanimate = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate;
- mapObject->facingDirectionLocked = 0;
- sprite->animPaused = 0;
- }
- }
-
- return TRUE;
-}
-
-u8 sub_8097F78(struct MapObject *mapObject)
-{
- u8 i;
-
- for(i = 0; i < MAP_OBJECTS_COUNT; i++)
- {
- if(gUnknown_020375B8[i] == mapObject->localId)
- return i;
- }
- return MAP_OBJECTS_COUNT;
-}
-
-void sub_8097FA4(struct MapObject *mapObject)
-{
- u8 taskId = CreateTask(sub_8097FE4, 0xFF);
- struct Task *task = &gTasks[taskId];
-
- StoreWordInTwoHalfwords(&task->data[0], (u32)mapObject);
- mapObject->warpArrowSpriteId = taskId;
- task->data[3] = 0xFFFF;
-}
-
-void sub_8097FE4(u8 taskId)
-{
- struct MapObject *mapObject;
- struct Sprite *sprite;
- struct Task *task = &gTasks[taskId];
-
- LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&mapObject); // load the map object pointer.
- sprite = &gSprites[mapObject->spriteId];
-
- if(!(task->data[2] & 0x3))
- sprite->pos2.y += task->data[3];
-
- if(!(task->data[2] & 0xF))
- task->data[3] = -task->data[3];
-
- task->data[2]++;
-}
-
-void sub_8098044(u8 taskId)
-{
- u32 word;
- struct Task *task = &gTasks[taskId];
-
- LoadWordFromTwoHalfwords(&task->data[0], &word); // huh??? why does it load a word that never gets used???
- DestroyTask(taskId);
-}
-
-void sub_8098074(u8 var1, u8 var2)
-{
- u8 i;
-
- for(i = 0; i < MAP_OBJECTS_COUNT; i++)
- {
- if(i != var1 && i != var2 &&
- gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
- FreezeMapObject(&gMapObjects[i]);
- }
-}
-
-bool32 sub_80980C0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->pos2.y = 0;
- sprite->data[2]++;
- return FALSE;
-}
-
-bool32 sub_80980D0(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->pos2.y -= 8;
-
- if(sprite->pos2.y == -160)
- sprite->data[2]++;
- return FALSE;
-}
-
-bool32 sub_80980F4(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->pos2.y = -160;
- sprite->data[2]++;
- return FALSE;
-}
-
-bool32 sub_8098108(struct MapObject *mapObject, struct Sprite *sprite)
-{
- sprite->pos2.y += 8;
-
- if(!sprite->pos2.y)
- sprite->data[2]++;
- return FALSE;
-}
-
-// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it.
-bool32 sub_8098124(struct MapObject *mapObject, struct Sprite *sprite)
-{
- return TRUE;
-}