From be03feca94bc66e313dcd864532da6b1242b7c84 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 12 May 2025 18:07:22 +0200 Subject: [PATCH 1/9] Fixed double battles send out breaking (#6822) --- src/battle_script_commands.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cd3ef5a232..f6fbff240f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5345,6 +5345,27 @@ static void Cmd_getexp(void) } } +static u32 CountAliveMonsForBattlerSide(u32 battler) +{ + u32 aliveMons = 0; + struct Pokemon *party = GetBattlerParty(battler); + + for (u32 partyMon = 0; partyMon < PARTY_SIZE; partyMon++) + { + if (GetMonData(&party[partyMon], MON_DATA_SPECIES) + && GetMonData(&party[partyMon], MON_DATA_HP) > 0 + && !GetMonData(&party[partyMon], MON_DATA_IS_EGG)) + aliveMons++; + } + + return aliveMons; +} + +bool32 NoAliveMonsForBattlerSide(u32 battler) +{ + return CountAliveMonsForBattlerSide(battler) == 0; +} + bool32 NoAliveMonsForPlayer(void) { u32 i; @@ -5460,7 +5481,12 @@ static void Cmd_checkteamslost(void) } else { - if (emptyOpponentSpots != 0 && emptyPlayerSpots != 0) + u32 occupiedPlayerSpots = (gBattlersCount / 2) - emptyPlayerSpots; + u32 occupiedOpponentSpots = (gBattlersCount / 2) - emptyOpponentSpots; + u32 alivePlayerPartyMons = CountAliveMonsForBattlerSide(B_POSITION_PLAYER_LEFT) - occupiedPlayerSpots; + u32 aliveOpponentPartyMons = CountAliveMonsForBattlerSide(B_POSITION_OPPONENT_LEFT) - occupiedOpponentSpots; + + if (emptyPlayerSpots > 0 && alivePlayerPartyMons > 0 && emptyOpponentSpots > 0 && aliveOpponentPartyMons > 0) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; From 14a66d612f0e7e7cc6d13cc45d66d9a4babe410a Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 12 May 2025 21:06:12 -0400 Subject: [PATCH 2/9] combine BattleScript_BerryStatRaiseRet and BattleScript_BerryStatRaiseEnd2, check ripen popup doesn't trigger except on berries --- data/battle_scripts_1.s | 19 +++++++------------ src/battle_util.c | 4 ++-- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4d278a6179..1236b6587f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9008,21 +9008,15 @@ BattleScript_BerryConfuseHealRet_Anim: return BattleScript_BerryStatRaiseEnd2:: - jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryStatRaiseEnd2_AbilityPopup - goto BattleScript_BerryStatRaiseEnd2_Anim -BattleScript_BerryStatRaiseEnd2_AbilityPopup: - call BattleScript_AbilityPopUp -BattleScript_BerryStatRaiseEnd2_Anim: - statbuffchange STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_AFFECTS_USER, BattleScript_BerryStatRaiseEnd2_End - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM - call BattleScript_StatUp - removeitem BS_ATTACKER -BattleScript_BerryStatRaiseEnd2_End:: + call BattleScript_BerryStatRaiseRet end2 BattleScript_BerryStatRaiseRet:: + @ to ensure `statbuffchange` has correct battler id, backup and use target + savetarget + copybyte gBattlerTarget, sBATTLER + jumpifnotberry BS_ATTACKER, BattleScript_BerryStatRaiseRet_Anim + @ check ripen popup if consuming berry jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryStatRaiseRet_AbilityPopup goto BattleScript_BerryStatRaiseRet_Anim BattleScript_BerryStatRaiseRet_AbilityPopup: @@ -9035,6 +9029,7 @@ BattleScript_BerryStatRaiseRet_Anim: call BattleScript_StatUp removeitem BS_SCRIPTING BattleScript_BerryStatRaiseRet_End: + restoretarget return BattleScript_BerryFocusEnergyRet:: diff --git a/src/battle_util.c b/src/battle_util.c index 3b6818b8dd..668c2db2a5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6972,7 +6972,7 @@ static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId)) { BufferStatChange(battler, statId, STRINGID_STATROSE); - gEffectBattler = battler; + gEffectBattler = gBattleScripting.battler = battler; if (GetBattlerAbility(battler) == ABILITY_RIPEN) SET_STATCHANGER(statId, 2, FALSE); else @@ -7010,7 +7010,7 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa u16 battlerAbility = GetBattlerAbility(battler); u32 savedAttacker = gBattlerAttacker; // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker - gBattlerAttacker = battler; + gBattlerAttacker = gBattleScripting.battler = battler; stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); gBattlerAttacker = savedAttacker; From d4c64d3b672735ac0b0ddbd4be0686da97c8dbd8 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 12 May 2025 21:11:25 -0400 Subject: [PATCH 3/9] rename berrystatraise script to consumablestatraise --- data/battle_scripts_1.s | 20 ++++++++++---------- include/battle_scripts.h | 4 ++-- src/battle_script_commands.c | 2 +- src/battle_util.c | 16 ++++++++-------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1236b6587f..ada937ff4a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9007,28 +9007,28 @@ BattleScript_BerryConfuseHealRet_Anim: removeitem BS_TARGET return -BattleScript_BerryStatRaiseEnd2:: - call BattleScript_BerryStatRaiseRet +BattleScript_ConsumableStatRaiseEnd2:: + call BattleScript_ConsumableStatRaiseRet end2 -BattleScript_BerryStatRaiseRet:: +BattleScript_ConsumableStatRaiseRet:: @ to ensure `statbuffchange` has correct battler id, backup and use target savetarget copybyte gBattlerTarget, sBATTLER - jumpifnotberry BS_ATTACKER, BattleScript_BerryStatRaiseRet_Anim + jumpifnotberry BS_SCRIPTING, BattleScript_ConsumableStatRaiseRet_Anim @ check ripen popup if consuming berry - jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryStatRaiseRet_AbilityPopup - goto BattleScript_BerryStatRaiseRet_Anim -BattleScript_BerryStatRaiseRet_AbilityPopup: + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ConsumableStatRaiseRet_AbilityPopup + goto BattleScript_ConsumableStatRaiseRet_Anim +BattleScript_ConsumableStatRaiseRet_AbilityPopup: call BattleScript_AbilityPopUp -BattleScript_BerryStatRaiseRet_Anim: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerryStatRaiseRet_End +BattleScript_ConsumableStatRaiseRet_Anim: + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End setgraphicalstatchangevalues playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM call BattleScript_StatUp removeitem BS_SCRIPTING -BattleScript_BerryStatRaiseRet_End: +BattleScript_ConsumableStatRaiseRet_End: restoretarget return diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 958cd71892..1e1189a688 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -237,8 +237,8 @@ extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItemInPalace[]; extern const u8 BattleScript_HangedOnMsg[]; extern const u8 BattleScript_BerryConfuseHealEnd2[]; extern const u8 BattleScript_BerryConfuseHealRet[]; -extern const u8 BattleScript_BerryStatRaiseEnd2[]; -extern const u8 BattleScript_BerryStatRaiseRet[]; +extern const u8 BattleScript_ConsumableStatRaiseEnd2[]; +extern const u8 BattleScript_ConsumableStatRaiseRet[]; extern const u8 BattleScript_BerryFocusEnergyRet[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f6fbff240f..9d9e183a46 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11310,7 +11310,7 @@ static void Cmd_various(void) if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } else { diff --git a/src/battle_util.c b/src/battle_util.c index 668c2db2a5..0e2be3fd76 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6983,12 +6983,12 @@ static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); } else { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } return ITEM_STATS_CHANGE; } @@ -7034,12 +7034,12 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); } else { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } return ITEM_STATS_CHANGE; @@ -7109,7 +7109,7 @@ static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 ca gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; gBattleScripting.animArg2 = 0; BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; @@ -7127,12 +7127,12 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 item gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); } else { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } return ITEM_STATS_CHANGE; } @@ -7845,7 +7845,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_ROOM_SERVICE: if (TryRoomService(battler)) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; From 60587682e3dce87c7e8f8695c34c773442a81c61 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Tue, 13 May 2025 10:32:03 +0200 Subject: [PATCH 4/9] Remove redundant script declaration in `battle_scripts.h` (#6837) --- include/battle_scripts.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 958cd71892..d8b3fb41ea 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -489,7 +489,6 @@ extern const u8 BattleScript_ShellTrapSetUp[]; extern const u8 BattleScript_StealthRockActivates[]; extern const u8 BattleScript_CouldntFullyProtect[]; extern const u8 BattleScript_MoveEffectStockpileWoreOff[]; -extern const u8 BattleScript_StealthRockActivates[]; extern const u8 BattleScript_SpikesActivates[]; extern const u8 BattleScript_BerserkGeneRet[]; extern const u8 BattleScript_BerserkGeneRetEnd2[]; From e64d260f522f5368ae9f4cd5d5d646ef9fad2ae2 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 13 May 2025 04:34:06 -0400 Subject: [PATCH 5/9] Added Ability TODO tests B (#6836) --- test/battle/ability/bad_dreams.c | 2 +- test/battle/ability/ball_fetch.c | 7 +++++++ test/battle/ability/battery.c | 5 +++++ test/battle/ability/beads_of_ruin.c | 2 ++ test/battle/ability/beast_boost.c | 13 +++++++++++++ test/battle/ability/berserk.c | 2 +- test/battle/ability/bulletproof.c | 4 ++++ .../ability/{cheeck_pouch.c => cheek_pouch.c} | 0 8 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 test/battle/ability/ball_fetch.c create mode 100644 test/battle/ability/battery.c create mode 100644 test/battle/ability/bulletproof.c rename test/battle/ability/{cheeck_pouch.c => cheek_pouch.c} (100%) diff --git a/test/battle/ability/bad_dreams.c b/test/battle/ability/bad_dreams.c index 8a1d3669a2..41cedf8e3e 100644 --- a/test/battle/ability/bad_dreams.c +++ b/test/battle/ability/bad_dreams.c @@ -2,7 +2,7 @@ #include "test/battle.h" // Also checks that non-sleeping enemy is not affected. -SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of hp") +SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of HP") { u32 status; PARAMETRIZE { status = STATUS1_NONE; } diff --git a/test/battle/ability/ball_fetch.c b/test/battle/ability/ball_fetch.c new file mode 100644 index 0000000000..7411d60a7d --- /dev/null +++ b/test/battle/ability/ball_fetch.c @@ -0,0 +1,7 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Ball Fetch causes the Pokémon to pick up the last failed Ball at the end of the turn"); +TO_DO_BATTLE_TEST("Ball Fetch doesn't trigger if the Pokémon is already holding an item"); +TO_DO_BATTLE_TEST("Ball Fetch only picks up the first failed ball, once per battle"); // Bestow can help test this +TO_DO_BATTLE_TEST("Ball Fetch doesn't trigger in Max Raid Battles"); diff --git a/test/battle/ability/battery.c b/test/battle/ability/battery.c new file mode 100644 index 0000000000..cecfa81d0c --- /dev/null +++ b/test/battle/ability/battery.c @@ -0,0 +1,5 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Battery increases Sp. Attack damage of allies by ~30%"); // 5325/4096 +TO_DO_BATTLE_TEST("Battery does not increase its own Sp. Attack damage"); diff --git a/test/battle/ability/beads_of_ruin.c b/test/battle/ability/beads_of_ruin.c index cfcfb17467..37240d2d68 100644 --- a/test/battle/ability/beads_of_ruin.c +++ b/test/battle/ability/beads_of_ruin.c @@ -73,3 +73,5 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler MESSAGE("The opposing Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!"); } } + +TO_DO_BATTLE_TEST("Beads of Ruin reduce Defense if Wonder Room is active"); diff --git a/test/battle/ability/beast_boost.c b/test/battle/ability/beast_boost.c index 9b07c51f1d..8f823ab3f6 100644 --- a/test/battle/ability/beast_boost.c +++ b/test/battle/ability/beast_boost.c @@ -56,3 +56,16 @@ SINGLE_BATTLE_TEST("Beast Boost doesn't trigger if user is fainted") MESSAGE("2 sent out Wobbuffet!"); } } + +TO_DO_BATTLE_TEST("Beast Boost boosts Attack 1st in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost boosts Defense 2nd in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost boosts Special Attack 3rd in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost boosts Special Defense 4th in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost considers Power Split"); +TO_DO_BATTLE_TEST("Beast Boost considers Guard Split"); +TO_DO_BATTLE_TEST("Beast Boost considers Power Trick"); +TO_DO_BATTLE_TEST("Beast Boost considers Wonder Room"); +TO_DO_BATTLE_TEST("Beast Boost considers Speed Swap"); +TO_DO_BATTLE_TEST("Beast Boost doesn't consider stat stages"); +TO_DO_BATTLE_TEST("Beast Boost doesn't consider held items"); +TO_DO_BATTLE_TEST("Beast Boost doesn't consider status condition reductions"); diff --git a/test/battle/ability/berserk.c b/test/battle/ability/berserk.c index e4d625ebc5..80e418e3c5 100644 --- a/test/battle/ability/berserk.c +++ b/test/battle/ability/berserk.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Berserk activates only if the target had more than 50% of its hp") +SINGLE_BATTLE_TEST("Berserk activates only if the target had more than 50% of its HP") { bool32 activates = FALSE; u16 maxHp = 500, hp = 0; diff --git a/test/battle/ability/bulletproof.c b/test/battle/ability/bulletproof.c new file mode 100644 index 0000000000..733eb63a11 --- /dev/null +++ b/test/battle/ability/bulletproof.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Bulletproof makes ballistic moves fail against the ability user"); diff --git a/test/battle/ability/cheeck_pouch.c b/test/battle/ability/cheek_pouch.c similarity index 100% rename from test/battle/ability/cheeck_pouch.c rename to test/battle/ability/cheek_pouch.c From 9924ae33915999ae82c171af511a4978a21bbf35 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 15 May 2025 10:40:35 +0200 Subject: [PATCH 6/9] Make make clean work again (#6848) Co-authored-by: Hedara --- Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Makefile b/Makefile index 52b4c94b9e..f2128cc25d 100644 --- a/Makefile +++ b/Makefile @@ -350,9 +350,6 @@ clean-generated: COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/gba/defines.h -imacros include/config/general.h | tail -n1) ifeq ($(COMPETITIVE_PARTY_SYNTAX),1) %.h: %.party ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< - - -AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/trainers.h -AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/battle_partners.h endif $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast From 4474bd5b809b61b36b1f9a7225b1b19068756e8b Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Thu, 15 May 2025 03:44:09 -0500 Subject: [PATCH 7/9] Add move description data for Z-Moves and Max/G-Max moves (#6852) --- src/data/moves_info.h | 368 +++++++++++++++++++++++++++++++----------- test/text.c | 2 +- 2 files changed, 271 insertions(+), 99 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index f9897650a5..fa93c75054 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -105,6 +105,14 @@ static const u8 sFeintDescription[] = _( "An attack that hits foes\n" "using moves like Protect."); +static const u8 sProtectDescription[] = _( + "Evades attack, but may fail\n" + "if used in succession."); + +static const u8 sGMaxOneBlowDescription[] = _( + "G-max Urshifu attack.\n" + "Ignores Max Guard."); + const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { [MOVE_NONE] = @@ -4778,9 +4786,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_PROTECT] = { .name = COMPOUND_STRING("Protect"), - .description = COMPOUND_STRING( - "Evades attack, but may fail\n" - "if used in succession."), + .description = sProtectDescription, .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_NORMAL, @@ -5168,9 +5174,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_DETECT] = { .name = COMPOUND_STRING("Detect"), - .description = COMPOUND_STRING( - "Evades attack, but may fail\n" - "if used in succession."), + .description = sProtectDescription, .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_FIGHTING, @@ -21011,7 +21015,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_BREAKNECK_BLITZ] = { .name = COMPOUND_STRING("Breakneck Blitz"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Builds momentum and crashes\n" + "into the foe. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_NORMAL, @@ -21024,8 +21030,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_ALL_OUT_PUMMELING] = { - .name = COMPOUND_STRING("All Out Pummeling"), - .description = sNullDescription, + .name = COMPOUND_STRING("All-Out Pummeling"), + .description = COMPOUND_STRING( + "Rams an energy orb into\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FIGHTING, @@ -21039,7 +21047,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SUPERSONIC_SKYSTRIKE] = { .name = COMPOUND_STRING("Supersonic Skystrike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Soars up and plummets toward\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FLYING, @@ -21053,7 +21063,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_ACID_DOWNPOUR] = { .name = COMPOUND_STRING("Acid Downpour"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Sinks the target in a poison\n" + "swamp. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_POISON, @@ -21067,7 +21079,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TECTONIC_RAGE] = { .name = COMPOUND_STRING("Tectonic Rage"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Burrows deep and slams into\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_GROUND, @@ -21082,7 +21096,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CONTINENTAL_CRUSH] = { .name = COMPOUND_STRING("Continental Crush"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Drops a huge rock mountain\n" + "on the foe. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_ROCK, @@ -21095,8 +21111,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_SAVAGE_SPIN_OUT] = { - .name = COMPOUND_STRING("Savage Spin Out"), - .description = sNullDescription, + .name = COMPOUND_STRING("Savage Spin-Out"), + .description = COMPOUND_STRING( + "Spits threads of silk to\n" + "bind the foe. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_BUG, @@ -21109,8 +21127,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_NEVER_ENDING_NIGHTMARE] = { - .name = COMPOUND_STRING("Never Ending Nightmare"), - .description = sNullDescription, + .name = COMPOUND_STRING("Never-Ending Nightmare"), + .description = COMPOUND_STRING( + "Deep-seated grudges trap\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_GHOST, @@ -21124,7 +21144,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CORKSCREW_CRASH] = { .name = COMPOUND_STRING("Corkscrew Crash"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Spins very fast and rams\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_STEEL, @@ -21138,7 +21160,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_INFERNO_OVERDRIVE] = { .name = COMPOUND_STRING("Inferno Overdrive"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Breathes intense fire at\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FIRE, @@ -21152,7 +21176,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_HYDRO_VORTEX] = { .name = COMPOUND_STRING("Hydro Vortex"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "A huge whirlpool swallows\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_WATER, @@ -21166,7 +21192,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_BLOOM_DOOM] = { .name = COMPOUND_STRING("Bloom Doom"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Uses plant energy to attack\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_GRASS, @@ -21180,7 +21208,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_GIGAVOLT_HAVOC] = { .name = COMPOUND_STRING("Gigavolt Havoc"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Hits the foe with powerful\n" + "electricity. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_ELECTRIC, @@ -21194,7 +21224,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SHATTERED_PSYCHE] = { .name = COMPOUND_STRING("Shattered Psyche"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Controls the target to\n" + "hurt it. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_PSYCHIC, @@ -21208,7 +21240,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SUBZERO_SLAMMER] = { .name = COMPOUND_STRING("Subzero Slammer"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Drops the temp and freezes\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_ICE, @@ -21222,7 +21256,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_DEVASTATING_DRAKE] = { .name = COMPOUND_STRING("Devastating Drake"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Develops aura and attacks\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_DRAGON, @@ -21236,7 +21272,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_BLACK_HOLE_ECLIPSE] = { .name = COMPOUND_STRING("Black Hole Eclipse"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Sucks the target into dark\n" + "energy. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_DARK, @@ -21250,7 +21288,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TWINKLE_TACKLE] = { .name = COMPOUND_STRING("Twinkle Tackle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Toys with the target in a\n" + "charming space. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FAIRY, @@ -21264,7 +21304,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CATASTROPIKA] = { .name = COMPOUND_STRING("Catastropika"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Pikachu uses the max amount\n" + "of electricity and pounces."), .effect = EFFECT_HIT, .power = 210, .type = TYPE_ELECTRIC, @@ -21278,7 +21320,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_10000000_VOLT_THUNDERBOLT] = { .name = COMPOUND_STRING("10,000,000 Volt Thunderbolt"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Cap Pikachu unleashes jolt.\n" + "High critical-hit ratio."), .effect = EFFECT_HIT, .power = 195, .type = TYPE_ELECTRIC, @@ -21293,7 +21337,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_STOKED_SPARKSURFER] = { .name = COMPOUND_STRING("Stoked Sparksurfer"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Alolan Raichu attacks with\n" + "full force. Causes paralysis."), .effect = EFFECT_HIT, .power = 175, .type = TYPE_ELECTRIC, @@ -21311,7 +21357,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_EXTREME_EVOBOOST] = { .name = COMPOUND_STRING("Extreme Evoboost"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Eevee gets energy from\n" + "its friends. Boosts stats."), .effect = EFFECT_EXTREME_EVOBOOST, .power = 0, .type = TYPE_NORMAL, @@ -21325,7 +21373,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_PULVERIZING_PANCAKE] = { .name = COMPOUND_STRING("Pulverizing Pancake"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Snorlax energetically moves\n" + "and attacks with full force."), .effect = EFFECT_HIT, .power = 210, .type = TYPE_NORMAL, @@ -21339,7 +21389,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_GENESIS_SUPERNOVA] = { .name = COMPOUND_STRING("Genesis Supernova"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Mew attacks with full force.\n" + "Psychically charges terrain."), .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, .power = 185, .type = TYPE_PSYCHIC, @@ -21354,7 +21406,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SINISTER_ARROW_RAID] = { .name = COMPOUND_STRING("Sinister Arrow Raid"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Decidueye shoots countless\n" + "arrows with full force."), .effect = EFFECT_HIT, .power = 180, .type = TYPE_GHOST, @@ -21368,7 +21422,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MALICIOUS_MOONSAULT] = { .name = COMPOUND_STRING("Malicious Moonsault"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Incineroar crashes into\n" + "the target with full force."), .effect = EFFECT_HIT, .power = 180, .type = TYPE_DARK, @@ -21382,7 +21438,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_OCEANIC_OPERETTA] = { .name = COMPOUND_STRING("Oceanic Operetta"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Primarina summons a massive\n" + "amount of water at the foe."), .effect = EFFECT_HIT, .power = 195, .type = TYPE_WATER, @@ -21396,7 +21454,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SPLINTERED_STORMSHARDS] = { .name = COMPOUND_STRING("Splintered Stormshards"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Lycanroc attacks with full\n" + "force. Removes all terrain."), .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, .power = 190, .type = TYPE_ROCK, @@ -21411,7 +21471,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_LETS_SNUGGLE_FOREVER] = { .name = COMPOUND_STRING("Let's Snuggle Forever"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Mimikyu punches the target\n" + "with full force."), .effect = EFFECT_HIT, .power = 190, .type = TYPE_FAIRY, @@ -21425,7 +21487,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CLANGOROUS_SOULBLAZE] = { .name = COMPOUND_STRING("Clangorous Soulblaze"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Kommo-o attacks with full\n" + "force. Boosts all stats."), .effect = EFFECT_HIT, .power = 185, .type = TYPE_DRAGON, @@ -21446,7 +21510,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_GUARDIAN_OF_ALOLA] = { .name = COMPOUND_STRING("Guardian of Alola"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "The Land Spirit Pokémon\n" + "greatly reduces the foe's HP."), .effect = EFFECT_GUARDIAN_OF_ALOLA, .power = 1, .type = TYPE_FAIRY, @@ -21460,7 +21526,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SEARING_SUNRAZE_SMASH] = { .name = COMPOUND_STRING("Searing Sunraze Smash"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Solgaleo attacks with full\n" + "force. Ignores abilities."), .effect = EFFECT_HIT, .power = 200, .type = TYPE_STEEL, @@ -21475,7 +21543,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MENACING_MOONRAZE_MAELSTROM] = { .name = COMPOUND_STRING("Menacing Moonraze Maelstrom"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Lunala attacks with full\n" + "force. Ignores abilities."), .effect = EFFECT_HIT, .power = 200, .type = TYPE_GHOST, @@ -21489,8 +21559,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_LIGHT_THAT_BURNS_THE_SKY] = { - .name = COMPOUND_STRING("Light That Burns The Sky"), - .description = sNullDescription, + .name = COMPOUND_STRING("Light That Burns the Sky"), + .description = COMPOUND_STRING( + "Uses Necrozma's highest\n" + "attack. Ignores abilities."), .effect = EFFECT_PHOTON_GEYSER, .power = 200, .type = TYPE_PSYCHIC, @@ -21504,8 +21576,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_SOUL_STEALING_7_STAR_STRIKE] = { - .name = COMPOUND_STRING("Soul Stealing 7 Star Strike"), - .description = sNullDescription, + .name = COMPOUND_STRING("Soul-Stealing 7-Star Strike"), + .description = COMPOUND_STRING( + "Marshadow punches and\n" + "kicks with full force."), .effect = EFFECT_HIT, .power = 195, .type = TYPE_GHOST, @@ -21520,7 +21594,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_GUARD] = { .name = COMPOUND_STRING("Max Guard"), - .description = sNullDescription, + .description = sProtectDescription, .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_NORMAL, @@ -21535,7 +21609,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_FLARE] = { .name = COMPOUND_STRING("Max Flare"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Fire Dynamax attack.\n" + "Intensifies sun for 5 turns."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FIRE, @@ -21555,7 +21631,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_FLUTTERBY] = { .name = COMPOUND_STRING("Max Flutterby"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Bug Dynamax attack.\n" + "Lowers foe's Sp. Atk stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_BUG, @@ -21575,7 +21653,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_LIGHTNING] = { .name = COMPOUND_STRING("Max Lightning"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Electric Dynamax attack.\n" + "Turns the terrain electric."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_ELECTRIC, @@ -21595,7 +21675,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_STRIKE] = { .name = COMPOUND_STRING("Max Strike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Normal Dynamax attack.\n" + "Lowers foe's Speed stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_NORMAL, @@ -21615,7 +21697,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_KNUCKLE] = { .name = COMPOUND_STRING("Max Knuckle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Fighting Dynamax attack.\n" + "Boosts ally Attack stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FIGHTING, @@ -21635,7 +21719,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_PHANTASM] = { .name = COMPOUND_STRING("Max Phantasm"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Ghost Dynamax attack.\n" + "Lowers foe's Defense stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_GHOST, @@ -21655,7 +21741,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_HAILSTORM] = { .name = COMPOUND_STRING("Max Hailstorm"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Ice Dynamax attack.\n" + "Summons hail for 5 turns."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_ICE, @@ -21675,7 +21763,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_OOZE] = { .name = COMPOUND_STRING("Max Ooze"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Poison Dynamax attack.\n" + "Boosts ally Sp. Atk stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_POISON, @@ -21695,7 +21785,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_GEYSER] = { .name = COMPOUND_STRING("Max Geyser"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Water Dynamax attack.\n" + "Summons rain for 5 turns."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_WATER, @@ -21715,7 +21807,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_AIRSTREAM] = { .name = COMPOUND_STRING("Max Airstream"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Flying Dynamax attack.\n" + "Boosts ally Speed stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FLYING, @@ -21735,7 +21829,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_STARFALL] = { .name = COMPOUND_STRING("Max Starfall"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Fairy Dynamax attack.\n" + "Turns the terrain misty."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FAIRY, @@ -21755,7 +21851,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_WYRMWIND] = { .name = COMPOUND_STRING("Max Wyrmwind"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Dragon Dynamax attack.\n" + "Lowers foe's Attack stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_DRAGON, @@ -21775,7 +21873,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_MINDSTORM] = { .name = COMPOUND_STRING("Max Mindstorm"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Psychic Dynamax attack.\n" + "Turns the terrain psychic."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_PSYCHIC, @@ -21795,7 +21895,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_ROCKFALL] = { .name = COMPOUND_STRING("Max Rockfall"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Rock Dynamax attack.\n" + "Summons a sandstorm."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_ROCK, @@ -21815,7 +21917,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_QUAKE] = { .name = COMPOUND_STRING("Max Quake"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Ground Dynamax attack.\n" + "Boosts ally Sp. Def stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_GROUND, @@ -21836,7 +21940,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_DARKNESS] = { .name = COMPOUND_STRING("Max Darkness"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Dark Dynamax attack.\n" + "Lowers foe's Sp. Def stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_DARK, @@ -21856,7 +21962,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_OVERGROWTH] = { .name = COMPOUND_STRING("Max Overgrowth"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Grass Dynamax attack.\n" + "Turns the terrain grassy."), .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -21876,7 +21984,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_STEELSPIKE] = { .name = COMPOUND_STRING("Max Steelspike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Steel Dynamax attack.\n" + "Boosts ally Defense stats."), .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_STEEL, @@ -21896,7 +22006,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_VINE_LASH] = { .name = COMPOUND_STRING("G-Max Vine Lash"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Venusaur attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -21916,7 +22028,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_WILDFIRE] = { .name = COMPOUND_STRING("G-Max Wildfire"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Charizard attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIRE, @@ -21936,7 +22050,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CANNONADE] = { .name = COMPOUND_STRING("G-Max Cannonade"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Blastoise attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -21956,7 +22072,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_BEFUDDLE] = { .name = COMPOUND_STRING("G-Max Befuddle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Butterfree attack.\n" + "Poison, paralysis, or sleep."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_BUG, @@ -21976,7 +22094,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_VOLT_CRASH] = { .name = COMPOUND_STRING("G-Max Volt Crash"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Pikachu attack.\n" + "Paralyzes opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ELECTRIC, @@ -21996,7 +22116,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_GOLD_RUSH] = { .name = COMPOUND_STRING("G-Max Gold Rush"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Meowth attack.\n" + "Confuses and earns money."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_NORMAL, @@ -22016,7 +22138,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CHI_STRIKE] = { .name = COMPOUND_STRING("G-Max Chi Strike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Machamp attack.\n" + "Boosts critical-hit ratio."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIGHTING, @@ -22036,7 +22160,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_TERROR] = { .name = COMPOUND_STRING("G-Max Terror"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Gengar attack.\n" + "Prevents foes from escaping."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GHOST, @@ -22056,7 +22182,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_FOAM_BURST] = { .name = COMPOUND_STRING("G-Max Foam Burst"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Kingler attack.\n" + "Harshly lowers foe's Speed."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22076,7 +22204,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_RESONANCE] = { .name = COMPOUND_STRING("G-Max Resonance"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Lapras attack.\n" + "Reduces damage for 5 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ICE, @@ -22096,7 +22226,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CUDDLE] = { .name = COMPOUND_STRING("G-Max Cuddle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Eevee attack.\n" + "Infatuates opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_NORMAL, @@ -22116,7 +22248,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_REPLENISH] = { .name = COMPOUND_STRING("G-Max Replenish"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Snorlax attack.\n" + "Restores eaten Berries."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_NORMAL, @@ -22136,7 +22270,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_MALODOR] = { .name = COMPOUND_STRING("G-Max Malodor"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Garbodor attack.\n" + "Poisons opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_POISON, @@ -22156,7 +22292,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_MELTDOWN] = { .name = COMPOUND_STRING("G-Max Meltdown"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Melmetal attack.\n" + "Prevents repeat move use."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_STEEL, @@ -22176,7 +22314,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_DRUM_SOLO] = { .name = COMPOUND_STRING("G-Max Drum Solo"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Rillaboom attack.\n" + "Ignores target's abilities."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -22197,7 +22337,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_FIREBALL] = { .name = COMPOUND_STRING("G-Max Fireball"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Cinderace attack.\n" + "Ignores target's abilities."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIRE, @@ -22218,7 +22360,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_HYDROSNIPE] = { .name = COMPOUND_STRING("G-Max Hydrosnipe"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Inteleon attack.\n" + "Ignores target's abilities."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22239,7 +22383,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_WIND_RAGE] = { .name = COMPOUND_STRING("G-Max Wind Rage"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Corviknight attack.\n" + "Removes opponent screens."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FLYING, @@ -22259,7 +22405,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_GRAVITAS] = { .name = COMPOUND_STRING("G-Max Gravitas"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Orbeetle attack.\n" + "Changes gravity for 5 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_PSYCHIC, @@ -22279,7 +22427,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_STONESURGE] = { .name = COMPOUND_STRING("G-Max Stonesurge"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Drednaw attack.\n" + "Scatters sharp rocks."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22299,7 +22449,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_VOLCALITH] = { .name = COMPOUND_STRING("G-Max Volcalith"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Coalossal attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ROCK, @@ -22319,7 +22471,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_TARTNESS] = { .name = COMPOUND_STRING("G-Max Tartness"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Flapple attack.\n" + "Lowers foe's evasiveness."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -22339,7 +22493,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SWEETNESS] = { .name = COMPOUND_STRING("G-Max Sweetness"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Appletun attack.\n" + "Heals ally status conditions."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -22359,7 +22515,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SANDBLAST] = { .name = COMPOUND_STRING("G-Max Sandblast"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Sandaconda attack.\n" + "Traps foes in a sandstorm."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GROUND, @@ -22379,7 +22537,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_STUN_SHOCK] = { .name = COMPOUND_STRING("G-Max Stun Shock"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Toxtricity attack.\n" + "Poisons or paralyzes foes."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ELECTRIC, @@ -22399,7 +22559,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CENTIFERNO] = { .name = COMPOUND_STRING("G-Max Centiferno"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Toxtricity attack.\n" + "Traps foes in flames."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIRE, @@ -22419,7 +22581,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SMITE] = { .name = COMPOUND_STRING("G-Max Smite"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Hatterene attack.\n" + "Confuses opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FAIRY, @@ -22440,7 +22604,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SNOOZE] = { .name = COMPOUND_STRING("G-Max Snooze"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Grimmsnarl attack.\n" + "Lulls foes into sleep."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_DARK, @@ -22460,7 +22626,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_FINALE] = { .name = COMPOUND_STRING("G-Max Finale"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Alcremie attack.\n" + "Heals ally HP."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FAIRY, @@ -22480,7 +22648,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_STEELSURGE] = { .name = COMPOUND_STRING("G-Max Steelsurge"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Copperajah attack.\n" + "Scatters sharp spikes."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_STEEL, @@ -22500,7 +22670,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_DEPLETION] = { .name = COMPOUND_STRING("G-Max Depletion"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Duraludon attack.\n" + "Reduces target's PP."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_DRAGON, @@ -22520,7 +22692,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_ONE_BLOW] = { .name = COMPOUND_STRING("G-Max One Blow"), - .description = sNullDescription, + .description = sGMaxOneBlowDescription, //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_DARK, @@ -22536,7 +22708,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_RAPID_FLOW] = { .name = COMPOUND_STRING("G-Max Rapid Flow"), - .description = sNullDescription, + .description = sGMaxOneBlowDescription, //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, diff --git a/test/text.c b/test/text.c index 7650c2dd59..8e9a205196 100644 --- a/test/text.c +++ b/test/text.c @@ -93,7 +93,7 @@ TEST("Move descriptions fit on Pokemon Summary Screen") u32 i; const u32 fontId = FONT_NORMAL, widthPx = 152; u32 move = MOVE_NONE; - for (i = 1; i < MOVES_COUNT; i++) + for (i = 1; i < MOVES_COUNT_ALL; i++) { PARAMETRIZE_LABEL("%S", GetMoveDescription(i)) { move = i; } } From 75cd16dae0c279b4db4f57196b6e02875bc9a214 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 15 May 2025 10:44:37 +0200 Subject: [PATCH 8/9] Fix potential bug in BattleScript_FriskActivates (#6850) --- data/battle_scripts_1.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ada937ff4a..4967e90d95 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8528,9 +8528,11 @@ BattleScript_FriskMsg:: BattleScript_FriskActivates:: saveattacker + savetarget copybyte gBattlerAttacker, sBATTLER tryfriskmsg BS_SCRIPTING restoreattacker + restoretarget end3 BattleScript_ImposterActivates:: From a086d5f592a944fb97e6deb044cf67180e8f248d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 15 May 2025 10:45:48 +0200 Subject: [PATCH 9/9] Reverts wrongly done gem fix and renames struggle effect (#6806) --- data/battle_scripts_1.s | 2 +- include/battle_scripts.h | 2 +- include/constants/battle_move_effects.h | 2 +- src/battle_main.c | 6 ++++-- src/battle_script_commands.c | 3 +-- src/data/battle_move_effects.h | 4 ++-- src/data/moves_info.h | 2 +- test/battle/hold_effect/gems.c | 16 ---------------- 8 files changed, 11 insertions(+), 26 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4967e90d95..7abff820b9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5229,7 +5229,7 @@ BattleScript_EffectSnatch:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectRecoilHP25:: +BattleScript_EffectStruggle:: jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit incrementgamestat GAME_STAT_USED_STRUGGLE goto BattleScript_EffectHit diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 25d96dc4b8..ab25df0684 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -816,7 +816,7 @@ extern const u8 BattleScript_MoveEffectEerieSpell[]; extern const u8 BattleScript_EffectJungleHealing[]; extern const u8 BattleScript_EffectCoaching[]; extern const u8 BattleScript_EffectDecorate[]; -extern const u8 BattleScript_EffectRecoilHP25[]; +extern const u8 BattleScript_EffectStruggle[]; extern const u8 BattleScript_EffectStuffCheeks[]; extern const u8 BattleScript_MoveEffectLightScreen[]; extern const u8 BattleScript_MoveEffectReflect[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 6525cf1544..073d4d2058 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -292,7 +292,7 @@ enum { EFFECT_DYNAMAX_DOUBLE_DMG, EFFECT_DECORATE, EFFECT_SNIPE_SHOT, - EFFECT_RECOIL_HP_25, + EFFECT_STRUGGLE, EFFECT_STUFF_CHEEKS, EFFECT_GRAV_APPLE, EFFECT_HYPERSPACE_FURY, diff --git a/src/battle_main.c b/src/battle_main.c index 3f6c5e8617..7b33e16374 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -6074,10 +6074,12 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) gBattleStruct->dynamicMoveType = TYPE_ELECTRIC | F_DYNAMIC_TYPE_SET; // Check if a gem should activate. + u32 effect = GetMoveEffect(move); if (holdEffect == HOLD_EFFECT_GEMS && GetBattleMoveType(move) == ItemId_GetSecondaryId(heldItem) - && GetMoveEffect(move) != EFFECT_PLEDGE - && GetMovePower(move) > 1) + && effect != EFFECT_PLEDGE + && effect != EFFECT_OHKO + && effect != EFFECT_STRUGGLE) { gSpecialStatuses[battler].gemParam = GetBattlerHoldEffectParam(battler); gSpecialStatuses[battler].gemBoost = TRUE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9d9e183a46..716e562aeb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2201,8 +2201,7 @@ static void Cmd_adjustdamage(void) if (gSpecialStatuses[gBattlerAttacker].gemBoost && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gBattleMons[gBattlerAttacker].item - && gCurrentMove != MOVE_STRUGGLE) + && gBattleMons[gBattlerAttacker].item) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_GemActivates; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index d5b3d5dc54..6b4741ab5e 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1876,9 +1876,9 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_RECOIL_HP_25] = + [EFFECT_STRUGGLE] = { - .battleScript = BattleScript_EffectRecoilHP25, + .battleScript = BattleScript_EffectStruggle, .battleTvScore = 0, // TODO: Assign points }, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index fa93c75054..70d3184ece 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -4333,7 +4333,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Used only if all PP are gone.\n" "Also hurts the user a little."), #if B_UPDATED_MOVE_DATA >= GEN_4 - .effect = EFFECT_RECOIL_HP_25, + .effect = EFFECT_STRUGGLE, .accuracy = 0, .mirrorMoveBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ diff --git a/test/battle/hold_effect/gems.c b/test/battle/hold_effect/gems.c index 5486443808..52c85d7fb5 100644 --- a/test/battle/hold_effect/gems.c +++ b/test/battle/hold_effect/gems.c @@ -87,19 +87,3 @@ SINGLE_BATTLE_TEST("Gem is consumed if the move type is changed") ANIMATION(ANIM_TYPE_MOVE, MOVE_FEINT_ATTACK, player); } } - -SINGLE_BATTLE_TEST("Gem is not consumed if a no type damage move is used") //ie. Counter, Psywave, Super Fang. All these moves have 1 base power. -{ - ASSUME(GetMovePower(MOVE_PSYWAVE) == 1); - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_GEM); }; - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_PSYWAVE); } - } SCENE { - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("The Psychic Gem strengthened Wobbuffet's power!"); - } - } -}