summaryrefslogtreecommitdiff
path: root/src/event_object_movement.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event_object_movement.c')
-rw-r--r--src/event_object_movement.c219
1 files changed, 97 insertions, 122 deletions
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index de5536240..72de880c8 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -130,6 +130,9 @@ static struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId,
static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *);
static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8);
static void oamt_npc_ministep_reset(struct Sprite *, u8, u8);
+static void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *);
+static void InitSpriteForFigure8Anim(struct Sprite *sprite);
+static bool8 AnimateSpriteInFigure8(struct Sprite *sprite);
static void UpdateObjectEventSprite(struct Sprite *);
const u8 gReflectionEffectPaletteMap[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
@@ -1122,13 +1125,13 @@ void ResetObjectEvents(void)
static void CreateReflectionEffectSprites(void)
{
- u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31);
+ u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31);
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 0);
gSprites[spriteId].invisible = TRUE;
- spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31);
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 1);
@@ -1220,7 +1223,6 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template,
objectEvent->movementType = template->movementType;
objectEvent->localId = template->localId;
objectEvent->mapNum = mapNum;
- objectEvent++; objectEvent--;
objectEvent->mapGroup = mapGroup;
objectEvent->initialCoords.x = x;
objectEvent->initialCoords.y = y;
@@ -1233,13 +1235,11 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template,
objectEvent->range.as_nybbles.x = template->movementRangeX;
objectEvent->range.as_nybbles.y = template->movementRangeY;
objectEvent->trainerType = template->trainerType;
+ objectEvent->mapNum = mapNum; //redundant, but needed to match
objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType];
SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection);
SetObjectEventDynamicGraphicsId(objectEvent);
-#ifndef NONMATCHING
- asm("":::"r5", "r6");
-#endif
if (gRangedMovementTypes[objectEvent->movementType])
{
if (objectEvent->range.as_nybbles.x == 0)
@@ -1949,7 +1949,7 @@ void sub_808E7E4(u8 localId, u8 mapNum, u8 mapGroup)
}
}
-void sub_808E82C(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
+void SetObjectEventSpritePosByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
{
u8 objectEventId;
struct Sprite *sprite;
@@ -2340,7 +2340,13 @@ const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId)
static u16 GetObjectEventFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{
- return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->flagId;
+ struct ObjectEventTemplate *obj = GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup);
+#ifdef UBFIX
+ // BUG: The function may return NULL, and attempting to read from NULL may freeze the game using modern compilers.
+ if (obj == NULL)
+ return 0;
+#endif // UBFIX
+ return obj->flagId;
}
static u16 GetObjectEventFlagIdByObjectEventId(u8 objectEventId)
@@ -6868,15 +6874,15 @@ bool8 MovementAction_UnusedAcroActionRight_Step0(struct ObjectEvent *objectEvent
return FALSE;
}
-void sub_8095AF0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+void InitFigure8Anim(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
- sub_8097750(sprite);
+ InitSpriteForFigure8Anim(sprite);
sprite->animPaused = FALSE;
}
-bool8 sub_8095B0C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
+bool8 DoFigure8Anim(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
- if (sub_8097758(sprite))
+ if (AnimateSpriteInFigure8(sprite))
{
ShiftStillObjectEventCoords(objectEvent);
objectEvent->triggerGroundEffectsOnStop = TRUE;
@@ -6888,14 +6894,14 @@ bool8 sub_8095B0C(struct ObjectEvent *objectEvent, struct Sprite *sprite)
bool8 MovementAction_Figure8_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
- sub_8095AF0(objectEvent, sprite);
+ InitFigure8Anim(objectEvent, sprite);
sprite->data[2] = 1;
return MovementAction_Figure8_Step1(objectEvent, sprite);
}
bool8 MovementAction_Figure8_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
- if (sub_8095B0C(objectEvent, sprite))
+ if (DoFigure8Anim(objectEvent, sprite))
{
sprite->data[2] = 2;
return TRUE;
@@ -8098,26 +8104,26 @@ void GroundEffect_Seaweed(struct ObjectEvent *objEvent, struct Sprite *sprite)
}
static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct Sprite *sprite) = {
- GroundEffect_SpawnOnTallGrass,
- GroundEffect_StepOnTallGrass,
- GroundEffect_SpawnOnLongGrass,
- GroundEffect_StepOnLongGrass,
- GroundEffect_WaterReflection,
- GroundEffect_IceReflection,
- GroundEffect_FlowingWater,
- GroundEffect_SandTracks,
- GroundEffect_DeepSandTracks,
- GroundEffect_Ripple,
- GroundEffect_StepOnPuddle,
- GroundEffect_SandHeap,
- GroundEffect_JumpOnTallGrass,
- GroundEffect_JumpOnLongGrass,
- GroundEffect_JumpOnShallowWater,
- GroundEffect_JumpOnWater,
- GroundEffect_JumpLandingDust,
- GroundEffect_ShortGrass,
- GroundEffect_HotSprings,
- GroundEffect_Seaweed
+ GroundEffect_SpawnOnTallGrass, // GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN
+ GroundEffect_StepOnTallGrass, // GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE
+ GroundEffect_SpawnOnLongGrass, // GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN
+ GroundEffect_StepOnLongGrass, // GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE
+ GroundEffect_WaterReflection, // GROUND_EFFECT_FLAG_ICE_REFLECTION
+ GroundEffect_IceReflection, // GROUND_EFFECT_FLAG_REFLECTION
+ GroundEffect_FlowingWater, // GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER
+ GroundEffect_SandTracks, // GROUND_EFFECT_FLAG_SAND
+ GroundEffect_DeepSandTracks, // GROUND_EFFECT_FLAG_DEEP_SAND
+ GroundEffect_Ripple, // GROUND_EFFECT_FLAG_RIPPLES
+ GroundEffect_StepOnPuddle, // GROUND_EFFECT_FLAG_PUDDLE
+ GroundEffect_SandHeap, // GROUND_EFFECT_FLAG_SAND_PILE
+ GroundEffect_JumpOnTallGrass, // GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS
+ GroundEffect_JumpOnLongGrass, // GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS
+ GroundEffect_JumpOnShallowWater, // GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER
+ GroundEffect_JumpOnWater, // GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER
+ GroundEffect_JumpLandingDust, // GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND
+ GroundEffect_ShortGrass, // GROUND_EFFECT_FLAG_SHORT_GRASS
+ GroundEffect_HotSprings, // GROUND_EFFECT_FLAG_HOT_SPRINGS
+ GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED
};
static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags)
@@ -8210,15 +8216,13 @@ bool8 FreezeObjectEvent(struct ObjectEvent *objectEvent)
{
return TRUE;
}
- else
- {
- objectEvent->frozen = 1;
- objectEvent->spriteAnimPausedBackup = gSprites[objectEvent->spriteId].animPaused;
- objectEvent->spriteAffineAnimPausedBackup = gSprites[objectEvent->spriteId].affineAnimPaused;
- gSprites[objectEvent->spriteId].animPaused = 1;
- gSprites[objectEvent->spriteId].affineAnimPaused = 1;
- return FALSE;
- }
+
+ objectEvent->frozen = 1;
+ objectEvent->spriteAnimPausedBackup = gSprites[objectEvent->spriteId].animPaused;
+ objectEvent->spriteAffineAnimPausedBackup = gSprites[objectEvent->spriteId].affineAnimPaused;
+ gSprites[objectEvent->spriteId].animPaused = 1;
+ gSprites[objectEvent->spriteId].affineAnimPaused = 1;
+ return FALSE;
}
void FreezeObjectEvents(void)
@@ -8391,11 +8395,11 @@ bool8 sub_80976EC(struct Sprite *sprite)
if (sprite->data[5] > 15)
return TRUE;
- else
- return FALSE;
+
+ return FALSE;
}
-static const s8 gUnknown_0850E772[] = {
+static const s8 sFigure8XOffsets[FIGURE_8_LENGTH] = {
1, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 1, 2, 2, 1, 2,
2, 1, 2, 2, 1, 2, 1, 1,
@@ -8407,7 +8411,7 @@ static const s8 gUnknown_0850E772[] = {
0, 1, 0, 0, 0, 0, 0, 0,
};
-static const s8 gUnknown_0850E7BA[] = {
+static const s8 sFigure8YOffsets[FIGURE_8_LENGTH] = {
0, 0, 1, 0, 0, 1, 0, 0,
1, 0, 1, 1, 0, 1, 1, 0,
1, 1, 0, 1, 1, 0, 1, 1,
@@ -8419,68 +8423,68 @@ static const s8 gUnknown_0850E7BA[] = {
-1, -1, -1, -1, -1, -1, -1, -2,
};
-s16 sub_8097728(s16 a1)
+s16 GetFigure8YOffset(s16 idx)
{
- return gUnknown_0850E7BA[a1];
+ return sFigure8YOffsets[idx];
}
-s16 sub_809773C(s16 a1)
+s16 GetFigure8XOffset(s16 idx)
{
- return gUnknown_0850E772[a1];
+ return sFigure8XOffsets[idx];
}
-void sub_8097750(struct Sprite *sprite)
+static void InitSpriteForFigure8Anim(struct Sprite *sprite)
{
sprite->data[6] = 0;
sprite->data[7] = 0;
}
-bool8 sub_8097758(struct Sprite *sprite)
+static bool8 AnimateSpriteInFigure8(struct Sprite *sprite)
{
- bool8 result = FALSE;
+ bool8 finished = 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)
+ case 0:
+ sprite->pos2.x += GetFigure8XOffset(sprite->data[6]);
+ sprite->pos2.y += GetFigure8YOffset(sprite->data[6]);
+ break;
+ case 1:
+ sprite->pos2.x -= GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]);
+ sprite->pos2.y += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]);
+ break;
+ case 2:
+ sprite->pos2.x -= GetFigure8XOffset(sprite->data[6]);
+ sprite->pos2.y += GetFigure8YOffset(sprite->data[6]);
+ break;
+ case 3:
+ sprite->pos2.x += GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]);
+ sprite->pos2.y += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]);
+ break;
+ }
+ if (++sprite->data[6] == FIGURE_8_LENGTH)
{
sprite->data[6] = 0;
sprite->data[7]++;
}
- if(sprite->data[7] == 0x4)
+ if (sprite->data[7] == 4)
{
sprite->pos2.y = 0;
sprite->pos2.x = 0;
- result = TRUE;
+ finished = TRUE;
}
- return result;
+ return finished;
}
-static const s8 gUnknown_0850E802[] = {
+static const s8 gUnknown_0850E802[16] = {
-4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0
};
-static const s8 gUnknown_0850E812[] = {
+static const s8 gUnknown_0850E812[16] = {
0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0
};
-static const s8 gUnknown_0850E822[] = {
+static const s8 gUnknown_0850E822[16] = {
-2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0
};
@@ -8503,23 +8507,11 @@ void sub_809783C(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
sprite->data[6] = 0;
}
-static const s16 gUnknown_0850E840[] = {
- 16, 16, 32,
-};
-
-static const u8 gUnknown_0850E846[] = {
- 0, 0, 1,
-};
-
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;
+ s16 v5[] = {16, 16, 32};
+ u8 v6[] = {0, 0, 1};
+ u8 v2 = 0;
if (sprite->data[4])
Step1(sprite, sprite->data[3]);
@@ -8540,23 +8532,11 @@ u8 sub_809785C(struct Sprite *sprite)
return v2;
}
-static const s16 gUnknown_0850E84A[] = {
- 32, 32, 64,
-};
-
-static const u8 gUnknown_0850E850[] = {
- 1, 1, 2,
-};
-
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;
+ s16 v5[] = {32, 32, 64};
+ u8 v6[] = {1, 1, 2};
+ u8 v2 = 0;
if (sprite->data[4] && !(sprite->data[6] & 1))
Step1(sprite, sprite->data[3]);
@@ -8584,12 +8564,9 @@ static void SetMovementDelay(struct Sprite *sprite, s16 timer)
static bool8 WaitForMovementDelay(struct Sprite *sprite)
{
- sprite->data[3]--;
-
- if (sprite->data[3] == 0)
+ if (--sprite->data[3] == 0)
return TRUE;
- else
- return FALSE;
+ return FALSE;
}
void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex)
@@ -8603,8 +8580,7 @@ bool8 SpriteAnimEnded(struct Sprite *sprite)
{
if (sprite->animEnded)
return TRUE;
- else
- return FALSE;
+ return FALSE;
}
void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible)
@@ -8783,14 +8759,14 @@ static void UpdateObjectEventSpritePosition(struct Sprite *sprite)
{
switch(sprite->tAnimNum)
{
+ case 0:
+ break;
case UNION_ROOM_SPAWN_IN:
MoveUnionRoomObjectDown(sprite);
break;
case UNION_ROOM_SPAWN_OUT:
MoveUnionRoomObjectUp(sprite);
break;
- case 0:
- break;
default:
sprite->tAnimNum = 0;
break;
@@ -8871,8 +8847,7 @@ u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct
}
else
{
- u8 i;
- u8 firstFreeSlot;
+ u8 i, firstFreeSlot;
bool32 found;
for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
{
@@ -8950,7 +8925,7 @@ void CreateLevitateMovementTask(struct ObjectEvent *objectEvent)
u8 taskId = CreateTask(ApplyLevitateMovement, 0xFF);
struct Task *task = &gTasks[taskId];
- StoreWordInTwoHalfwords(&task->data[0], (u32)objectEvent);
+ StoreWordInTwoHalfwords((u16 *)&task->data[0], (u32)objectEvent);
objectEvent->warpArrowSpriteId = taskId;
task->data[3] = 0xFFFF;
}
@@ -8961,7 +8936,7 @@ static void ApplyLevitateMovement(u8 taskId)
struct Sprite *sprite;
struct Task *task = &gTasks[taskId];
- LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&objectEvent); // load the map object pointer.
+ LoadWordFromTwoHalfwords((u16 *)&task->data[0], (u32 *)&objectEvent); // load the map object pointer.
sprite = &gSprites[objectEvent->spriteId];
if(!(task->data[2] & 0x3))
@@ -8978,7 +8953,7 @@ void DestroyExtraMovementTask(u8 taskId)
struct ObjectEvent *objectEvent;
struct Task *task = &gTasks[taskId];
- LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&objectEvent); // unused objectEvent
+ LoadWordFromTwoHalfwords((u16 *)&task->data[0], (u32 *)&objectEvent); // unused objectEvent
DestroyTask(taskId);
}