From ae3369e87fabf5add6c2c16cac9923d6401ab506 Mon Sep 17 00:00:00 2001 From: GGbond Date: Sat, 21 Feb 2026 18:46:51 +0800 Subject: [PATCH] Fix Assist to account for temporarily changed moves in Gen 5+ (#9287) --- src/battle_util.c | 17 ++++++++++++++++- test/battle/move_effect/assist.c | 23 ++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index dd08a155ef..9787bbe282 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11215,11 +11215,21 @@ static u32 GetAssistMove(void) u32 move = MOVE_NONE; s32 chooseableMovesNo = 0; struct Pokemon *party; + u8 battlerByPartyId[PARTY_SIZE]; u16 *validMoves = Alloc(sizeof(u16) * PARTY_SIZE * MAX_MON_MOVES); if (validMoves != NULL) { party = GetBattlerParty(gBattlerAttacker); + for (u32 i = 0; i < PARTY_SIZE; i++) + battlerByPartyId[i] = MAX_BATTLERS_COUNT; + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (GetBattlerSide(battler) != GetBattlerSide(gBattlerAttacker)) + continue; + if (gBattlerPartyIndexes[battler] < PARTY_SIZE) + battlerByPartyId[gBattlerPartyIndexes[battler]] = battler; + } for (u32 monId = 0; monId < PARTY_SIZE; monId++) { @@ -11232,7 +11242,12 @@ static u32 GetAssistMove(void) for (u32 moveId = 0; moveId < MAX_MON_MOVES; moveId++) { - u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); + u16 move; + + if (battlerByPartyId[monId] != MAX_BATTLERS_COUNT) + move = gBattleMons[battlerByPartyId[monId]].moves[moveId]; + else + move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); if (IsMoveAssistBanned(move)) continue; diff --git a/test/battle/move_effect/assist.c b/test/battle/move_effect/assist.c index 3a380ef125..6f236af983 100644 --- a/test/battle/move_effect/assist.c +++ b/test/battle/move_effect/assist.c @@ -12,7 +12,6 @@ TO_DO_BATTLE_TEST("Assist can call moves with no PP left"); TO_DO_BATTLE_TEST("Assist can call moves from a fainted party member"); TO_DO_BATTLE_TEST("Assist can call moves that are blocked to its partners"); // Eg. double battle parter blocked by Disable TO_DO_BATTLE_TEST("Assist can only call the original moves of a Transformed partner (Gen4 only)"); -TO_DO_BATTLE_TEST("Assist can only call the current moves of a Transformed partner (Gen5+)"); TO_DO_BATTLE_TEST("Assist cannot call a Mimicked move (Gen4 only)"); TO_DO_BATTLE_TEST("Assist can call a Mimicked move but not the original Mimic (Gen5+)"); TO_DO_BATTLE_TEST("Assist can call moves in unhatched Eggs (Gen5 only)"); @@ -57,3 +56,25 @@ SINGLE_BATTLE_TEST("Assisted move triggers correct weakness berry") ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, player); } } + +DOUBLE_BATTLE_TEST("Assist can only call the current moves of a Transformed partner (Gen5+)") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TRANSFORM) == EFFECT_TRANSFORM); + PLAYER(SPECIES_WOBBUFFET) { Speed(3); Moves(MOVE_ASSIST); } + PLAYER(SPECIES_DITTO) { Speed(4); Moves(MOVE_TRANSFORM); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { + MOVE(playerRight, MOVE_TRANSFORM, target: opponentLeft); + MOVE(playerLeft, MOVE_ASSIST); + MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ASSIST, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + } +}