diff options
Diffstat (limited to 'src/event_object_movement.c')
-rw-r--r-- | src/event_object_movement.c | 219 |
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); } |