From cd6d293ad15b3990c07b3af4baffbf3f4a7ebe3e Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 20 Nov 2025 14:19:48 +0100 Subject: [PATCH] Fix some move animations leaking VRAM and freeing already freed tags (#7977) Co-authored-by: Hedara --- data/battle_anim_scripts.s | 11 +-- include/global.h | 2 + src/battle_script_commands.c | 9 +++ src/sprite.c | 10 +++ test/battle/move_animations/all_anims.c | 93 ++++++++++++++++--------- 5 files changed, 85 insertions(+), 40 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 158de50992..b546558daa 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -11932,7 +11932,6 @@ gBattleAnimMove_PrismaticLaser:: loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @charge animation loadspritegfx ANIM_TAG_TEAL_ALERT @straight lines loadspritegfx ANIM_TAG_GREEN_SPIKE @needle arm animation - loadspritegfx ANIM_TAG_NEEDLE @sting monbg ANIM_ATTACKER setalpha 14, 8 createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 1, 0, 16, RGB_BLACK @@ -11961,6 +11960,7 @@ gBattleAnimMove_PrismaticLaser:: unloadspritegfx ANIM_TAG_GREEN_SPIKE unloadspritegfx ANIM_TAG_ICE_CHUNK unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT + loadspritegfx ANIM_TAG_NEEDLE @sting delay 30 createvisualtask AnimTask_HorizontalShake, 5, (MAX_BATTLERS_COUNT + 1), 10, 0x32 createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 0x32 @@ -15059,6 +15059,7 @@ gBattleAnimMove_Poltergeist:: waitbgfadein clearmonbg 0x3 blendoff + unloadspritegfx ANIM_TAG_ITEM_BAG end @Credits to Skeli @@ -32845,7 +32846,6 @@ gBattleAnimMove_SavageSpinOut:: blendoff waitforvisualfinish unloadspritegfx ANIM_TAG_STRING - unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_COCOON loadspritegfx ANIM_TAG_IMPACT @hit delay 1 @@ -33315,7 +33315,6 @@ FinishInfernoOverdrive: delay 16 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 8, 0, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - unloadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 79, 1 call InfernoOverdriveExplosion delay 6 @@ -34495,7 +34494,6 @@ gBattleAnimMove_BlackHoleEclipse:: unloadspritegfx ANIM_TAG_VERTICAL_HEX @red unloadspritegfx ANIM_TAG_SHADOW_BALL unloadspritegfx ANIM_TAG_BLACK_BALL_2 - unloadspritegfx ANIM_TAG_FOCUS_ENERGY loadspritegfx ANIM_TAG_EXPLOSION_2 call BlackHoleEclipseExplosion createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS_2), 1, 0, 16, RGB_WHITE @ bg to white pal @@ -36727,8 +36725,6 @@ gBattleAnimMove_ClangorousSoulblaze:: playsewithpan SE_SHINY, SOUND_PAN_ATTACKER createsprite gClangorousSoulRedRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish - unloadspritegfx ANIM_TAG_HORSESHOE_SIDE_FIST - unloadspritegfx ANIM_TAG_SPARKLE_2 @stars loadspritegfx ANIM_TAG_ROUND_SHADOW @ fly playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gClangoorousSoulblazeWhiteFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 @@ -37206,8 +37202,6 @@ SearingSunrazeSmashImpact: loadspritegfx ANIM_TAG_CROSS_IMPACT @x delay 0 unloadspritegfx ANIM_TAG_METEOR @superpower - unloadspritegfx ANIM_TAG_DRAGON_ASCENT @dragon ascent 1 - unloadspritegfx ANIM_TAG_DRAGON_ASCENT_FOE @dragon ascent 2 createsprite gSearingSunrazeSmashCrossImpactSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x24 playsewithpan SE_M_LEER, SOUND_PAN_TARGET visible ANIM_ATTACKER @@ -37769,7 +37763,6 @@ gBattleAnimMove_SoulStealing7StarStrike:: call SoulStealingSevenStarStrikeBlueParalysis waitforvisualfinish visible ANIM_ATTACKER - unloadspritegfx ANIM_TAG_ROUND_SHADOW loadspritegfx ANIM_TAG_SPARKLE_4 @ detect loadspritegfx ANIM_TAG_EXPLOSION @ explosion playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER diff --git a/include/global.h b/include/global.h index ff0b6f79e1..a3dacfb3d4 100644 --- a/include/global.h +++ b/include/global.h @@ -1180,6 +1180,8 @@ struct MapPosition #if T_SHOULD_RUN_MOVE_ANIM extern bool32 gLoadFail; +extern bool32 gCountAllocs; +extern s32 gSpriteAllocs; #endif // T_SHOULD_RUN_MOVE_ANIM #endif // GUARD_GLOBAL_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index be70970fa7..efea210440 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2228,6 +2228,10 @@ static void Cmd_attackanimation(void) gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); +#if T_SHOULD_RUN_MOVE_ANIM + gCountAllocs = TRUE; + gSpriteAllocs = 0; +#endif gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); @@ -2246,7 +2250,12 @@ static void Cmd_waitanimation(void) CMD_ARGS(); if (gBattleControllerExecFlags == 0 && gBattleStruct->battlerKOAnimsRunning == 0) + { +#if T_SHOULD_RUN_MOVE_ANIM + gCountAllocs = FALSE; +#endif gBattlescriptCurrInstr = cmd->nextInstr; + } } static void DoublesHPBarReduction(void) diff --git a/src/sprite.c b/src/sprite.c index 1b89a50be1..2df5e2760a 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -28,6 +28,8 @@ #if T_SHOULD_RUN_MOVE_ANIM EWRAM_DATA bool32 gLoadFail = FALSE; +EWRAM_DATA bool32 gCountAllocs = FALSE; +EWRAM_DATA s32 gSpriteAllocs = 0; #endif // T_SHOULD_RUN_MOVE_ANIM struct SpriteCopyRequest @@ -1501,6 +1503,10 @@ void LoadSpriteSheets(const struct SpriteSheet *sheets) void FreeSpriteTilesByTag(u16 tag) { +#if T_SHOULD_RUN_MOVE_ANIM + if (gCountAllocs) + gSpriteAllocs--; +#endif u8 index = IndexOfSpriteTileTag(tag); if (index != 0xFF) { @@ -1566,6 +1572,10 @@ u16 GetSpriteTileTagByTileStart(u16 start) void AllocSpriteTileRange(u16 tag, u16 start, u16 count) { +#if T_SHOULD_RUN_MOVE_ANIM + if (gCountAllocs) + gSpriteAllocs++; +#endif u8 freeIndex = IndexOfSpriteTileTag(TAG_NONE); sSpriteTileRangeTags[freeIndex] = tag; SET_SPRITE_TILE_RANGE(freeIndex, start, count); diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index acf5dcbb56..e69eb59750 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -409,9 +409,10 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to op SceneSingles(move, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -447,9 +448,10 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to SceneSingles(move, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -505,9 +507,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -564,9 +567,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -623,9 +627,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -682,9 +687,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -741,9 +747,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -800,9 +807,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -859,9 +867,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -918,9 +927,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1205,9 +1215,10 @@ SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - SceneSingles(move, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1273,9 +1284,10 @@ SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (player to opponent)" ANIMATION(ANIM_TYPE_MOVE, zmove, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1302,9 +1314,10 @@ SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (opponent to player)" ANIMATION(ANIM_TYPE_MOVE, zmove, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1333,9 +1346,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to oppone ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1364,9 +1378,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to oppone ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1395,9 +1410,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to oppon ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1426,9 +1442,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to oppon ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1457,9 +1474,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to play ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1488,9 +1506,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to play ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1519,9 +1538,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to pla ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1550,9 +1570,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to pla ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1595,9 +1616,10 @@ SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (player to oppon ANIMATION(ANIM_TYPE_MOVE, move, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1617,9 +1639,10 @@ SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (opponent to pla ANIMATION(ANIM_TYPE_MOVE, move, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1641,9 +1664,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to o ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1665,9 +1689,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to o ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1689,9 +1714,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to ANIMATION(ANIM_TYPE_MOVE, move, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1713,9 +1739,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to ANIMATION(ANIM_TYPE_MOVE, move, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1737,9 +1764,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1761,9 +1789,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1785,9 +1814,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight t ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1809,9 +1839,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight t ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) + if (gLoadFail || gSpriteAllocs != 0) DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } }