From 9e5298ec7aba7f93b861ab14c044dabe5fea807d Mon Sep 17 00:00:00 2001 From: AZero13 <83477269+SiliconA-Z@users.noreply.github.com> Date: Sun, 5 Apr 2026 16:04:55 -0400 Subject: [PATCH] Fix UB in battle_anim_ground gBattleAnimArgs is 8 elements, not 15. --- data/battle_anim_scripts.s | 6 ++++++ src/battle_anim_ground.c | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 4fc244acba61..db360ed79952 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3318,8 +3318,14 @@ Move_MILK_DRINK: Move_MAGNITUDE: createvisualtask AnimTask_IsPowerOver99, 2 waitforvisualfinish +.ifdef UBFIX + jumpreteq FALSE, MagnitudeRegular + jumpreteq TRUE, MagnitudeIntense +.else jumpargeq 15, FALSE, MagnitudeRegular jumpargeq 15, TRUE, MagnitudeIntense +.endif + MagnitudeEnd: end MagnitudeRegular: diff --git a/src/battle_anim_ground.c b/src/battle_anim_ground.c index b3591544ece1..93b52c682663 100644 --- a/src/battle_anim_ground.c +++ b/src/battle_anim_ground.c @@ -299,7 +299,6 @@ void AnimTask_DigDownMovement(u8 taskId) static void AnimTask_DigBounceMovement(u8 taskId) { - u8 y; struct Task *task = &gTasks[taskId]; switch (task->data[0]) @@ -318,9 +317,8 @@ static void AnimTask_DigBounceMovement(u8 taskId) task->data[13] = gBattle_BG2_Y; } - y = GetBattlerYCoordWithElevation(gBattleAnimAttacker); - task->data[14] = y - 32; - task->data[15] = y + 32; + task->data[14] = GetBattlerYCoordWithElevation(gBattleAnimAttacker) - 32; + task->data[15] = task->data[14] + 64; if (task->data[14] < 0) task->data[14] = 0; @@ -428,9 +426,8 @@ static void AnimTask_DigRiseUpFromHole(u8 taskId) else task->data[12] = gBattle_BG2_X; - var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); - task->data[14] = var0 - 32; - task->data[15] = var0 + 32; + task->data[14] = GetBattlerYCoordWithElevation(gBattleAnimAttacker) - 32; + task->data[15] = task->data[14] + 64; task->data[0]++; break; case 1: @@ -503,7 +500,7 @@ static void SetDigScanlineEffect(u8 useBG1, s16 y, s16 endY) // arg 5: duration void AnimDirtPlumeParticle(struct Sprite *sprite) { - s8 battler; + u16 battler; // Should be u8. s16 xOffset; if (gBattleAnimArgs[0] == 0) @@ -542,7 +539,7 @@ static void AnimDirtPlumeParticle_Step(struct Sprite *sprite) // arg 2: duration static void AnimDigDirtMound(struct Sprite *sprite) { - s8 battler; + u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; @@ -708,7 +705,7 @@ static void AnimTask_ShakeBattlers(u8 taskId) static void SetBattlersXOffsetForShake(struct Task *task) { u16 i; - u16 xOffset; + s16 xOffset; if ((task->tTimer & 1) == 0) xOffset = (task->tHorizOffset / 2) + (task->tHorizOffset & 1); @@ -733,7 +730,11 @@ static void SetBattlersXOffsetForShake(struct Task *task) void AnimTask_IsPowerOver99(u8 taskId) { +#ifdef UBFIX + gBattleAnimArgs[7] = gAnimMovePower > 99; +#else gBattleAnimArgs[15] = gAnimMovePower > 99; +#endif DestroyAnimVisualTask(taskId); }