summaryrefslogtreecommitdiff
path: root/src/pokemon_animation.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pokemon_animation.c')
-rw-r--r--src/pokemon_animation.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
index 52fa6db51..340327475 100644
--- a/src/pokemon_animation.c
+++ b/src/pokemon_animation.c
@@ -177,9 +177,9 @@ static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite);
#define STRUCT_COUNT 4
// IWRAM bss
-static IWRAM_DATA struct UnkAnimStruct sUnknown_03001240[STRUCT_COUNT];
-static IWRAM_DATA u8 sUnknown_03001270;
-static IWRAM_DATA bool32 sUnknown_03001274;
+static struct UnkAnimStruct sUnknown_03001240[STRUCT_COUNT];
+static u8 sUnknown_03001270;
+static bool32 sUnknown_03001274;
// const rom data
static const u8 sSpeciesToBackAnimSet[] =
@@ -861,16 +861,27 @@ u8 GetSpeciesBackAnimSet(u16 species)
}
#define tState data[0]
-#define tPtrLO data[1]
-#define tPtrHI data[2]
+#define tPtrHi data[1]
+#define tPtrLo data[2]
#define tAnimId data[3]
#define tSaved0 data[4]
#define tSaved2 data[5]
+// BUG: In vanilla, tPtrLo is read as an s16, so if bit 15 of the
+// address were to be set it would cause the pointer to be read
+// as 0xFFFFXXXX instead of the desired 0x02YYXXXX.
+// By dumb luck, this is not an issue in vanilla. However,
+// changing the link order revealed this bug.
+#if MODERN
+#define ANIM_SPRITE(taskId) ((struct Sprite *)((gTasks[taskId].tPtrHi << 16) | ((u16)gTasks[taskId].tPtrLo)))
+#else
+#define ANIM_SPRITE(taskId) ((struct Sprite *)((gTasks[taskId].tPtrHi << 16) | (gTasks[taskId].tPtrLo)))
+#endif //MODERN
+
static void Task_HandleMonAnimation(u8 taskId)
{
u32 i;
- struct Sprite *sprite = (struct Sprite*)(u32)((gTasks[taskId].tPtrLO << 0x10) | (gTasks[taskId].tPtrHI));
+ struct Sprite *sprite = ANIM_SPRITE(taskId);
if (gTasks[taskId].tState == 0)
{
@@ -900,8 +911,8 @@ static void Task_HandleMonAnimation(u8 taskId)
void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId)
{
u8 taskId = CreateTask(Task_HandleMonAnimation, 128);
- gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
- gTasks[taskId].tPtrHI = (u32)(sprite);
+ gTasks[taskId].tPtrHi = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrLo = (u32)(sprite);
gTasks[taskId].tAnimId = frontAnimId;
}
@@ -916,8 +927,8 @@ void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet)
u8 nature, taskId, animId, battlerId;
taskId = CreateTask(Task_HandleMonAnimation, 128);
- gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
- gTasks[taskId].tPtrHI = (u32)(sprite);
+ gTasks[taskId].tPtrHi = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrLo = (u32)(sprite);
battlerId = sprite->data[0];
nature = GetNature(&gPlayerParty[gBattlerPartyIndexes[battlerId]]);
@@ -927,8 +938,8 @@ void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet)
}
#undef tState
-#undef tPtrLO
-#undef tPtrHI
+#undef tPtrHi
+#undef tPtrLo
#undef tAnimId
#undef tSaved0
#undef tSaved2