From cf85abc270dfb3ea6e1409676f11de040247164b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 26 Jun 2025 16:42:12 -0400 Subject: [PATCH 001/183] Remove unused messages --- include/constants/battle_string_ids.h | 10 ---------- src/battle_message.c | 12 +----------- src/battle_tv.c | 2 -- test/text.c | 3 --- 4 files changed, 1 insertion(+), 26 deletions(-) diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 57cf6f7021..4bb3d5494c 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -62,11 +62,8 @@ enum StringID STRINGID_PKMNISPARALYZED, STRINGID_PKMNISALREADYPARALYZED, STRINGID_PKMNHEALEDPARALYSIS, - STRINGID_PKMNDREAMEATEN, STRINGID_STATSWONTINCREASE, STRINGID_STATSWONTDECREASE, - STRINGID_TEAMSTOPPEDWORKING, - STRINGID_FOESTOPPEDWORKING, STRINGID_PKMNISCONFUSED, STRINGID_PKMNHEALEDCONFUSION, STRINGID_PKMNWASCONFUSED, @@ -74,7 +71,6 @@ enum StringID STRINGID_PKMNFELLINLOVE, STRINGID_PKMNINLOVE, STRINGID_PKMNIMMOBILIZEDBYLOVE, - STRINGID_PKMNBLOWNAWAY, STRINGID_PKMNCHANGEDTYPE, STRINGID_PKMNFLINCHED, STRINGID_PKMNREGAINEDHEALTH, @@ -180,7 +176,6 @@ enum StringID STRINGID_PKMNREADYTOHELP, STRINGID_PKMNSWITCHEDITEMS, STRINGID_PKMNCOPIEDFOE, - STRINGID_PKMNMADEWISH, STRINGID_PKMNWISHCAMETRUE, STRINGID_PKMNPLANTEDROOTS, STRINGID_PKMNABSORBEDNUTRIENTS, @@ -251,7 +246,6 @@ enum StringID STRINGID_HAILSTOPPED, STRINGID_FAILEDTOSPITUP, STRINGID_FAILEDTOSWALLOW, - STRINGID_WINDBECAMEHEATWAVE, STRINGID_STATCHANGESGONE, STRINGID_COINSSCATTERED, STRINGID_TOOWEAKFORSUBSTITUTE, @@ -327,7 +321,6 @@ enum StringID STRINGID_PLAYERDEFEATEDTRAINER1, STRINGID_SOOTHINGAROMA, STRINGID_ITEMSCANTBEUSEDNOW, - STRINGID_FORXCOMMAYZ, STRINGID_USINGITEMSTATOFPKMNROSE, STRINGID_PKMNUSEDXTOGETPUMPED, STRINGID_PKMNSXMADEYUSELESS, @@ -344,7 +337,6 @@ enum StringID STRINGID_PKMNFLEDUSINGITS, STRINGID_PKMNFLEDUSING, STRINGID_PKMNWASDRAGGEDOUT, - STRINGID_PREVENTEDFROMWORKING, STRINGID_PKMNSITEMNORMALIZEDSTATUS, STRINGID_TRAINER1USEDITEM, STRINGID_BOXISFULL, @@ -355,8 +347,6 @@ enum StringID STRINGID_STATSWONTDECREASE2, STRINGID_PKMNSXBLOCKSY2, STRINGID_PKMNSXWOREOFF, - STRINGID_PKMNRAISEDDEFALITTLE, - STRINGID_PKMNRAISEDSPDEFALITTLE, STRINGID_THEWALLSHATTERED, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXCUREDITSYPROBLEM, diff --git a/src/battle_message.c b/src/battle_message.c index eb44ca96ee..b4bef73e41 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -221,11 +221,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNISPARALYZED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} couldn't move because it's paralyzed!"), [STRINGID_PKMNISALREADYPARALYZED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already paralyzed!"), [STRINGID_PKMNHEALEDPARALYSIS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was cured of paralysis!"), - [STRINGID_PKMNDREAMEATEN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s dream was eaten!"), //not in gen 5+, expansion doesn't use anymore [STRINGID_STATSWONTINCREASE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} won't go any higher!"), [STRINGID_STATSWONTDECREASE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} won't go any lower!"), - [STRINGID_TEAMSTOPPEDWORKING] = COMPOUND_STRING("Your team's {B_BUFF1} stopped working!"), //unused - [STRINGID_FOESTOPPEDWORKING] = COMPOUND_STRING("The foe's {B_BUFF1} stopped working!"), //unused [STRINGID_PKMNISCONFUSED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is confused!"), [STRINGID_PKMNHEALEDCONFUSION] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} snapped out of its confusion!"), [STRINGID_PKMNWASCONFUSED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} became confused!"), @@ -233,7 +230,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNFELLINLOVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fell in love!"), [STRINGID_PKMNINLOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is in love with {B_SCR_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNIMMOBILIZEDBYLOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is immobilized by love!"), - [STRINGID_PKMNBLOWNAWAY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was blown away!"), //unused [STRINGID_PKMNCHANGEDTYPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into the {B_BUFF1} type!"), [STRINGID_PKMNFLINCHED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} flinched and couldn't move!"), [STRINGID_PKMNREGAINEDHEALTH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s HP was restored."), @@ -325,7 +321,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNFLEDFROMBATTLE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} fled from battle!"), [STRINGID_PKMNFORESAWATTACK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} foresaw an attack!"), [STRINGID_PKMNTOOKATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} took the {B_BUFF1} attack!"), - [STRINGID_PKMNATTACK] = COMPOUND_STRING("{B_BUFF1}'s attack!"), //not in gen 5+, expansion doesn't use anymore + [STRINGID_PKMNATTACK] = COMPOUND_STRING("{B_BUFF1}'s attack!"), //not in gen 5+ [STRINGID_PKMNCENTERATTENTION] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} became the center of attention!"), [STRINGID_PKMNCHARGINGPOWER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} began charging power!"), [STRINGID_NATUREPOWERTURNEDINTO] = COMPOUND_STRING("Nature Power turned into {B_CURRENT_MOVE}!"), @@ -339,7 +335,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNREADYTOHELP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is ready to help {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNSWITCHEDITEMS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} switched items with its target!"), [STRINGID_PKMNCOPIEDFOE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} copied {B_DEF_NAME_WITH_PREFIX2}'s Ability!"), - [STRINGID_PKMNMADEWISH] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} made a wish!"), //unused [STRINGID_PKMNWISHCAMETRUE] = COMPOUND_STRING("{B_BUFF1}'s wish came true!"), [STRINGID_PKMNPLANTEDROOTS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} planted its roots!"), [STRINGID_PKMNABSORBEDNUTRIENTS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} absorbed nutrients with its roots!"), @@ -410,7 +405,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_HAILSTOPPED] = COMPOUND_STRING("The hail stopped."), [STRINGID_FAILEDTOSPITUP] = COMPOUND_STRING("But it failed to spit up a thing!"), //not in gen 5+, uses "but it failed" [STRINGID_FAILEDTOSWALLOW] = COMPOUND_STRING("But it failed to swallow a thing!"), //not in gen 5+, uses "but it failed" - [STRINGID_WINDBECAMEHEATWAVE] = COMPOUND_STRING("The wind turned into a Heat Wave!"), //unused [STRINGID_STATCHANGESGONE] = COMPOUND_STRING("All stat changes were eliminated!"), [STRINGID_COINSSCATTERED] = COMPOUND_STRING("Coins were scattered everywhere!"), [STRINGID_TOOWEAKFORSUBSTITUTE] = COMPOUND_STRING("But it does not have enough HP left to make a substitute!"), @@ -486,7 +480,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PLAYERDEFEATEDTRAINER1] = sText_PlayerDefeatedLinkTrainerTrainer1, [STRINGID_SOOTHINGAROMA] = COMPOUND_STRING("A soothing aroma wafted through the area!"), [STRINGID_ITEMSCANTBEUSEDNOW] = COMPOUND_STRING("Items can't be used now.{PAUSE 64}"), //not in gen 5+, i think - [STRINGID_FORXCOMMAYZ] = COMPOUND_STRING("For {B_SCR_NAME_WITH_PREFIX2}, {B_LAST_ITEM} {B_BUFF1}"), //not in gen 5+, expansion doesn't use anymore [STRINGID_USINGITEMSTATOFPKMNROSE] = COMPOUND_STRING("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}"), //todo: update this, will require code changes [STRINGID_PKMNUSEDXTOGETPUMPED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used the {B_LAST_ITEM} to get pumped!"), [STRINGID_PKMNSXMADEYUSELESS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made {B_CURRENT_MOVE} useless!"), //not in gen 5+, ability popup @@ -503,7 +496,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNFLEDUSINGITS] = COMPOUND_STRING("{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled using its {B_LAST_ITEM}!\p"), [STRINGID_PKMNFLEDUSING] = COMPOUND_STRING("{PLAY_SE SE_FLEE}{B_ATK_NAME_WITH_PREFIX} fled using {B_ATK_ABILITY}!\p"), //not in gen 5+ [STRINGID_PKMNWASDRAGGEDOUT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was dragged out!\p"), - [STRINGID_PREVENTEDFROMWORKING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevented {B_SCR_NAME_WITH_PREFIX2}'s {B_BUFF1} from working!"), //unused [STRINGID_PKMNSITEMNORMALIZEDSTATUS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} normalized its status!"), [STRINGID_TRAINER1USEDITEM] = COMPOUND_STRING("{B_ATK_TRAINER_NAME_WITH_CLASS} used {B_LAST_ITEM}!"), [STRINGID_BOXISFULL] = COMPOUND_STRING("The Box is full! You can't catch any more!\p"), @@ -514,8 +506,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_STATSWONTDECREASE2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s stats won't go any lower!"), [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXWOREOFF] = COMPOUND_STRING("{B_ATK_TEAM1} team's {B_BUFF1} wore off!"), - [STRINGID_PKMNRAISEDDEFALITTLE] = COMPOUND_STRING("{B_ATK_PREFIX1}'s {B_CURRENT_MOVE} raised DEFENSE a little!"), //expansion doesn't use anymore - [STRINGID_PKMNRAISEDSPDEFALITTLE] = COMPOUND_STRING("{B_ATK_PREFIX1}'s {B_CURRENT_MOVE} raised SP. DEF a little!"), //expansion doesn't use anymore [STRINGID_THEWALLSHATTERED] = COMPOUND_STRING("The wall shattered!"), //not in gen5+, uses "your teams light screen wore off!" etc instead [STRINGID_PKMNSXPREVENTSYSZ] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), [STRINGID_PKMNSXCUREDITSYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup diff --git a/src/battle_tv.c b/src/battle_tv.c index 4215d3ead3..37ed42ff47 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -480,12 +480,10 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) } break; case STRINGID_PKMNRAISEDDEF: - case STRINGID_PKMNRAISEDDEFALITTLE: tvPtr->side[atkSide].reflectMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide].reflectMoveSlot = moveSlot; break; case STRINGID_PKMNRAISEDSPDEF: - case STRINGID_PKMNRAISEDSPDEFALITTLE: tvPtr->side[atkSide].lightScreenMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide].lightScreenMoveSlot = moveSlot; break; diff --git a/test/text.c b/test/text.c index 0a5a4dd2a2..dafd651461 100644 --- a/test/text.c +++ b/test/text.c @@ -663,8 +663,6 @@ TEST("Battle strings fit on the battle message window") break; // Buffer Move name to B_BUFF1 case STRINGID_PKMNLEARNEDMOVE2: - case STRINGID_TEAMSTOPPEDWORKING: // Unused - case STRINGID_FOESTOPPEDWORKING: // Unused case STRINGID_PKMNHURTBY: case STRINGID_PKMNFREEDFROM: case STRINGID_PKMNMOVEWASDISABLED: @@ -758,7 +756,6 @@ TEST("Battle strings fit on the battle message window") case STRINGID_PKMNCURIOUSABOUTX: case STRINGID_PKMNENTHRALLEDBYX: case STRINGID_PKMNIGNOREDX: - case STRINGID_PREVENTEDFROMWORKING: case STRINGID_PKMNOBTAINEDX: case STRINGID_ABOUTTOUSEPOLTERGEIST: PREPARE_ITEM_BUFFER(gBattleTextBuff1, longItemName); From 57da4617dad11f61bd91c7c01933effd033e1b91 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 26 Jun 2025 17:44:29 -0400 Subject: [PATCH 002/183] Ability status immunity --- data/battle_scripts_1.s | 13 +------------ include/constants/battle_string_ids.h | 17 ----------------- src/battle_arena.c | 3 --- src/battle_message.c | 16 ---------------- src/battle_util.c | 5 ----- test/battle/ability/immunity.c | 2 +- test/battle/ability/limber.c | 2 +- test/battle/ability/pastel_veil.c | 6 +++--- test/battle/ability/water_bubble.c | 2 +- 9 files changed, 7 insertions(+), 59 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fc18ab1e76..d5e0c989e4 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2801,14 +2801,6 @@ BattleScript_AromaVeilProtects: setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_PastelVeilProtects: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_PASTELVEILPROTECTED - waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_FAILED - goto BattleScript_MoveEnd - BattleScript_AbilityProtectsDoesntAffectRet:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp @@ -3164,10 +3156,7 @@ BattleScript_AlreadyPoisoned:: BattleScript_ImmunityProtected:: call BattleScript_AbilityPopUp - pause B_WAIT_TIME_SHORT - printfromtable gStatusPreventionStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + goto BattleScript_ButItFailed BattleScript_EffectAuroraVeil:: attackcanceler diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 4bb3d5494c..60c08111fd 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -197,9 +197,7 @@ enum StringID STRINGID_PKMNPREVENTSUSAGE, STRINGID_PKMNRESTOREDHPUSING, STRINGID_PKMNCHANGEDTYPEWITH, - STRINGID_PKMNPREVENTSPARALYSISWITH, STRINGID_PKMNPREVENTSROMANCEWITH, - STRINGID_PKMNPREVENTSPOISONINGWITH, STRINGID_PKMNPREVENTSCONFUSIONWITH, STRINGID_PKMNRAISEDFIREPOWERWITH, STRINGID_PKMNANCHORSITSELFWITH, @@ -302,7 +300,6 @@ enum StringID STRINGID_ITEMALLOWSONLYYMOVE, STRINGID_PKMNHUNGONWITHX, STRINGID_EMPTYSTRING3, - STRINGID_PKMNSXPREVENTSBURNS, STRINGID_PKMNSXBLOCKSY, STRINGID_PKMNSXRESTOREDHPALITTLE2, STRINGID_PKMNSXWHIPPEDUPSANDSTORM, @@ -348,14 +345,12 @@ enum StringID STRINGID_PKMNSXBLOCKSY2, STRINGID_PKMNSXWOREOFF, STRINGID_THEWALLSHATTERED, - STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXCUREDITSYPROBLEM, STRINGID_ATTACKERCANTESCAPE, STRINGID_PKMNOBTAINEDX, STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ, STRINGID_BUTNOEFFECT, - STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_TWOENEMIESDEFEATED, STRINGID_TRAINER2LOSETEXT, STRINGID_PKMNINCAPABLEOFPOWER, @@ -588,7 +583,6 @@ enum StringID STRINGID_BROKETHROUGHPROTECTION, STRINGID_ABILITYALLOWSONLYMOVE, STRINGID_SWAPPEDABILITIES, - STRINGID_PASTELVEILPROTECTED, STRINGID_PASTELVEILENTERS, STRINGID_BATTLERTYPECHANGEDTO, STRINGID_BOTHCANNOLONGERESCAPE, @@ -1040,17 +1034,6 @@ enum GotStatusedStringID B_MSG_STATUSED_BY_ABILITY, }; -// gStatusPreventionStringIds -enum StatusPreventionStringID -{ - B_MSG_ABILITY_PREVENTS_MOVE_BURN, - B_MSG_ABILITY_PREVENTS_MOVE_PARALYSIS, - B_MSG_ABILITY_PREVENTS_MOVE_POISON, - B_MSG_ABILITY_PREVENTS_ABILITY_STATUS, - B_MSG_STATUS_HAD_NO_EFFECT, - B_MSG_ABILITY_PASTEL_VEIL, -}; - // gGotDefrostedStringIds enum GotDefrostedStringID { diff --git a/src/battle_arena.c b/src/battle_arena.c index 8474595b0d..3708fec024 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -427,14 +427,11 @@ void BattleArena_DeductSkillPoints(u8 battler, enum StringID stringId) case STRINGID_PKMNSXBLOCKSY2: case STRINGID_PKMNSXPREVENTSYLOSS: case STRINGID_PKMNSXMADEYINEFFECTIVE: - case STRINGID_PKMNSXPREVENTSBURNS: case STRINGID_PKMNSXBLOCKSY: case STRINGID_PKMNPROTECTEDBY: case STRINGID_PKMNPREVENTSUSAGE: case STRINGID_PKMNRESTOREDHPUSING: - case STRINGID_PKMNPREVENTSPARALYSISWITH: case STRINGID_PKMNPREVENTSROMANCEWITH: - case STRINGID_PKMNPREVENTSPOISONINGWITH: case STRINGID_PKMNPREVENTSCONFUSIONWITH: case STRINGID_PKMNRAISEDFIREPOWERWITH: case STRINGID_PKMNANCHORSITSELFWITH: diff --git a/src/battle_message.c b/src/battle_message.c index b4bef73e41..aca93f35d9 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -356,9 +356,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNPREVENTSUSAGE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents {B_ATK_NAME_WITH_PREFIX2} from using {B_CURRENT_MOVE}!"), //I don't see this in SV text [STRINGID_PKMNRESTOREDHPUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} restored HP using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_PKMNCHANGEDTYPEWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made it the {B_BUFF1} type!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSPARALYSISWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} prevents paralysis!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSROMANCEWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents romance!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSPOISONINGWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} prevents poisoning!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSCONFUSIONWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents confusion!"), //not in gen 5+, ability popup [STRINGID_PKMNRAISEDFIREPOWERWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised the power of Fire-type moves!"), //not in gen 5+, ability popup [STRINGID_PKMNANCHORSITSELFWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} anchors itself with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup @@ -461,7 +459,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_ITEMALLOWSONLYYMOVE] = COMPOUND_STRING("{B_LAST_ITEM} only allows the use of {B_CURRENT_MOVE}!\p"), [STRINGID_PKMNHUNGONWITHX] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} hung on using its {B_LAST_ITEM}!"), [STRINGID_EMPTYSTRING3] = gText_EmptyString3, - [STRINGID_PKMNSXPREVENTSBURNS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} prevents burns!"), //not in gen 5+, ability popup [STRINGID_PKMNSXBLOCKSY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXRESTOREDHPALITTLE2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} restored its HP a little!"), //not in gen 5+, ability popup [STRINGID_PKMNSXWHIPPEDUPSANDSTORM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} whipped up a sandstorm!"), //not in gen 5+, ability popup @@ -507,14 +504,12 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXWOREOFF] = COMPOUND_STRING("{B_ATK_TEAM1} team's {B_BUFF1} wore off!"), [STRINGID_THEWALLSHATTERED] = COMPOUND_STRING("The wall shattered!"), //not in gen5+, uses "your teams light screen wore off!" etc instead - [STRINGID_PKMNSXPREVENTSYSZ] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), [STRINGID_PKMNSXCUREDITSYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup [STRINGID_ATTACKERCANTESCAPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can't escape!"), [STRINGID_PKMNOBTAINEDX] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} obtained {B_BUFF1}."), [STRINGID_PKMNOBTAINEDX2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} obtained {B_BUFF2}."), [STRINGID_PKMNOBTAINEDXYOBTAINEDZ] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} obtained {B_BUFF1}.\p{B_DEF_NAME_WITH_PREFIX} obtained {B_BUFF2}."), [STRINGID_BUTNOEFFECT] = COMPOUND_STRING("But it had no effect!"), - [STRINGID_PKMNSXHADNOEFFECTONY] = COMPOUND_STRING("Target protected by {B_LAST_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_TWOENEMIESDEFEATED] = sText_TwoInGameTrainersDefeated, [STRINGID_TRAINER2LOSETEXT] = COMPOUND_STRING("{B_TRAINER2_LOSE_TEXT}"), [STRINGID_PKMNINCAPABLEOFPOWER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} appears incapable of using its power!"), @@ -748,7 +743,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_BROKETHROUGHPROTECTION] = COMPOUND_STRING("It broke through {B_DEF_NAME_WITH_PREFIX2}'s protection!"), [STRINGID_ABILITYALLOWSONLYMOVE] = COMPOUND_STRING("{B_ATK_ABILITY} only allows the use of {B_CURRENT_MOVE}!\p"), [STRINGID_SWAPPEDABILITIES] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} swapped Abilities with its target!"), - [STRINGID_PASTELVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is protected by a pastel veil!"), [STRINGID_PASTELVEILENTERS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was cured of its poisoning!"), [STRINGID_BATTLERTYPECHANGEDTO] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s type changed to {B_BUFF1}!"), [STRINGID_BOTHCANNOLONGERESCAPE] = COMPOUND_STRING("Neither Pokémon can run away!"), @@ -1323,16 +1317,6 @@ const u16 gBerryEffectStringIds[] = [B_MSG_NORMALIZED_STATUS] = STRINGID_PKMNSITEMNORMALIZEDSTATUS }; -const u16 gStatusPreventionStringIds[] = -{ - [B_MSG_ABILITY_PREVENTS_MOVE_BURN] = STRINGID_PKMNSXPREVENTSBURNS, - [B_MSG_ABILITY_PREVENTS_MOVE_PARALYSIS] = STRINGID_PKMNPREVENTSPARALYSISWITH, - [B_MSG_ABILITY_PREVENTS_MOVE_POISON] = STRINGID_PKMNPREVENTSPOISONINGWITH, - [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, - [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY, - [B_MSG_ABILITY_PASTEL_VEIL] = STRINGID_PASTELVEILPROTECTED -}; - const u16 gItemSwapStringIds[] = { [B_MSG_ITEM_SWAP_TAKEN] = STRINGID_PKMNOBTAINEDX, diff --git a/src/battle_util.c b/src/battle_util.c index 0dd60674ca..c66fcdc867 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5645,13 +5645,11 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battlerDef = sideBattler - 1; abilityDef = ABILITY_PASTEL_VEIL; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PASTEL_VEIL; battleScript = BattleScript_ImmunityProtected; } else if (abilityDef == ABILITY_IMMUNITY) { abilityAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_POISON; battleScript = BattleScript_ImmunityProtected; } break; @@ -5673,7 +5671,6 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u else if (abilityDef == ABILITY_LIMBER) { abilityAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_PARALYSIS; battleScript = BattleScript_ImmunityProtected; } break; @@ -5689,7 +5686,6 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u else if (abilityDef == ABILITY_WATER_VEIL || abilityDef == ABILITY_WATER_BUBBLE) { abilityAffected = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_BURN; battleScript = BattleScript_ImmunityProtected; } else if (abilityDef == ABILITY_THERMAL_EXCHANGE) @@ -5720,7 +5716,6 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battlerDef = sideBattler - 1; abilityDef = ABILITY_SWEET_VEIL; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; battleScript = BattleScript_ImmunityProtected; } else if (abilityDef == ABILITY_VITAL_SPIRIT || abilityDef == ABILITY_INSOMNIA) diff --git a/test/battle/ability/immunity.c b/test/battle/ability/immunity.c index 81fbe1b8c1..6f630002f9 100644 --- a/test/battle/ability/immunity.c +++ b/test/battle/ability/immunity.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison") } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponent, ABILITY_IMMUNITY); - MESSAGE("The opposing Snorlax's Immunity prevents poisoning!"); + MESSAGE("But it failed!"); NOT STATUS_ICON(opponent, poison: TRUE); } } diff --git a/test/battle/ability/limber.c b/test/battle/ability/limber.c index f89f9a1e74..0ab3c60174 100644 --- a/test/battle/ability/limber.c +++ b/test/battle/ability/limber.c @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Limber prevents paralysis from Thunder Wave") } WHEN { TURN { MOVE(opponent, MOVE_THUNDER_WAVE); } } SCENE { - MESSAGE("Persian's Limber prevents paralysis!"); + MESSAGE("But it failed!"); NONE_OF { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, player); STATUS_ICON(player, paralysis: TRUE); diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index 1c0926ac80..cbaa3445ae 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison") } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponent, ABILITY_PASTEL_VEIL); - MESSAGE("The opposing Ponyta is protected by a pastel veil!"); + MESSAGE("But it failed!"); NOT STATUS_ICON(opponent, badPoison: TRUE); } } @@ -97,7 +97,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner - right tar } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponentLeft, ABILITY_PASTEL_VEIL); - MESSAGE("The opposing Wynaut is protected by a pastel veil!"); + MESSAGE("But it failed!"); NOT STATUS_ICON(opponentRight, badPoison: TRUE); } } @@ -114,7 +114,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner - left targ } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponentRight, ABILITY_PASTEL_VEIL); - MESSAGE("The opposing Wynaut is protected by a pastel veil!"); + MESSAGE("But it failed!"); NOT STATUS_ICON(opponentLeft, badPoison: TRUE); } } diff --git a/test/battle/ability/water_bubble.c b/test/battle/ability/water_bubble.c index d140dac040..a495c2c686 100644 --- a/test/battle/ability/water_bubble.c +++ b/test/battle/ability/water_bubble.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Water Bubble prevents burn from Will-o-Wisp") TURN { MOVE(opponent, MOVE_WILL_O_WISP); } } SCENE { ABILITY_POPUP(player, ABILITY_WATER_BUBBLE); - MESSAGE("Dewpider's Water Bubble prevents burns!"); + MESSAGE("But it failed!"); NONE_OF { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); STATUS_ICON(player, burn: TRUE); From b18de9d1828703636fa78ca54ba80d900b60d8b6 Mon Sep 17 00:00:00 2001 From: Jared Schoeny Date: Mon, 7 Jul 2025 10:24:45 -1000 Subject: [PATCH 003/183] Add making release build --- Makefile | 37 ++++++++++++++++++++++++++++++++++--- config.mk | 2 ++ include/config/debug.h | 6 +++--- include/config/general.h | 7 ++++++- include/constants/global.h | 15 +++++++++++++++ 5 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 config.mk diff --git a/Makefile b/Makefile index ebf7679af3..2da0d178bd 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,9 @@ UNUSED_ERROR ?= 0 DEBUG ?= 0 # Adds -flto flag, which increases link time but results in a more efficient binary (especially in audio processing) LTO ?= 0 +# Makes an optimized build for release, also enabling NDEBUG macro and disabling other debugging features +# Enables LTO by default, but can be changed in the config.mk file +RELEASE ?= 0 ifeq (compare,$(MAKECMDGOALS)) COMPARE := 1 @@ -31,6 +34,11 @@ endif ifeq (debug,$(MAKECMDGOALS)) DEBUG := 1 endif +ifneq (,$(filter release tidyrelease,$(MAKECMDGOALS))) + RELEASE := 1 +endif + +include config.mk # Default make rule all: rom @@ -62,10 +70,15 @@ endif CPP := $(PREFIX)cpp +ifeq ($(RELEASE),1) + FILE_NAME := $(FILE_NAME)-release +endif + ROM_NAME := $(FILE_NAME).gba OBJ_DIR_NAME := $(BUILD_DIR)/modern OBJ_DIR_NAME_TEST := $(BUILD_DIR)/modern-test OBJ_DIR_NAME_DEBUG := $(BUILD_DIR)/modern-debug +OBJ_DIR_NAME_RELEASE := $(BUILD_DIR)/modern-release ELF_NAME := $(ROM_NAME:.gba=.elf) MAP_NAME := $(ROM_NAME:.gba=.map) @@ -85,6 +98,9 @@ endif ifeq ($(DEBUG),1) OBJ_DIR := $(OBJ_DIR_NAME_DEBUG) endif +ifeq ($(RELEASE),1) + OBJ_DIR := $(OBJ_DIR_NAME_RELEASE) +endif ELF := $(ROM:.gba=.elf) MAP := $(ROM:.gba=.map) SYM := $(ROM:.gba=.sym) @@ -120,6 +136,12 @@ else O_LEVEL ?= 2 endif CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) -std=gnu17 +ifeq ($(RELEASE),1) + override CPPFLAGS += -DRELEASE + ifeq ($(USE_LTO_ON_RELEASE),1) + LTO := 1 + endif +endif ARMCC := $(PREFIX)gcc PATH_ARMCC := PATH="$(PATH)" $(ARMCC) CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet @@ -212,8 +234,8 @@ MAKEFLAGS += --no-print-directory # Delete files that weren't built properly .DELETE_ON_ERROR: -RULES_NO_SCAN += libagbsyscall clean clean-assets tidy tidymodern tidycheck generated clean-generated -.PHONY: all rom agbcc modern compare check debug +RULES_NO_SCAN += libagbsyscall clean clean-assets tidy tidymodern tidycheck tidyrelease generated clean-generated +.PHONY: all rom agbcc modern compare check debug release .PHONY: $(RULES_NO_SCAN) infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) @@ -284,6 +306,7 @@ $(shell mkdir -p $(SUBDIRS)) modern: all compare: all debug: all +release: all # Uncomment the next line, and then comment the 4 lines after it to reenable agbcc. #agbcc: all agbcc: @@ -332,7 +355,7 @@ clean-assets: find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.smol' -o -iname '*.fastSmol' -o -iname '*.smolTM' -o -iname '*.rl' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} + -tidy: tidymodern tidycheck tidydebug +tidy: tidymodern tidycheck tidydebug tidyrelease tidymodern: rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME) @@ -345,6 +368,14 @@ tidycheck: tidydebug: rm -rf $(DEBUG_OBJ_DIR_NAME) +tidyrelease: +ifeq ($(RELEASE),1) + rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME) +else # Manually remove the release files on clean/tidy + rm -f $(FILE_NAME)-release.gba $(FILE_NAME)-release.elf $(FILE_NAME)-release.map +endif + rm -rf $(OBJ_DIR_NAME_RELEASE) + # Other rules include graphics_file_rules.mk include map_data_rules.mk diff --git a/config.mk b/config.mk new file mode 100644 index 0000000000..7360c158ef --- /dev/null +++ b/config.mk @@ -0,0 +1,2 @@ +# Enable LTO when making a release build. Disable by setting to 0. +USE_LTO_ON_RELEASE ?= 1 diff --git a/include/config/debug.h b/include/config/debug.h index 2446b9360c..7e28d33504 100644 --- a/include/config/debug.h +++ b/include/config/debug.h @@ -2,16 +2,16 @@ #define GUARD_CONFIG_DEBUG_H // Overworld Debug -#define DEBUG_OVERWORLD_MENU TRUE // Enables an overworld debug menu to change flags, variables, giving pokemon and more, accessed by holding R and pressing START while in the overworld by default. +#define DEBUG_OVERWORLD_MENU DISABLED_ON_RELEASE // Enables an overworld debug menu to change flags, variables, giving pokemon and more, accessed by holding R and pressing START while in the overworld by default. #define DEBUG_OVERWORLD_HELD_KEYS (R_BUTTON) // The keys required to be held to open the debug menu. #define DEBUG_OVERWORLD_TRIGGER_EVENT pressedStartButton // The event that opens the menu when holding the key(s) defined in DEBUG_OVERWORLD_HELD_KEYS. #define DEBUG_OVERWORLD_IN_MENU FALSE // Replaces the overworld debug menu button combination with a start menu entry (above Pokédex). // Battle Debug Menu -#define DEBUG_BATTLE_MENU TRUE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button. +#define DEBUG_BATTLE_MENU DISABLED_ON_RELEASE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button. #define DEBUG_AI_DELAY_TIMER FALSE // If set to TRUE, displays the number of frames it takes for the AI to choose a move. Replaces the "What will PKMN do" text. Useful for devs or anyone who modifies the AI code and wants to see if it doesn't take too long to run. // Pokémon Debug -#define DEBUG_POKEMON_SPRITE_VISUALIZER TRUE // Enables a debug menu for Pokémon sprites and icons, accessed by pressing Select in the summary screen. +#define DEBUG_POKEMON_SPRITE_VISUALIZER DISABLED_ON_RELEASE // Enables a debug menu for Pokémon sprites and icons, accessed by pressing Select in the summary screen. #endif // GUARD_CONFIG_DEBUG_H diff --git a/include/config/general.h b/include/config/general.h index db01fd22f9..c9958c668e 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -6,11 +6,16 @@ // still has them in the ROM. This is because the developers forgot // to define NDEBUG before release, however this has been changed as // Ruby's actual debug build does not use the AGBPrint features. +// +// Use `make release` to automatically enable NDEBUG. +#ifdef RELEASE #define NDEBUG +#endif -// To enable printf debugging, comment out "#define NDEBUG". This allows +// printf debugging is now enabled by default. This allows // the various AGBPrint functions to be used. (See include/gba/isagbprint.h). // See below for enabling different pretty printing versions. +// To disable printf debugging, build a release build using `make release`. #ifndef NDEBUG diff --git a/include/constants/global.h b/include/constants/global.h index b2d892014c..a783475f2e 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -1,6 +1,21 @@ #ifndef GUARD_CONSTANTS_GLOBAL_H #define GUARD_CONSTANTS_GLOBAL_H +// You can use the ENABLED_ON_RELEASE and DISABLED_ON_RELEASE macros to +// control whether a feature is enabled or disabled when making a release build. +// +// For example, the overworld debug menu is enabled by default, but when using +// `make release`, it will be automatically disabled. +// +// #define DEBUG_OVERWORLD_MENU DISABLED_ON_RELEASE +#ifdef RELEASE +#define ENABLED_ON_RELEASE TRUE +#define DISABLED_ON_RELEASE FALSE +#else +#define ENABLED_ON_RELEASE FALSE +#define DISABLED_ON_RELEASE TRUE +#endif + #include "config/general.h" #include "config/battle.h" #include "config/debug.h" From d2acc2d7d6648afa40bf64ca2839a165d7756b48 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 11 Aug 2025 13:33:56 -0400 Subject: [PATCH 004/183] Changed instances of "But it failed" to "It doesn't affect X" --- data/battle_scripts_1.s | 2 +- test/battle/ability/immunity.c | 2 +- test/battle/ability/limber.c | 2 +- test/battle/ability/pastel_veil.c | 6 +++--- test/battle/ability/water_bubble.c | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index bde00b4cda..a1ff092dba 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3114,7 +3114,7 @@ BattleScript_AlreadyPoisoned:: BattleScript_ImmunityProtected:: call BattleScript_AbilityPopUp - goto BattleScript_ButItFailed + goto BattleScript_DoesntAffectTargetAtkString BattleScript_EffectAuroraVeil:: attackcanceler diff --git a/test/battle/ability/immunity.c b/test/battle/ability/immunity.c index 6f630002f9..f1efc66004 100644 --- a/test/battle/ability/immunity.c +++ b/test/battle/ability/immunity.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison") } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponent, ABILITY_IMMUNITY); - MESSAGE("But it failed!"); + MESSAGE("It doesn't affect the opposing Snorlax…"); NOT STATUS_ICON(opponent, poison: TRUE); } } diff --git a/test/battle/ability/limber.c b/test/battle/ability/limber.c index 0ab3c60174..fc4e398c1f 100644 --- a/test/battle/ability/limber.c +++ b/test/battle/ability/limber.c @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Limber prevents paralysis from Thunder Wave") } WHEN { TURN { MOVE(opponent, MOVE_THUNDER_WAVE); } } SCENE { - MESSAGE("But it failed!"); + MESSAGE("It doesn't affect Persian…"); NONE_OF { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, player); STATUS_ICON(player, paralysis: TRUE); diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index cbaa3445ae..11bf32bb9a 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison") } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponent, ABILITY_PASTEL_VEIL); - MESSAGE("But it failed!"); + MESSAGE("It doesn't affect the opposing Ponyta…"); NOT STATUS_ICON(opponent, badPoison: TRUE); } } @@ -97,7 +97,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner - right tar } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponentLeft, ABILITY_PASTEL_VEIL); - MESSAGE("But it failed!"); + MESSAGE("It doesn't affect the opposing Wynaut…"); NOT STATUS_ICON(opponentRight, badPoison: TRUE); } } @@ -114,7 +114,7 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Toxic bad poison on partner - left targ } SCENE { MESSAGE("Wobbuffet used Toxic!"); ABILITY_POPUP(opponentRight, ABILITY_PASTEL_VEIL); - MESSAGE("But it failed!"); + MESSAGE("It doesn't affect the opposing Wynaut…"); NOT STATUS_ICON(opponentLeft, badPoison: TRUE); } } diff --git a/test/battle/ability/water_bubble.c b/test/battle/ability/water_bubble.c index a495c2c686..1d1d3956d4 100644 --- a/test/battle/ability/water_bubble.c +++ b/test/battle/ability/water_bubble.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Water Bubble prevents burn from Will-o-Wisp") TURN { MOVE(opponent, MOVE_WILL_O_WISP); } } SCENE { ABILITY_POPUP(player, ABILITY_WATER_BUBBLE); - MESSAGE("But it failed!"); + MESSAGE("It doesn't affect Dewpider…"); NONE_OF { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, player); STATUS_ICON(player, burn: TRUE); From b501fe7354bcd957396465c621ae7af5959ac5b0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 11 Aug 2025 13:41:32 -0400 Subject: [PATCH 005/183] Removed B_ABILITY_POP_UP --- data/battle_scripts_1.s | 20 -------------------- include/config/battle.h | 1 - src/battle_interface.c | 3 --- test/test_runner_battle.c | 2 -- 4 files changed, 26 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a1ff092dba..9c884da0f8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -206,10 +206,8 @@ BattleScript_EffectDoodle:: BattleScript_EffectDoodle_CopyAbility: trycopyability BS_ATTACKER, BattleScript_MoveEnd BattleScript_EffectDoodle_AfterCopy: -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_ATTACKER printstring STRINGID_PKMNCOPIEDFOE waitmessage B_WAIT_TIME_LONG @@ -2223,10 +2221,8 @@ BattleScript_EffectSimpleBeam:: setsimplebeam BattleScript_ButItFailed attackanimation waitanimation -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerTarget call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_TARGET printstring STRINGID_PKMNACQUIREDSIMPLE waitmessage B_WAIT_TIME_LONG @@ -2325,10 +2321,8 @@ BattleScript_EffectWorrySeed:: tryworryseed BattleScript_ButItFailed attackanimation waitanimation -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerTarget call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_TARGET printstring STRINGID_PKMNACQUIREDABILITY waitmessage B_WAIT_TIME_LONG @@ -4655,10 +4649,8 @@ BattleScript_EffectRolePlay:: trycopyability BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_ATTACKER printstring STRINGID_PKMNCOPIEDFOE waitmessage B_WAIT_TIME_LONG @@ -4790,13 +4782,11 @@ BattleScript_EffectSkillSwap:: attackanimation waitanimation jumpiftargetally BattleScript_EffectSkillSwap_AfterAbilityPopUp -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUpOverwriteThenNormal copybyte gBattlerAbility, gBattlerTarget copyhword sABILITY_OVERWRITE, gLastUsedAbility call BattleScript_AbilityPopUpOverwriteThenNormal -.endif BattleScript_EffectSkillSwap_AfterAbilityPopUp: recordability BS_ATTACKER recordability BS_TARGET @@ -7084,10 +7074,8 @@ BattleScript_AbilityPopUpTarget:: copybyte gBattlerAbility, gBattlerTarget BattleScript_AbilityPopUp:: tryactivateabilityshield BS_ABILITY_BATTLER - .if B_ABILITY_POP_UP == TRUE showabilitypopup pause B_WAIT_TIME_SHORT - .endif recordability BS_ABILITY_BATTLER sethword sABILITY_OVERWRITE, 0 return @@ -7138,11 +7126,9 @@ BattleScript_MoodyEnd: end3 BattleScript_EmergencyExit:: - .if B_ABILITY_POP_UP == TRUE pause 5 call BattleScript_AbilityPopUpScripting pause B_WAIT_TIME_LONG - .endif playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN waitanimation openpartyscreen BS_SCRIPTING, BattleScript_EmergencyExitRet @@ -7161,11 +7147,9 @@ BattleScript_EmergencyExitRet: return BattleScript_EmergencyExitWild:: - .if B_ABILITY_POP_UP == TRUE pause 5 call BattleScript_AbilityPopUpScripting pause B_WAIT_TIME_LONG - .endif playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN waitanimation setteleportoutcome BS_SCRIPTING @@ -7895,13 +7879,11 @@ BattleScript_CursedBodyActivates:: return BattleScript_MummyActivates:: -.if B_ABILITY_POP_UP == TRUE setbyte sFIXED_ABILITY_POPUP, TRUE call BattleScript_AbilityPopUpTarget copybyte gBattlerAbility, gBattlerAttacker copyhword sABILITY_OVERWRITE, gLastUsedAbility call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_TARGET recordability BS_ATTACKER printstring STRINGID_ATTACKERACQUIREDABILITY @@ -7911,14 +7893,12 @@ BattleScript_MummyActivates:: BattleScript_WanderingSpiritActivates:: saveattacker savetarget -.if B_ABILITY_POP_UP == TRUE copybyte gBattlerAbility, gBattlerTarget sethword sABILITY_OVERWRITE, ABILITY_WANDERING_SPIRIT call BattleScript_AbilityPopUpOverwriteThenNormal copybyte gBattlerAbility, gBattlerAttacker copyhword sABILITY_OVERWRITE, gLastUsedAbility call BattleScript_AbilityPopUpOverwriteThenNormal -.endif recordability BS_TARGET recordability BS_ATTACKER printstring STRINGID_SWAPPEDABILITIES diff --git a/include/config/battle.h b/include/config/battle.h index 3cfd319304..eccc88b11d 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -268,7 +268,6 @@ #define B_NEW_TERRAIN_BACKGROUNDS FALSE // If set to TRUE, uses new terrain backgrounds for Electric, Misty, Grassy and Psychic Terrain. // Interface settings -#define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle. #define B_FAST_INTRO_PKMN_TEXT TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end. #define B_FAST_INTRO_NO_SLIDE FALSE // If set to TRUE, the slide animation that happens at the beginning of the battle is skipped. #define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster. diff --git a/src/battle_interface.c b/src/battle_interface.c index 2aee6460cb..123f195969 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2638,9 +2638,6 @@ void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle) struct SpriteTemplate template; const s16 (*coords)[2]; - if (!B_ABILITY_POP_UP) - return; - if (gBattleScripting.abilityPopupOverwrite) ability = gBattleScripting.abilityPopupOverwrite; diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index c009219e26..e13a31bd9f 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2548,7 +2548,6 @@ void CloseQueueGroup(u32 sourceLine) void QueueAbility(u32 sourceLine, struct BattlePokemon *battler, struct AbilityEventContext ctx) { -#if B_ABILITY_POP_UP s32 battlerId = battler - gBattleMons; INVALID_IF(!STATE->runScene, "ABILITY_POPUP outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) @@ -2563,7 +2562,6 @@ void QueueAbility(u32 sourceLine, struct BattlePokemon *battler, struct AbilityE .ability = ctx.ability, }}, }; -#endif } void QueueAnimation(u32 sourceLine, u32 type, u32 id, struct AnimationEventContext ctx) From 2ab1bc87e0d019a7ffd2de6f2afcce68d289ab94 Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 28 Aug 2025 16:46:58 +0200 Subject: [PATCH 006/183] Start of 1.14 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index e4468a82b4..2858684d20 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -3,8 +3,8 @@ // Last version: 1.13.0 #define EXPANSION_VERSION_MAJOR 1 -#define EXPANSION_VERSION_MINOR 13 -#define EXPANSION_VERSION_PATCH 1 +#define EXPANSION_VERSION_MINOR 14 +#define EXPANSION_VERSION_PATCH 0 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. From a2e1835993fd320e164e9f2cbf69d99d61f0b8a4 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Thu, 28 Aug 2025 18:07:08 +0100 Subject: [PATCH 007/183] Separates FRB and FRZ animations (#7611) --- data/battle_anim_scripts.s | 11 +++++++++++ include/battle_anim_scripts.h | 1 + include/constants/battle_anim.h | 3 ++- src/battle_anim.c | 1 + src/battle_gfx_sfx_util.c | 4 +++- test/battle/hold_effect/cure_status.c | 2 +- test/battle/move_effect_secondary/freeze.c | 6 +++--- test/battle/move_effect_secondary/tri_attack.c | 4 ++-- test/battle/move_effects_combined/flinch_status.c | 2 +- test/battle/status1/frostbite.c | 6 +++--- 10 files changed, 28 insertions(+), 12 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index a741c372ea..1d05258dcf 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -31084,6 +31084,17 @@ gBattleAnimStatus_Nightmare:: clearmonbg ANIM_DEF_PARTNER end +gBattleAnimStatus_Frostbite:: + playsewithpan SE_M_ICY_WIND, 0 + loadspritegfx ANIM_TAG_ICE_CRYSTALS + monbg ANIM_DEF_PARTNER + splitbgprio ANIM_TARGET + call IceCrystalEffectShort + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + gBattleAnimGeneral_StatsChange:: createvisualtask AnimTask_StatsChange, 5 waitforvisualfinish diff --git a/include/battle_anim_scripts.h b/include/battle_anim_scripts.h index 0bffbda8ea..193696375d 100644 --- a/include/battle_anim_scripts.h +++ b/include/battle_anim_scripts.h @@ -948,6 +948,7 @@ extern const u8 gBattleAnimStatus_Paralysis[]; extern const u8 gBattleAnimStatus_Freeze[]; extern const u8 gBattleAnimStatus_Curse[]; extern const u8 gBattleAnimStatus_Nightmare[]; +extern const u8 gBattleAnimStatus_Frostbite[]; // general animations extern const u8 gBattleAnimGeneral_StatsChange[]; diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 3d514b1936..38965e0342 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -616,8 +616,9 @@ #define B_ANIM_STATUS_FRZ 6 #define B_ANIM_STATUS_CURSED 7 #define B_ANIM_STATUS_NIGHTMARE 8 +#define B_ANIM_STATUS_FRB 9 -#define NUM_B_ANIMS_STATUS 9 +#define NUM_B_ANIMS_STATUS 10 // Tasks with return values often assign them to gBattleAnimArgs[7]. #define ARG_RET_ID 7 diff --git a/src/battle_anim.c b/src/battle_anim.c index 76e37b7eea..100d2d376d 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -195,6 +195,7 @@ static const u8* const sBattleAnims_StatusConditions[NUM_B_ANIMS_STATUS] = [B_ANIM_STATUS_FRZ] = gBattleAnimStatus_Freeze, [B_ANIM_STATUS_CURSED] = gBattleAnimStatus_Curse, [B_ANIM_STATUS_NIGHTMARE] = gBattleAnimStatus_Nightmare, + [B_ANIM_STATUS_FRB] = gBattleAnimStatus_Frostbite, }; static const u8* const sBattleAnims_General[NUM_B_ANIMS_GENERAL] = diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index e7bf06327d..bddf1b6d19 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -464,8 +464,10 @@ void InitAndLaunchChosenStatusAnimation(u32 battler, bool32 isVolatile, u32 stat gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 1; if (!isVolatile) { - if (status == STATUS1_FREEZE || status == STATUS1_FROSTBITE) + if (status == STATUS1_FREEZE) LaunchStatusAnimation(battler, B_ANIM_STATUS_FRZ); + else if (status == STATUS1_FROSTBITE) + LaunchStatusAnimation(battler, B_ANIM_STATUS_FRB); else if (status == STATUS1_POISON || status & STATUS1_TOXIC_POISON) LaunchStatusAnimation(battler, B_ANIM_STATUS_PSN); else if (status == STATUS1_BURN) diff --git a/test/battle/hold_effect/cure_status.c b/test/battle/hold_effect/cure_status.c index 0fa0f7ba07..dabf44e085 100644 --- a/test/battle/hold_effect/cure_status.c +++ b/test/battle/hold_effect/cure_status.c @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Aspear and Lum Berries cure freeze or frostbite") TURN { MOVE(player, MOVE_ICE_PUNCH); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_ICE_PUNCH, player); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, FALSE); diff --git a/test/battle/move_effect_secondary/freeze.c b/test/battle/move_effect_secondary/freeze.c index 01a4b31c06..352845766d 100644 --- a/test/battle/move_effect_secondary/freeze.c +++ b/test/battle/move_effect_secondary/freeze.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Powder Snow inflicts freeze") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER_SNOW, player); HP_BAR(opponent); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } } @@ -85,11 +85,11 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") ANIMATION(ANIM_TYPE_MOVE, MOVE_FREEZING_GLARE, player); HP_BAR(opponent); #if B_STATUS_TYPE_IMMUNITY > GEN_1 - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); #else NONE_OF { - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } #endif diff --git a/test/battle/move_effect_secondary/tri_attack.c b/test/battle/move_effect_secondary/tri_attack.c index ab33561cf0..bba72b7677 100644 --- a/test/battle/move_effect_secondary/tri_attack.c +++ b/test/battle/move_effect_secondary/tri_attack.c @@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Tri Attack can inflict paralysis, burn or freeze") u8 statusAnim; PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_BRN; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_FRZ; } + PARAMETRIZE { statusAnim = (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ); } PASSES_RANDOMLY(1, 3, RNG_TRI_ATTACK); GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Tri Attack can inflict paralysis, burn or freeze") ANIMATION(ANIM_TYPE_STATUS, statusAnim, opponent); if (statusAnim == B_ANIM_STATUS_BRN) { STATUS_ICON(opponent, burn: TRUE); - } else if (statusAnim == B_ANIM_STATUS_FRZ) { + } else if (statusAnim == (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ)) { FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } else if (statusAnim == B_ANIM_STATUS_PRZ) { STATUS_ICON(opponent, paralysis: TRUE); diff --git a/test/battle/move_effects_combined/flinch_status.c b/test/battle/move_effects_combined/flinch_status.c index 75c9461880..0d37170726 100644 --- a/test/battle/move_effects_combined/flinch_status.c +++ b/test/battle/move_effects_combined/flinch_status.c @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Thunder, Ice and Fire Fang inflict status 10% of the time") ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); STATUS_ICON(opponent, paralysis: TRUE); } if (move == MOVE_ICE_FANG) { - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, (B_USE_FROSTBITE ? B_ANIM_STATUS_FRB : B_ANIM_STATUS_FRZ), opponent); FREEZE_OR_FROSTBURN_STATUS(opponent, TRUE); } if (move == MOVE_FIRE_FANG) { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponent); diff --git a/test/battle/status1/frostbite.c b/test/battle/status1/frostbite.c index 35503b00a3..e221a0eae3 100644 --- a/test/battle/status1/frostbite.c +++ b/test/battle/status1/frostbite.c @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Frostbite deals 1/16th (Gen7+) or 1/8th damage to affected P TURN {} } SCENE { MESSAGE("The opposing Wobbuffet was hurt by its frostbite!"); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRB, opponent); HP_BAR(opponent, captureDamage: &frostbiteDamage); } THEN { EXPECT_EQ(frostbiteDamage, opponent->maxHP / ((B_BURN_DAMAGE >= GEN_7) ? 16 : 8)); } } @@ -86,11 +86,11 @@ SINGLE_BATTLE_TEST("Frostbite is healed when the user uses a thawing move") HP_BAR(opponent); if (move == MOVE_EMBER) { MESSAGE("Wobbuffet was hurt by its frostbite!"); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRB, player); } else { NONE_OF { MESSAGE("Wobbuffet was hurt by its frostbite!"); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRZ, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRB, player); } } } From f07112bda6d62a13d3f17087e5c7e662d4231ea9 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 28 Aug 2025 20:24:27 +0100 Subject: [PATCH 008/183] Text rendering optimizations (#7497) --- include/window.h | 2 +- src/international_string_util.c | 2 +- src/text.c | 51 +++++++++++++++++++++------------ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/include/window.h b/include/window.h index 2dd67b123f..fc35f724d9 100644 --- a/include/window.h +++ b/include/window.h @@ -45,7 +45,7 @@ struct WindowTemplate struct Window { struct WindowTemplate window; - u8 *tileData; + ALIGNED(4) u8 *tileData; }; bool32 InitWindows(const struct WindowTemplate *templates); diff --git a/src/international_string_util.c b/src/international_string_util.c index feba03c97f..b5a904c773 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -220,7 +220,7 @@ void FillWindowTilesByRow(int windowId, int columnStart, int rowStart, int numFi fillSize = numFillTiles * TILE_SIZE_4BPP; windowRowSize = window->window.width * TILE_SIZE_4BPP; - windowTileData = window->tileData + (rowStart * windowRowSize) + (columnStart * TILE_SIZE_4BPP); + windowTileData = (u8 *)window->tileData + (rowStart * windowRowSize) + (columnStart * TILE_SIZE_4BPP); if (numRows > 0) { for (i = numRows; i != 0; i--) diff --git a/src/text.c b/src/text.c index 29ffc5ea3a..8166b35302 100644 --- a/src/text.c +++ b/src/text.c @@ -427,6 +427,13 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor) u16 *current = sFontHalfRowLookupTable; + if (fgColor == sLastTextFgColor + && bgColor == sLastTextBgColor + && shadowColor == sLastTextShadowColor) + { + return; + } + sLastTextBgColor = bgColor; sLastTextFgColor = fgColor; sLastTextShadowColor = shadowColor; @@ -629,27 +636,35 @@ static u8 UNUSED GetLastTextColor(u8 colorType) } } -inline static void GLYPH_COPY(u8 *windowTiles, u32 widthOffset, u32 j, u32 i, u32 *glyphPixels, s32 width, s32 height) +inline static void GLYPH_COPY(u8 *windowTiles, u32 widthOffset, u32 x0, u32 y0, u32 *glyphPixels, s32 width, s32 height) { - u32 xAdd, yAdd, pixelData, bits, toOrr, dummyX; - u8 *dst; + if (width <= 0) + return; - xAdd = j + width; - yAdd = i + height; - dummyX = j; - for (; i < yAdd; i++) + u32 widthMask = (1 << (width * 4)) - 1; + + u32 shift0 = (x0 % 8) * 4, shift8 = 32 - shift0; + + u32 *alignedWindowTilesX = (u32 *)(windowTiles + ((x0 / 8) * TILE_SIZE_4BPP)); + + u32 y1 = y0 + height; + for (u32 y = y0; y < y1; y++) { - pixelData = *glyphPixels++; - for (j = dummyX; j < xAdd; j++) - { - if ((toOrr = pixelData & 0xF)) - { - dst = windowTiles + ((j / 8) * 32) + ((j % 8) / 2) + ((i / 8) * widthOffset) + ((i % 8) * 4); - bits = ((j & 1) * 4); - *dst = (toOrr << bits) | (*dst & (0xF0 >> bits)); - } - pixelData >>= 4; - } + u32 pixels = *glyphPixels++ & widthMask; + + u32 mask = pixels; + mask = mask | (mask >> 2); + mask = mask | (mask >> 1); + mask = mask & 0x11111111; + mask = mask * 0xF; + + u32 pixels0 = pixels << shift0, pixels8 = pixels >> shift8; + u32 mask0 = mask << shift0, mask8 = mask >> shift8; + + u32 *alignedWindowTiles = (u32 *)((u8 *)alignedWindowTilesX + ((y / 8) * widthOffset) + ((y % 8) * 4)); + + alignedWindowTiles[0] = (alignedWindowTiles[0] & ~mask0) | pixels0; + alignedWindowTiles[8] = (alignedWindowTiles[8] & ~mask8) | pixels8; } } From 9bfae7fa935a8bd18ecc626cac802fbf0e0734af Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 29 Aug 2025 04:08:42 -0400 Subject: [PATCH 009/183] AI uses Magnetic Flux. (#7642) --- src/battle_ai_main.c | 23 +++++++++++++++++------ test/battle/ai/can_use_all_moves.c | 2 +- test/battle/move_effect/magnetic_flux.c | 13 +++++++++++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index ebbabf93c8..2532424d24 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1557,12 +1557,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPDEF)) ADJUST_SCORE(-8); } - else if (!hasPartner) - { - ADJUST_SCORE(-10); // our stats wont rise from this move - } - - if (hasPartner) + else if (hasPartner) { if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS) { @@ -1576,6 +1571,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // nor our or our partner's ability is plus/minus } } + else + { + ADJUST_SCORE(-10); // our stats wont rise from this move + } break; // stat lowering effects case EFFECT_ATTACK_DOWN: @@ -4178,6 +4177,18 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(-2); // Should be either removed or turned into increasing score case EFFECT_ACUPRESSURE: break; + case EFFECT_MAGNETIC_FLUX: + if (aiData->abilities[battlerAtk] == ABILITY_PLUS || aiData->abilities[battlerAtk] == ABILITY_MINUS) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); + } + if (hasPartner && (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS)) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_DEF)); + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPDEF)); + } + break; case EFFECT_ATTACK_ACCURACY_UP: // hone claws ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ACC)); diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c index 3bf33a98c1..4d2ec08630 100644 --- a/test/battle/ai/can_use_all_moves.c +++ b/test/battle/ai/can_use_all_moves.c @@ -522,7 +522,6 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") switch (effect) { //TODO: AI HANDLING - case EFFECT_MAGNETIC_FLUX: case EFFECT_GEAR_UP: case EFFECT_FAIL_IF_NOT_ARG_TYPE: case EFFECT_STUFF_CHEEKS: @@ -541,6 +540,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") // tests exist elsewhere case EFFECT_ELECTRIC_TERRAIN: case EFFECT_PSYCHIC_TERRAIN: + case EFFECT_MAGNETIC_FLUX: case EFFECT_AURORA_VEIL: // Skipped on purpose. diff --git a/test/battle/move_effect/magnetic_flux.c b/test/battle/move_effect/magnetic_flux.c index f574db0089..6a23d2082f 100644 --- a/test/battle/move_effect/magnetic_flux.c +++ b/test/battle/move_effect/magnetic_flux.c @@ -2,3 +2,16 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Magnetic Flux (Move Effect) test titles") + +AI_DOUBLE_BATTLE_TEST("AI uses Magnetic Flux") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_KLINK) { Ability(ABILITY_PLUS); Moves(MOVE_MAGNETIC_FLUX, MOVE_POUND); } + OPPONENT(SPECIES_KLINK) { Ability(ABILITY_PLUS); Moves(MOVE_MAGNETIC_FLUX, MOVE_POUND); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_MAGNETIC_FLUX); } + } +} From 16fa6c8f711592ff7f8395ef65223492078fdc0c Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 29 Aug 2025 04:10:59 -0400 Subject: [PATCH 010/183] AI uses Flower Shield. (#7640) --- src/battle_ai_main.c | 24 ++++++++++++++++++++++++ test/battle/ai/can_use_all_moves.c | 2 +- test/battle/move_effect/flower_shield.c | 16 ++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2532424d24..92a39a54a6 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4224,6 +4224,30 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(AWFUL_EFFECT); } break; + case EFFECT_FLOWER_SHIELD: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS)) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); + } + if (hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS)) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_DEF)); + } + if (IS_BATTLER_OF_TYPE(FOE(battlerAtk), TYPE_GRASS)) + { + if (aiData->abilities[FOE(battlerAtk)] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + if (IS_BATTLER_OF_TYPE(BATTLE_PARTNER(FOE(battlerAtk)), TYPE_GRASS)) + { + if (aiData->abilities[BATTLE_PARTNER(FOE(battlerAtk))] == ABILITY_CONTRARY) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(AWFUL_EFFECT); + } + break; case EFFECT_HAZE: if (AnyStatIsRaised(BATTLE_PARTNER(battlerAtk)) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c index 4d2ec08630..83ee14affa 100644 --- a/test/battle/ai/can_use_all_moves.c +++ b/test/battle/ai/can_use_all_moves.c @@ -456,7 +456,6 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600") case EFFECT_ION_DELUGE: case EFFECT_AROMATIC_MIST: case EFFECT_POWDER: - case EFFECT_FLOWER_SHIELD: case EFFECT_ELECTRIFY: //TODO: AI TESTS @@ -467,6 +466,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600") case EFFECT_FAIRY_LOCK: // tests exist elsewhere + case EFFECT_FLOWER_SHIELD: case EFFECT_ROTOTILLER: case EFFECT_GRASSY_TERRAIN: case EFFECT_MISTY_TERRAIN: diff --git a/test/battle/move_effect/flower_shield.c b/test/battle/move_effect/flower_shield.c index 9eac08eb4d..8e9e8e334c 100644 --- a/test/battle/move_effect/flower_shield.c +++ b/test/battle/move_effect/flower_shield.c @@ -37,3 +37,19 @@ DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all Grass-type Pokémon" } TO_DO_BATTLE_TEST("Flower Shield fails if there's no Grass-type Pokémon on the field") + +AI_DOUBLE_BATTLE_TEST("AI uses Flower Shield") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TANGELA) { Moves(MOVE_FLOWER_SHIELD, MOVE_POUND); } + OPPONENT(SPECIES_TANGELA); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_FLOWER_SHIELD); } + } +} From 3ff23ef212b2bdf8a4e1c080d8ad37ed93b198ca Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 29 Aug 2025 14:49:28 -0400 Subject: [PATCH 011/183] AI uses Life Dew. (#7643) --- src/battle_ai_main.c | 20 ++++++++++++++++++++ test/battle/ai/can_use_all_moves.c | 2 +- test/battle/move_effect/life_dew.c | 27 +++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 92a39a54a6..065951bb2a 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2165,6 +2165,20 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if ((AI_GetWeather() & (B_WEATHER_LOW_LIGHT))) ADJUST_SCORE(-3); break; + case EFFECT_LIFE_DEW: + if (AI_BattlerAtMaxHp(battlerAtk)) + { + if (hasPartner) + { + if (AI_BattlerAtMaxHp(BATTLE_PARTNER(battlerAtk))) + ADJUST_SCORE(-10); + } + else + { + ADJUST_SCORE(-10); + } + } + break; case EFFECT_PURIFY: if (!(gBattleMons[battlerDef].status1 & STATUS1_ANY)) ADJUST_SCORE(-10); @@ -4310,6 +4324,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (ShouldRecover(battlerAtk, battlerDef, move, 50)) ADJUST_SCORE(GOOD_EFFECT); break; + case EFFECT_LIFE_DEW: + if (ShouldRecover(battlerAtk, battlerDef, move, 25)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldRecover(BATTLE_PARTNER(battlerAtk), battlerDef, move, 25)) + ADJUST_SCORE(GOOD_EFFECT); + break; case EFFECT_LIGHT_SCREEN: case EFFECT_REFLECT: case EFFECT_AURORA_VEIL: diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c index 83ee14affa..4ebec9394e 100644 --- a/test/battle/ai/can_use_all_moves.c +++ b/test/battle/ai/can_use_all_moves.c @@ -595,7 +595,6 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800") { //TODO: AI HANDLING case EFFECT_CLANGOROUS_SOUL: - case EFFECT_LIFE_DEW: case EFFECT_POLTERGEIST: case EFFECT_COACHING: case EFFECT_REVIVAL_BLESSING: @@ -611,6 +610,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800") // tests exist elsewhere case EFFECT_COURT_CHANGE: case EFFECT_DOODLE: + case EFFECT_LIFE_DEW: // Skipped on purpose. case EFFECT_PROTECT: diff --git a/test/battle/move_effect/life_dew.c b/test/battle/move_effect/life_dew.c index 493c4c73e7..1969f3454c 100644 --- a/test/battle/move_effect/life_dew.c +++ b/test/battle/move_effect/life_dew.c @@ -84,3 +84,30 @@ DOUBLE_BATTLE_TEST("Life Dew only works on partner if user is at full hp") HP_BAR(playerRight); } } + +AI_SINGLE_BATTLE_TEST("AI uses Life Dew if it outheals your damage and outspeeds (singles)") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Moves(MOVE_SCALD, MOVE_LIFE_DEW); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_LIFE_DEW); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Life Dew if it outheals your damage and outspeeds (doubles)") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_TACKLE); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Moves(MOVE_SCALD, MOVE_LIFE_DEW); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Moves(MOVE_SCALD); HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE); MOVE(playerRight, MOVE_TACKLE); EXPECT_MOVE(opponentLeft, MOVE_LIFE_DEW); } + } +} + From e1381dd7b5118069422080f4ac69365156d68ca9 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 29 Aug 2025 14:49:50 -0400 Subject: [PATCH 012/183] AI uses Gear Up. (#7641) --- src/battle_ai_main.c | 23 +++++++++++++++++------ test/battle/ai/can_use_all_moves.c | 4 ++-- test/battle/move_effect/gear_up.c | 13 +++++++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 065951bb2a..8961f52b07 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1526,12 +1526,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); break; } - else if (!hasPartner) - { - ADJUST_SCORE(-10); // no partner and our stats wont rise, so don't use - } - - if (hasPartner) + else if (hasPartner) { if (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS) { @@ -1544,6 +1539,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // nor our or our partner's ability is plus/minus } } + else + { + ADJUST_SCORE(-10); // no partner and our stats wont rise, so don't use + } break; case EFFECT_ACUPRESSURE: if (DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || AreBattlersStatsMaxed(battlerDef)) @@ -4191,6 +4190,18 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(-2); // Should be either removed or turned into increasing score case EFFECT_ACUPRESSURE: break; + case EFFECT_GEAR_UP: + if (aiData->abilities[battlerAtk] == ABILITY_PLUS || aiData->abilities[battlerAtk] == ABILITY_MINUS) + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); + } + if (hasPartner && (aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_PLUS || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_MINUS)) + { + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPATK)); + } + break; case EFFECT_MAGNETIC_FLUX: if (aiData->abilities[battlerAtk] == ABILITY_PLUS || aiData->abilities[battlerAtk] == ABILITY_MINUS) { diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c index 4ebec9394e..f91658b3f7 100644 --- a/test/battle/ai/can_use_all_moves.c +++ b/test/battle/ai/can_use_all_moves.c @@ -522,7 +522,6 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") switch (effect) { //TODO: AI HANDLING - case EFFECT_GEAR_UP: case EFFECT_FAIL_IF_NOT_ARG_TYPE: case EFFECT_STUFF_CHEEKS: case EFFECT_NO_RETREAT: @@ -540,8 +539,9 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") // tests exist elsewhere case EFFECT_ELECTRIC_TERRAIN: case EFFECT_PSYCHIC_TERRAIN: - case EFFECT_MAGNETIC_FLUX: case EFFECT_AURORA_VEIL: + case EFFECT_GEAR_UP: + case EFFECT_MAGNETIC_FLUX: // Skipped on purpose. case EFFECT_PROTECT: diff --git a/test/battle/move_effect/gear_up.c b/test/battle/move_effect/gear_up.c index 03aba9a395..051205a2ba 100644 --- a/test/battle/move_effect/gear_up.c +++ b/test/battle/move_effect/gear_up.c @@ -2,3 +2,16 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Gear Up (Move Effect) test titles") + +AI_DOUBLE_BATTLE_TEST("AI uses Gear Up") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_KLINKLANG) { Ability(ABILITY_PLUS); Moves(MOVE_GEAR_UP, MOVE_WATER_GUN, MOVE_POUND); } + OPPONENT(SPECIES_KLINKLANG) { Ability(ABILITY_PLUS); Moves(MOVE_GEAR_UP, MOVE_WATER_GUN, MOVE_POUND); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_GEAR_UP); } + } +} From 70068bf314ac6bb4ab9547b04494a2e59834c30b Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sat, 30 Aug 2025 21:39:02 +0100 Subject: [PATCH 013/183] Battle debug menu now checks correct parties depending on battler party (#7652) --- src/battle_debug.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index 149cb4065c..e350638aa5 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -752,7 +752,8 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) if (gAiLogicData->shouldSwitch & (1u << data->aiBattlerId)) { - u32 switchMon = GetMonData(&gEnemyParty[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); + struct Pokemon *party = GetBattlerParty(data->aiBattlerId); + u32 switchMon = GetMonData(&party[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Switching to "), 74, 64, 0, NULL); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, gSpeciesInfo[switchMon].speciesName, 74 + 68, 64, 0, NULL); } From 4fa26b2296fa9e3f157c3b7e1e8a046c8748c10b Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 30 Aug 2025 16:40:44 -0400 Subject: [PATCH 014/183] Improved move additional effect handling; now accounts for Shield Dust. (#7650) --- src/battle_ai_main.c | 28 +++++++++++++++++++++++----- src/battle_ai_util.c | 4 ++++ test/battle/ai/ai_check_viability.c | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 8961f52b07..91e8046b7c 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -5661,7 +5661,8 @@ case EFFECT_GUARD_SPLIT: break; case MOVE_EFFECT_SPD_MINUS_1: case MOVE_EFFECT_SPD_MINUS_2: - ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); + if (CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); break; case MOVE_EFFECT_ATK_MINUS_1: case MOVE_EFFECT_DEF_MINUS_1: @@ -5669,18 +5670,35 @@ case EFFECT_GUARD_SPLIT: case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) - ADJUST_SCORE(DECENT_EFFECT); + { + u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1; + if (CanLowerStat(battlerAtk, battlerDef, aiData, statId)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId)); break; + } case MOVE_EFFECT_ATK_MINUS_2: case MOVE_EFFECT_DEF_MINUS_2: case MOVE_EFFECT_SP_ATK_MINUS_2: case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - if (aiData->abilities[battlerDef] != ABILITY_CONTRARY) - ADJUST_SCORE(DECENT_EFFECT); + { + u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2; + if (CanLowerStat(battlerAtk, battlerDef, aiData, statId)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId)); break; + } + case MOVE_EFFECT_LOWER_ATTACK_SIDE: + case MOVE_EFFECT_LOWER_DEFENSE_SIDE: + case MOVE_EFFECT_LOWER_SPEED_SIDE: + case MOVE_EFFECT_LOWER_SP_ATK_SIDE: + case MOVE_EFFECT_LOWER_SP_DEF_SIDE: + { + u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE; + if (CanLowerStat(battlerAtk, battlerDef, aiData, statId)) + ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId)); + break; + } case MOVE_EFFECT_POISON: IncreasePoisonScore(battlerAtk, battlerDef, move, &score); break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 84d247a617..c3d4b66965 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2056,6 +2056,10 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, case ABILITY_WHITE_SMOKE: case ABILITY_FULL_METAL_BODY: return FALSE; + case ABILITY_SHIELD_DUST: + if (!IsBattleMoveStatus(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) + return FALSE; + break; default: break; } diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 4dff0e08ca..6d16d4fb6e 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -391,3 +391,21 @@ AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_WIDE_GUARD); } } } + +AI_SINGLE_BATTLE_TEST("AI sees Shield Dust immunity to additional effects") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_SHIELD_DUST; } + PARAMETRIZE { ability = ABILITY_TINTED_LENS; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_VENOMOTH) { Ability(ability); Moves(MOVE_CELEBRATE, MOVE_POUND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CHILLING_WATER, MOVE_BRINE); } + } WHEN { + if (ability == ABILITY_SHIELD_DUST) + TURN { EXPECT_MOVE(opponent, MOVE_BRINE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_CHILLING_WATER); } + } +} From cdaba9076edab66247b06d6006a8c873de2b7013 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 30 Aug 2025 17:18:47 -0400 Subject: [PATCH 015/183] Correcting test AI won't use status moves if partner chose Helping Hand (#7649) --- test/battle/ai/ai_doubles.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index ff880fb2e2..444f065a94 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -69,11 +69,11 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } } WHEN { TURN { NOT_EXPECT_MOVE(opponentRight, statusMove); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); From 406e5b1def8c08d47de86b5be0148e4af5e120b9 Mon Sep 17 00:00:00 2001 From: surskitty Date: Mon, 1 Sep 2025 13:02:56 -0400 Subject: [PATCH 016/183] IncreaseStatUpScore adjustments for Simple, +3 moves, Acupressure, max move effects (#7662) --- include/battle_ai_main.h | 5 ++ src/battle_ai_main.c | 23 +++++++- src/battle_ai_util.c | 119 ++++++++++++++++++++++++--------------- 3 files changed, 101 insertions(+), 46 deletions(-) diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index b3bc57c4e9..4330f9d2bc 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -23,6 +23,11 @@ enum StatChange STAT_CHANGE_SPEED_2, STAT_CHANGE_SPATK_2, STAT_CHANGE_SPDEF_2, + STAT_CHANGE_ATK_3, + STAT_CHANGE_DEF_3, + STAT_CHANGE_SPEED_3, + STAT_CHANGE_SPATK_3, + STAT_CHANGE_SPDEF_3, STAT_CHANGE_ACC, STAT_CHANGE_EVASION }; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 91e8046b7c..8d9397fec7 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4119,13 +4119,15 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2)); break; case EFFECT_DEFENSE_UP: - case EFFECT_DEFENSE_UP_3: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; case EFFECT_STUFF_CHEEKS: case EFFECT_DEFENSE_UP_2: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF_2)); break; + case EFFECT_DEFENSE_UP_3: + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF_3)); + break; case EFFECT_SPEED_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); break; @@ -4137,9 +4139,11 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); break; case EFFECT_SPECIAL_ATTACK_UP_2: - case EFFECT_SPECIAL_ATTACK_UP_3: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_2)); break; + case EFFECT_SPECIAL_ATTACK_UP_3: + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_3)); + break; case EFFECT_SPECIAL_DEFENSE_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; @@ -4188,7 +4192,10 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_BIDE: if (aiData->hpPercents[battlerAtk] < 90) ADJUST_SCORE(-2); // Should be either removed or turned into increasing score + // treat as offense booster case EFFECT_ACUPRESSURE: + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_2)); break; case EFFECT_GEAR_UP: if (aiData->abilities[battlerAtk] == ABILITY_PLUS || aiData->abilities[battlerAtk] == ABILITY_MINUS) @@ -5688,6 +5695,18 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId)); break; } + case MOVE_EFFECT_RAISE_TEAM_ATTACK: + case MOVE_EFFECT_RAISE_TEAM_DEFENSE: + case MOVE_EFFECT_RAISE_TEAM_SPEED: + case MOVE_EFFECT_RAISE_TEAM_SP_ATK: + case MOVE_EFFECT_RAISE_TEAM_SP_DEF: + { + enum StatChange StageStatId = STAT_CHANGE_ATK + additionalEffect->moveEffect - MOVE_EFFECT_RAISE_TEAM_ATTACK; + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, StageStatId)); + if (hasPartner) + ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, StageStatId)); + break; + } case MOVE_EFFECT_LOWER_ATTACK_SIDE: case MOVE_EFFECT_LOWER_DEFENSE_SIDE: case MOVE_EFFECT_LOWER_SPEED_SIDE: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c3d4b66965..71ecb3da32 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -4480,18 +4480,23 @@ static u32 GetStatBeingChanged(enum StatChange statChange) { case STAT_CHANGE_ATK: case STAT_CHANGE_ATK_2: + case STAT_CHANGE_ATK_3: return STAT_ATK; case STAT_CHANGE_DEF: case STAT_CHANGE_DEF_2: + case STAT_CHANGE_DEF_3: return STAT_DEF; case STAT_CHANGE_SPEED: case STAT_CHANGE_SPEED_2: + case STAT_CHANGE_SPEED_3: return STAT_SPEED; case STAT_CHANGE_SPATK: case STAT_CHANGE_SPATK_2: + case STAT_CHANGE_SPATK_3: return STAT_SPATK; case STAT_CHANGE_SPDEF: case STAT_CHANGE_SPDEF_2: + case STAT_CHANGE_SPDEF_3: return STAT_SPDEF; case STAT_CHANGE_ACC: return STAT_ACC; @@ -4501,6 +4506,34 @@ static u32 GetStatBeingChanged(enum StatChange statChange) return 0; // STAT_HP, should never be getting changed } +static u32 GetStagesOfStatChange(enum StatChange statChange) +{ + switch(statChange) + { + case STAT_CHANGE_ATK: + case STAT_CHANGE_DEF: + case STAT_CHANGE_SPEED: + case STAT_CHANGE_SPATK: + case STAT_CHANGE_SPDEF: + case STAT_CHANGE_ACC: + case STAT_CHANGE_EVASION: + return 1; + case STAT_CHANGE_ATK_2: + case STAT_CHANGE_DEF_2: + case STAT_CHANGE_SPEED_2: + case STAT_CHANGE_SPATK_2: + case STAT_CHANGE_SPDEF_2: + return 2; + case STAT_CHANGE_ATK_3: + case STAT_CHANGE_DEF_3: + case STAT_CHANGE_SPEED_3: + case STAT_CHANGE_SPATK_3: + case STAT_CHANGE_SPDEF_3: + return 3; + } + return 0; // STAT_HP, should never be getting changed +} + static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statChange, bool32 considerContrary) { enum AIScore tempScore = NO_INCREASE; @@ -4510,6 +4543,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); u32 i; u32 statId = GetStatBeingChanged(statChange); + u32 stages = GetStagesOfStatChange(statChange); if (considerContrary && gAiLogicData->abilities[battlerAtk] == ABILITY_CONTRARY) return NO_INCREASE; @@ -4531,7 +4565,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return NO_INCREASE; // Don't increase stats if opposing battler has Opportunist - if (gAiLogicData->abilities[battlerDef] == ABILITY_OPPORTUNIST) + if (HasBattlerSideAbility(battlerDef, ABILITY_OPPORTUNIST, gAiLogicData)) return NO_INCREASE; // Don't increase stats if opposing battler has Encore @@ -4556,6 +4590,10 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, if (HasMoveThatChangesKOThreshold(battlerDef, noOfHitsToFaint, aiIsFaster)) return NO_INCREASE; + // Stat stages are effectively doubled under Simple. + if (gAiLogicData->abilities[battlerAtk] == ABILITY_SIMPLE) + stages *= 2; + // Predicting switch if (IsBattlerPredictedToSwitch(battlerDef)) { @@ -4574,73 +4612,62 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, tempScore += WEAK_EFFECT; } - switch (statChange) + switch (statId) { - case STAT_CHANGE_ATK: + case STAT_ATK: if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && shouldSetUp) - tempScore += DECENT_EFFECT; + { + if (stages == 1) + tempScore += DECENT_EFFECT; + else + tempScore += GOOD_EFFECT; + } break; - case STAT_CHANGE_DEF: + case STAT_DEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) - tempScore += DECENT_EFFECT; - else tempScore += WEAK_EFFECT; + if (stages == 1) + tempScore += WEAK_EFFECT; + else + tempScore += DECENT_EFFECT; } break; - case STAT_CHANGE_SPEED: + case STAT_SPEED: if ((noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS) - tempScore += DECENT_EFFECT; + { + if (stages == 1) + tempScore += DECENT_EFFECT; + else + tempScore += GOOD_EFFECT; + } break; - case STAT_CHANGE_SPATK: + case STAT_SPATK: if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && shouldSetUp) - tempScore += DECENT_EFFECT; + { + if (stages == 1) + tempScore += DECENT_EFFECT; + else + tempScore += GOOD_EFFECT; + } break; - case STAT_CHANGE_SPDEF: + case STAT_SPDEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) - tempScore += DECENT_EFFECT; - else tempScore += WEAK_EFFECT; - } - break; - case STAT_CHANGE_ATK_2: - if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && shouldSetUp) - tempScore += GOOD_EFFECT; - break; - case STAT_CHANGE_DEF_2: - if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) - { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) - tempScore += GOOD_EFFECT; + if (stages == 1) + tempScore += WEAK_EFFECT; else tempScore += DECENT_EFFECT; } break; - case STAT_CHANGE_SPEED_2: - if ((noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS) - tempScore += GOOD_EFFECT; - break; - case STAT_CHANGE_SPATK_2: - if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) && shouldSetUp) - tempScore += GOOD_EFFECT; - break; - case STAT_CHANGE_SPDEF_2: - if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) - { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) - tempScore += GOOD_EFFECT; - else - tempScore += DECENT_EFFECT; - } - break; - case STAT_CHANGE_ACC: + case STAT_ACC: if (gBattleMons[battlerAtk].statStages[statId] <= 3) // Increase only if necessary tempScore += DECENT_EFFECT; break; - case STAT_CHANGE_EVASION: + case STAT_EVASION: if (noOfHitsToFaint > 3 || noOfHitsToFaint == UNKNOWN_NO_OF_HITS) tempScore += GOOD_EFFECT; else @@ -4648,6 +4675,10 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, break; } + // if already inclined to boost, be slightly more likely to if boost levels matter + if (tempScore > 0 && HasMoveWithEffect(battlerAtk, EFFECT_STORED_POWER)) + tempScore += WEAK_EFFECT; + return tempScore; } From 927f1898bb4c33f2151d077dd3c049fcf797291a Mon Sep 17 00:00:00 2001 From: surskitty Date: Mon, 1 Sep 2025 13:43:12 -0400 Subject: [PATCH 017/183] AI handling for Coaching. (#7661) --- src/battle_ai_main.c | 14 ++++++++++++++ test/battle/ai/ai_doubles.c | 5 +++-- test/battle/move_effect/coaching.c | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 8d9397fec7..dd837faffa 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3174,6 +3174,20 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || HasMoveWithCriticalHitChance(battlerAtkPartner)) ADJUST_SCORE(GOOD_EFFECT); break; + case EFFECT_COACHING: + if (!hasPartner + || !HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)) + { + ADJUST_SCORE(WORST_EFFECT); + } + else + { + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), STAT_CHANGE_DEF)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_ATK)); + ADJUST_SCORE(IncreaseStatUpScore(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), STAT_CHANGE_DEF)); + } + break; default: break; } // our effect relative to partner diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 444f065a94..fcef1f9d0a 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -72,10 +72,11 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_EXPLOSION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } } WHEN { - TURN { NOT_EXPECT_MOVE(opponentRight, statusMove); + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); + NOT_EXPECT_MOVE(opponentRight, statusMove); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerRight); SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:opponentLeft); diff --git a/test/battle/move_effect/coaching.c b/test/battle/move_effect/coaching.c index 7245f8854b..642727de51 100644 --- a/test/battle/move_effect/coaching.c +++ b/test/battle/move_effect/coaching.c @@ -117,3 +117,23 @@ DOUBLE_BATTLE_TEST("Coaching fails if there's no ally") MESSAGE("But it failed!"); } } + +AI_DOUBLE_BATTLE_TEST("AI uses Coaching") +{ + u32 move; + PARAMETRIZE { move = MOVE_HEADBUTT; } + PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_COACHING, MOVE_POUND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move); } + } WHEN { + if (move == MOVE_HEADBUTT) + TURN { EXPECT_MOVE(opponentLeft, MOVE_COACHING); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_COACHING); } + } +} From 0a0d574998d854cba9a2a1d8becfc97ed9e1b964 Mon Sep 17 00:00:00 2001 From: surskitty Date: Mon, 1 Sep 2025 15:34:31 -0400 Subject: [PATCH 018/183] Simplifying calls to IsBattlerTrapped; treats being unable to switch as trappedness (#7671) --- src/battle_ai_main.c | 12 ++++++------ src/battle_ai_util.c | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index dd837faffa..7c0c98bf46 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2979,7 +2979,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_STATUS && (CountUsablePartyMons(battlerAtk) < 1 || gAiLogicData->mostSuitableMonId[battlerAtk] == PARTY_SIZE - || (!AI_CanBattlerEscape(battlerAtk) && IsBattlerTrapped(battlerDef, battlerAtk)))) + || IsBattlerTrapped(battlerDef, battlerAtk))) ADJUST_SCORE(-30); } @@ -4432,7 +4432,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; ADJUST_SCORE(GOOD_EFFECT); if (!HasDamagingMove(battlerDef) - || (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef)) + || IsBattlerTrapped(battlerAtk, battlerDef) || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) ADJUST_SCORE(DECENT_EFFECT); break; @@ -4542,7 +4542,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_CURSE: if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) { - if (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef)) + if (IsBattlerTrapped(battlerAtk, battlerDef)) ADJUST_SCORE(GOOD_EFFECT); else ADJUST_SCORE(WEAK_EFFECT); @@ -4640,7 +4640,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_PERISH_SONG: - if (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef)) + if (IsBattlerTrapped(battlerAtk, battlerDef)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SANDSTORM: @@ -4799,7 +4799,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; // Don't use if the attract won't have a change to activate if (gBattleMons[battlerDef].status1 & STATUS1_ANY || gBattleMons[battlerDef].volatiles.confusionTurns > 0 - || (!AI_CanBattlerEscape(battlerDef) && IsBattlerTrapped(battlerAtk, battlerDef))) + || IsBattlerTrapped(battlerAtk, battlerDef)) ADJUST_SCORE(GOOD_EFFECT); else ADJUST_SCORE(DECENT_EFFECT); @@ -6049,7 +6049,7 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor || CountUsablePartyMons(battlerAtk) == 0 || !IsBattleMoveStatus(move) || !HasMoveWithEffect(battlerAtk, EFFECT_BATON_PASS) - || (!AI_CanBattlerEscape(battlerAtk) && IsBattlerTrapped(battlerDef, battlerAtk))) + || IsBattlerTrapped(battlerAtk, battlerDef)) return score; enum BattleMoveEffects effect = GetMoveEffect(move); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 71ecb3da32..3997797b13 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -469,6 +469,9 @@ bool32 AI_CanBattlerEscape(u32 battler) bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) { + if (AI_CanBattlerEscape(battlerDef)) + return FALSE; + if (gBattleMons[battlerDef].volatiles.wrapped) return TRUE; if (gBattleMons[battlerDef].volatiles.escapePrevention) @@ -489,6 +492,9 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_STEEL)) return TRUE; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && CountUsablePartyMons(battlerDef) == 0) + return TRUE; + return FALSE; } From 2f75c6a264760946a22b385679cd3547ac0a1fd8 Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 2 Sep 2025 05:31:35 -0400 Subject: [PATCH 019/183] Score adjustments towards guaranteed stat drops. (#7670) --- src/battle_ai_main.c | 12 ++++++++++-- src/battle_ai_util.c | 16 +++++++++------- test/battle/ability/minds_eye.c | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 7c0c98bf46..e0fb048d9b 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -5685,11 +5685,20 @@ case EFFECT_GUARD_SPLIT: if (CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED)) ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED)); break; + case MOVE_EFFECT_ACC_MINUS_1: + case MOVE_EFFECT_ACC_MINUS_2: + if (CanLowerStat(battlerAtk, battlerDef, aiData, STAT_ACC)) + { + u32 scoreIncrease = IncreaseStatDownScore(battlerAtk, battlerDef, STAT_ACC); + if (scoreIncrease == WEAK_EFFECT) + scoreIncrease = DECENT_EFFECT; + ADJUST_SCORE(scoreIncrease); + } + break; case MOVE_EFFECT_ATK_MINUS_1: case MOVE_EFFECT_DEF_MINUS_1: case MOVE_EFFECT_SP_ATK_MINUS_1: case MOVE_EFFECT_SP_DEF_MINUS_1: - case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: { u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1; @@ -5701,7 +5710,6 @@ case EFFECT_GUARD_SPLIT: case MOVE_EFFECT_DEF_MINUS_2: case MOVE_EFFECT_SP_ATK_MINUS_2: case MOVE_EFFECT_SP_DEF_MINUS_2: - case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: { u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3997797b13..04eba48677 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2113,13 +2113,15 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) tempScore += DECENT_EFFECT; break; case STAT_DEF: - if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) + || HasMoveWithCategory(BATTLE_PARTNER(battlerAtk), DAMAGE_CATEGORY_PHYSICAL)) tempScore += DECENT_EFFECT; break; case STAT_SPEED: { u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - if (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) + if (AI_IsSlower(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) + || AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) tempScore += DECENT_EFFECT; break; } @@ -2128,16 +2130,16 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) tempScore += DECENT_EFFECT; break; case STAT_SPDEF: - if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)) + if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL) + || HasMoveWithCategory(BATTLE_PARTNER(battlerAtk), DAMAGE_CATEGORY_SPECIAL)) tempScore += DECENT_EFFECT; break; case STAT_ACC: - if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) - tempScore += WEAK_EFFECT; + tempScore += WEAK_EFFECT; + if (IsBattlerTrapped(battlerAtk, battlerDef)) + tempScore += DECENT_EFFECT; if (gBattleMons[battlerDef].volatiles.leechSeed) tempScore += WEAK_EFFECT; - if (gBattleMons[battlerDef].volatiles.root) - tempScore += WEAK_EFFECT; if (gBattleMons[battlerDef].volatiles.cursed) tempScore += WEAK_EFFECT; break; diff --git a/test/battle/ability/minds_eye.c b/test/battle/ability/minds_eye.c index 0300c2e4d5..3772a9df1d 100644 --- a/test/battle/ability/minds_eye.c +++ b/test/battle/ability/minds_eye.c @@ -60,7 +60,7 @@ AI_SINGLE_BATTLE_TEST("AI doesn't use accuracy-lowering moves if it knows that t if (abilityAI == ABILITY_MOLD_BREAKER) { SCORE_GT(opponent, MOVE_SAND_ATTACK, MOVE_CELEBRATE); } else { - SCORE_EQ(opponent, MOVE_SAND_ATTACK, MOVE_CELEBRATE); + SCORE_LT_VAL(opponent, MOVE_SAND_ATTACK, AI_SCORE_DEFAULT); } } } SCENE { From 619ee562fad99e45cbfedbc6d7f629c3731bdb9c Mon Sep 17 00:00:00 2001 From: Hedara Date: Tue, 2 Sep 2025 15:18:41 +0200 Subject: [PATCH 020/183] Mark failing test that was masked --- test/battle/ai/ai_doubles.c | 1 + 1 file changed, 1 insertion(+) diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index fcef1f9d0a..b867eca087 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -621,6 +621,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die") AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if the ally does notably more damage") { + KNOWN_FAILING; // Failure was masked by test runner issues GIVEN { ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); From a8e60a8ba328351ee6b5ef9cde341565794d8abe Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Tue, 2 Sep 2025 22:14:23 +0100 Subject: [PATCH 021/183] Trainers trigger in local id order (#7424) Co-authored-by: Martin Griffin --- src/trainer_see.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/trainer_see.c b/src/trainer_see.c index cefb22eef4..2fc033004d 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -360,6 +360,8 @@ static const struct SpriteTemplate sSpriteTemplate_Emote = bool8 CheckForTrainersWantingBattle(void) { u8 i; + u8 trainerObjects[OBJECT_EVENTS_COUNT]; + u8 trainerObjectsCount = 0; if (FlagGet(OW_FLAG_NO_TRAINER_SEE)) return FALSE; @@ -367,17 +369,34 @@ bool8 CheckForTrainersWantingBattle(void) gNoOfApproachingTrainers = 0; gApproachingTrainerId = 0; + // Adds trainers wanting to battle to array for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - u8 numTrainers; - + { if (!gObjectEvents[i].active) continue; if (gObjectEvents[i].trainerType != TRAINER_TYPE_NORMAL && gObjectEvents[i].trainerType != TRAINER_TYPE_BURIED) continue; + trainerObjects[trainerObjectsCount++] = i; + } - numTrainers = CheckTrainer(i); - if (numTrainers == 0xFF) // non-trainerbatle script + // Sorts array by localId + for (i = 1; i <= trainerObjectsCount; i++) + { + u8 x = trainerObjects[i]; + u8 j = i; + while (j > 0 && gObjectEvents[trainerObjects[j-1]].localId > gObjectEvents[x].localId) + { + trainerObjects[j] = trainerObjects[j-1]; + j--; + } + trainerObjects[j] = x; + } + + for (i = 1; i <= trainerObjectsCount; i++) + { + u8 numTrainers; + numTrainers = CheckTrainer(trainerObjects[i]); + if (numTrainers == 0xFF) // non-trainerbattle script { u32 objectEventId = gApproachingTrainers[gNoOfApproachingTrainers - 1].objectEventId; gSelectedObjectEvent = objectEventId; From 04223403565cea2b11efce61ad3a36731343bd9a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 3 Sep 2025 20:25:27 +0200 Subject: [PATCH 022/183] Refactors Attackstring and PP deduction (#7402) --- asm/macros/battle_script.inc | 16 +- data/battle_scripts_1.s | 804 ++++---------------------- docs/tutorials/how_to_new_move.md | 4 +- include/battle.h | 9 +- include/battle_script_commands.h | 1 - include/battle_scripts.h | 20 +- include/battle_util.h | 16 +- include/constants/battle.h | 15 +- include/constants/battle_string_ids.h | 1 - src/battle_ai_util.c | 5 - src/battle_main.c | 4 +- src/battle_message.c | 1 - src/battle_script_commands.c | 402 ++----------- src/battle_util.c | 582 ++++++++++++++----- src/battle_z_move.c | 3 +- src/data/battle_move_effects.h | 14 +- test/battle/move_effect/copycat.c | 21 + test/battle/move_effect/me_first.c | 22 + test/battle/move_effect/mirror_move.c | 2 +- test/battle/move_effect/sleep_talk.c | 18 + 20 files changed, 708 insertions(+), 1252 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4a332f5b43..aa706dcb4d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -9,11 +9,11 @@ .2byte \move .endm - .macro attackstring + .macro printattackstring .byte 0x2 .endm - .macro ppreduce + .macro unused0x3 .byte 0x3 .endm @@ -877,7 +877,7 @@ .4byte \failInstr .endm - .macro metronome + .macro setcalledmove .byte 0x9e .endm @@ -1453,11 +1453,6 @@ .4byte \sidestatus .endm - .macro trycopycat failInstr:req - callnative BS_TryCopycat - .4byte \failInstr - .endm - .macro setzeffect callnative BS_SetZEffect .endm @@ -2207,11 +2202,6 @@ callnative BS_InvertStatStages .endm - .macro trymefirst failInstr:req - callnative BS_TryMeFirst - .4byte \failInstr - .endm - .macro tryelectrify failInstr:req callnative BS_TryElectrify .4byte \failInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 28707ae1c9..922fced44a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -22,8 +22,6 @@ BattleScript_EffectFickleBeam:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE ficklebeamdamagecalculation goto BattleScript_HitFromCritCalc @@ -80,19 +78,14 @@ BattleScript_LowerAtkSpAtkEnd: BattleScript_EffectSpicyExtract:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim goto BattleScript_ButItFailed BattleScript_SpicyExtract_CheckShouldSkipAttackAnim: jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0, BattleScript_SpicyExtract_RaiseAtk - attackstring - ppreduce - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT goto BattleScript_SpicyExtract_SkipAttackAnim BattleScript_SpicyExtract_RaiseAtk: - attackstring - ppreduce attackanimation waitanimation BattleScript_SpicyExtract_SkipAttackAnim: @@ -110,9 +103,7 @@ BattleScript_EffectSpicyExtract_End: BattleScript_EffectTidyUp:: attackcanceler - attackstring pause B_WAIT_TIME_MED - ppreduce waitstate saveattacker savetarget @@ -133,13 +124,11 @@ BattleScript_EffectTidyUpDoMoveAnimation:: BattleScript_EffectUpperHand:: attackcanceler - tryupperhand BattleScript_FailedFromAtkString + tryupperhand BattleScript_ButItFailed goto BattleScript_HitFromAccCheck BattleScript_EffectShedTail:: attackcanceler - attackstring - ppreduce waitstate jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed @@ -164,8 +153,6 @@ BattleScript_EffectPsychicNoise:: BattleScript_EffectFilletAway:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_FilletAwayTryAttack jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_FilletAwayTryAttack jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ButItFailed @@ -196,8 +183,6 @@ BattleScript_FilletAwayEnd:: BattleScript_EffectDoodle:: attackcanceler - attackstring - ppreduce trycopyability BS_ATTACKER, BattleScript_ButItFailed saveattacker attackanimation @@ -246,7 +231,6 @@ BattleScript_EffectChillyReception:: printstring STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE waitmessage B_WAIT_TIME_LONG attackcanceler - ppreduce jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalSun jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalRain jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_EffectChillyReceptionBlockedByStrongWinds @@ -259,7 +243,6 @@ BattleScript_EffectChillyReception:: call BattleScript_MoveWeatherChangeRet goto BattleScript_MoveSwitch BattleScript_EffectChillyReceptionPlayAnimation: - attackstring attackanimation waitanimation return @@ -276,8 +259,8 @@ BattleScript_EffectChillyReceptionBlockedByStrongWinds: call BattleScript_MysteriousAirCurrentBlowsOnRet goto BattleScript_MoveSwitch BattleScript_EffectChillyReceptionTrySwitchWeatherFailed: - jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_FailedFromAtkString - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_FailedFromAtkString + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed call BattleScript_EffectChillyReceptionPlayAnimation return @@ -326,9 +309,7 @@ BattleScript_MoveSwitchEnd: BattleScript_EffectPledge:: attackcanceler setpledge BattleScript_HitFromAccCheck - attackstring pause B_WAIT_TIME_MED - ppreduce printstring STRINGID_WAITINGFORPARTNERSMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -413,9 +394,7 @@ BattleScript_HurtTarget_NoString: BattleScript_EffectCorrosiveGas:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifsubstituteblocks BattleScript_CorrosiveGasFail jumpifcantloseitem BS_TARGET, BattleScript_CorrosiveGasFail attackanimation @@ -436,8 +415,6 @@ BattleScript_CorrosiveGasFail: BattleScript_EffectTakeHeart:: attackcanceler - attackstring - ppreduce curestatuswithmove BattleScript_CalmMindTryToRaiseStats attackanimation waitanimation @@ -450,8 +427,6 @@ BattleScript_EffectTakeHeart:: BattleScript_EffectRevivalBlessing:: attackcanceler - attackstring - ppreduce tryrevivalblessing BattleScript_ButItFailed attackanimation waitanimation @@ -484,8 +459,6 @@ BattleScript_SpikesActivates:: BattleScript_EffectAttackUpUserAlly:: jumpifnoally BS_ATTACKER, BattleScript_EffectAttackUp attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_EffectAttackUpUserAlly_Works jumpifstat BS_ATTACKER_PARTNER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed BattleScript_EffectAttackUpUserAlly_Works: @@ -522,8 +495,6 @@ BattleScript_EffectAttackUpUserAlly_TryAllyBlocked: BattleScript_EffectTeatime:: attackcanceler - attackstring - ppreduce jumpifteanoberry BattleScript_ButItFailed @ at least one battler is affected attackanimation @@ -638,17 +609,13 @@ BattleScript_ShellTrapSetUp:: BattleScript_EffectShellTrap:: attackcanceler jumpifshelltrap BS_ATTACKER, BattleScript_HitFromAccCheck - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT, BattleScript_MoveEnd - ppreduce printstring STRINGID_SHELLTRAPDIDNTWORK waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectCourtChange:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE swapsidestatuses attackanimation waitanimation @@ -673,9 +640,7 @@ BattleScript_BeakBlastBurn:: BattleScript_EffectSkyDrop:: attackcanceler jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_SkyDropTurn2 - ppreduce - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifsubstituteblocks BattleScript_ButItFailed jumpiftargetally BattleScript_ButItFailed jumpifunder200 BattleScript_SkyDropWork @@ -690,7 +655,6 @@ BattleScript_SkyDropWork: goto BattleScript_MoveEnd BattleScript_SkyDropTurn2: call BattleScript_TwoTurnMovesSecondTurnRet - attackstring clearskydrop BattleScript_SkyDropChangedTarget jumpiftype BS_TARGET, TYPE_FLYING, BattleScript_SkyDropFlyingType goto BattleScript_HitFromCritCalc @@ -720,14 +684,12 @@ BattleScript_SkyDropFlyingAlreadyConfused: BattleScript_EffectFling:: attackcanceler - jumpifcantfling BS_ATTACKER, BattleScript_FailedFromAtkString + jumpifcantfling BS_ATTACKER, BattleScript_ButItFailed setlastuseditem BS_ATTACKER accuracycheck BattleScript_FlingMissed, ACC_CURR_MOVE - attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNFLUNG waitmessage B_WAIT_TIME_SHORT - ppreduce critcalc damagecalc adjustdamage @@ -769,7 +731,7 @@ BattleScript_FlingEnd: BattleScript_FlingFailConsumeItem:: removeitem BS_ATTACKER - goto BattleScript_FailedFromAtkString + goto BattleScript_ButItFailed BattleScript_FlingBlockedByShieldDust:: printstring STRINGID_ITEMWASUSEDUP @@ -811,8 +773,6 @@ BattleScript_FlingWhiteHerb: BattleScript_FlingMissed: removeitem BS_ATTACKER - attackstring - ppreduce goto BattleScript_MoveMissedPause BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko @@ -822,8 +782,6 @@ BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko BattleScript_EffectClangorousSoul:: attackcanceler - attackstring - ppreduce cutonethirdhpandraisestats BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_BIDE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_IGNORE_DISGUISE attackanimation @@ -835,10 +793,8 @@ BattleScript_EffectClangorousSoul:: BattleScript_EffectOctolock:: attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + jumpifsubstituteblocks BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE trysetoctolock BattleScript_ButItFailed attackanimation waitanimation @@ -861,9 +817,7 @@ BattleScript_OctlockTurnDmgEnd: BattleScript_EffectPoltergeist:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE checkpoltergeist BattleScript_ButItFailed printstring STRINGID_ABOUTTOUSEPOLTERGEIST waitmessage B_WAIT_TIME_LONG @@ -871,11 +825,9 @@ BattleScript_EffectPoltergeist:: BattleScript_EffectTarShot:: attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - cantarshotwork BattleScript_FailedFromAtkString - attackstring - ppreduce + jumpifsubstituteblocks BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + cantarshotwork BattleScript_ButItFailed setstatchanger STAT_SPEED, 1, TRUE attackanimation waitanimation @@ -890,9 +842,7 @@ BattleScript_TryTarShot: BattleScript_EffectNoRetreat:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE trynoretreat BattleScript_ButItFailed attackanimation waitanimation @@ -950,8 +900,6 @@ BattleScript_MoveEffectLightScreen:: BattleScript_EffectStuffCheeks:: attackcanceler - attackstring - ppreduce jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation @@ -970,9 +918,7 @@ BattleScript_StuffCheeksEnd: BattleScript_EffectDecorate:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 12, BattleScript_DecorateBoost jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPATK, 12, BattleScript_DecorateBoost goto BattleScript_ButItFailed @@ -994,8 +940,6 @@ BattleScript_DecorateBoostSpAtk: BattleScript_EffectCoaching:: attackcanceler - attackstring - ppreduce jumpifnoally BS_ATTACKER, BattleScript_ButItFailed copybyte gBattlerTarget, gBattlerAttacker setallytonexttarget EffectCoaching_CheckAllyStats @@ -1023,8 +967,6 @@ BattleScript_CoachingBoostDef: BattleScript_EffectJungleHealing:: attackcanceler - attackstring - ppreduce jumpifteamhealthy BattleScript_ButItFailed attackanimation waitanimation @@ -1055,8 +997,6 @@ BattleScript_JungleHealingTryRestoreAlly: BattleScript_EffectLifeDew:: attackcanceler - attackstring - ppreduce jumpiffullhp BS_ATTACKER, BattleScript_EffectLifeDewCheckPartner copybyte gBattlerTarget, gBattlerAttacker attackanimation @@ -1088,9 +1028,7 @@ BattleScript_EffectLifeDewHealing: BattleScript_EffectAllySwitch:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryallyswitch BattleScript_ButItFailed attackanimation waitanimation @@ -1102,9 +1040,7 @@ BattleScript_EffectAllySwitch:: BattleScript_EffectFairyLock:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE trysetfairylock BattleScript_ButItFailed attackanimation waitanimation @@ -1114,10 +1050,8 @@ BattleScript_EffectFairyLock:: BattleScript_FailIfNotArgType:: attackcanceler - attackstring - ppreduce jumpifnotcurrentmoveargtype BS_ATTACKER, BattleScript_ButItFailed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_RemoveFireType:: @@ -1142,8 +1076,6 @@ BattleScript_DefDown_Ret: BattleScript_EffectPurify:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_PurifyWorks goto BattleScript_ButItFailed @@ -1160,10 +1092,8 @@ BattleScript_PurifyWorks: BattleScript_EffectStrengthSap:: setstatchanger STAT_ATK, 1, TRUE attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + jumpifsubstituteblocks BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MIN_STAT_STAGE, BattleScript_StrengthSapTryLower pause B_WAIT_TIME_SHORT statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd @@ -1239,8 +1169,6 @@ BattleScript_CoreEnforcerRet: BattleScript_EffectLaserFocus:: attackcanceler - attackstring - ppreduce trysetvolatile BS_ATTACKER, VOLATILE_LASER_FOCUS, BattleScript_ButItFailed attackanimation waitanimation @@ -1287,9 +1215,7 @@ BattleScript_SpectralThiefSteal:: BattleScript_EffectSpectralThief:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc tryspectralthiefsteal BattleScript_SpectralThiefSteal BattleScript_EffectSpectralThiefFromDamage: @@ -1303,12 +1229,10 @@ BattleScript_EffectSpectralThiefFromDamage: BattleScript_EffectPartingShot:: attackcanceler - attackstring - ppreduce jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_EffectPartingShotTryAtk jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_EffectPartingShotTryAtk: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE @@ -1326,9 +1250,7 @@ BattleScript_EffectPartingShotSwitch: BattleScript_EffectPowder:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_POWDER, BattleScript_ButItFailed setvolatile BS_TARGET, VOLATILE_POWDER attackanimation @@ -1339,8 +1261,6 @@ BattleScript_EffectPowder:: BattleScript_EffectAromaticMist:: attackcanceler - attackstring - ppreduce jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed jumpiftargetally BattleScript_EffectAromaticMistWorks goto BattleScript_ButItFailed @@ -1362,8 +1282,6 @@ BattleScript_EffectAromaticMistWontGoHigher: BattleScript_EffectMagneticFlux:: attackcanceler - attackstring - ppreduce setbyte gBattleCommunication, 0 BattleScript_EffectMagneticFluxStart: jumpifability BS_TARGET, ABILITY_MINUS, BattleScript_EffectMagneticFluxCheckStats @@ -1399,8 +1317,6 @@ BattleScript_EffectMagneticFluxEnd: BattleScript_EffectGearUp:: attackcanceler - attackstring - ppreduce setbyte gBattleCommunication, 0 BattleScript_EffectGearUpStart: jumpifability BS_TARGET, ABILITY_MINUS, BattleScript_EffectGearUpCheckStats @@ -1437,10 +1353,8 @@ BattleScript_EffectGearUpEnd: BattleScript_EffectAcupressure:: attackcanceler jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectAcupressureTry - jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_PrintMoveMissed + jumpifvolatile BS_TARGET, VOLATILE_SUBSTITUTE, BattleScript_MoveMissedPause BattleScript_EffectAcupressureTry: - attackstring - ppreduce tryacupressure BattleScript_ButItFailed attackanimation waitanimation @@ -1456,9 +1370,7 @@ BattleScript_MoveEffectFeint:: BattleScript_EffectThirdType:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE trythirdtype BattleScript_ButItFailed attackanimation waitanimation @@ -1468,8 +1380,6 @@ BattleScript_EffectThirdType:: BattleScript_EffectFlowerShield:: attackcanceler - attackstring - ppreduce savetarget selectfirstvalidtarget BattleScript_FlowerShieldIsAnyGrass: @@ -1504,8 +1414,6 @@ BattleScript_FlowerShieldMoveTargetEnd: BattleScript_EffectRototiller:: attackcanceler - attackstring - ppreduce getrototillertargets BattleScript_ButItFailed @ at least one battler is affected attackanimation @@ -1550,9 +1458,7 @@ BattleScript_RototillerNoEffect: BattleScript_EffectBestow:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON jumpifsubstituteblocks BattleScript_ButItFailed trybestow BattleScript_ButItFailed attackanimation @@ -1564,9 +1470,7 @@ BattleScript_EffectBestow:: BattleScript_EffectAfterYou:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryafteryou BattleScript_ButItFailed attackanimation waitanimation @@ -1586,9 +1490,7 @@ BattleScript_MoveEffectFlameBurst:: BattleScript_EffectPowerTrick:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE powertrick attackanimation waitanimation @@ -1598,9 +1500,7 @@ BattleScript_EffectPowerTrick:: BattleScript_EffectPsychoShift:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifstatus BS_ATTACKER, STATUS1_ANY, BattleScript_EffectPsychoShiftCanWork goto BattleScript_ButItFailed BattleScript_EffectPsychoShiftCanWork: @@ -1622,9 +1522,7 @@ BattleScript_EffectPsychoShiftCanWork: BattleScript_EffectSynchronoise:: attackcanceler - attackstring pause B_WAIT_TIME_MED - ppreduce trysynchronoise BattleScript_MoveEnd accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc @@ -1653,11 +1551,9 @@ BattleScript_EffectDefog:: jumpifsubstituteblocks BattleScript_DefogIfCanClearHazards jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_EVASION, MIN_STAT_STAGE, BattleScript_DefogWorks BattleScript_DefogIfCanClearHazards: - trydefog FALSE, BattleScript_FailedFromAtkString + trydefog FALSE, BattleScript_ButItFailed BattleScript_DefogWorks: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefogDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_DefogTryHazardsWithAnim @@ -1680,23 +1576,9 @@ BattleScript_DefogTryHazardsWithAnim: waitanimation goto BattleScript_DefogTryHazards -BattleScript_EffectCopycat:: - attackcanceler - attackstring - pause 5 - trycopycat BattleScript_CopycatFail - attackanimation - waitanimation - jumptocalledmove TRUE -BattleScript_CopycatFail: - ppreduce - goto BattleScript_ButItFailed - BattleScript_EffectInstruct:: attackcanceler - attackstring - ppreduce - pause 5 + pause B_WAIT_TIME_SHORT tryinstruct BattleScript_ButItFailed attackanimation waitanimation @@ -1709,8 +1591,6 @@ BattleScript_EffectInstruct:: BattleScript_EffectAutotomize:: setstatchanger STAT_SPEED, 2, FALSE attackcanceler - attackstring - ppreduce statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AutotomizeWeightLoss jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AutotomizeAttackAnim pause B_WAIT_TIME_SHORT @@ -1750,11 +1630,9 @@ BattleScript_HitSwitchTargetForceRandomSwitchFailed: BattleScript_EffectToxicThread:: setstatchanger STAT_SPEED, 1, TRUE attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString + jumpifsubstituteblocks BattleScript_ButItFailed checknonvolatiletrigger MOVE_EFFECT_POISON, BattleScript_EffectStatDownFromAccCheck - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE attackanimation waitanimation setstatchanger STAT_SPEED, 1, TRUE @@ -1774,8 +1652,6 @@ BattleScript_ToxicThreadTryPsn:: BattleScript_EffectVenomDrench:: attackcanceler - attackstring - ppreduce jumpifstatus BS_TARGET, STATUS1_PSN_ANY, BattleScript_EffectVenomDrenchCanBeUsed goto BattleScript_ButItFailed BattleScript_EffectVenomDrenchCanBeUsed: @@ -1808,8 +1684,6 @@ BattleScript_VenomDrenchEnd:: BattleScript_EffectNobleRoar:: attackcanceler - attackstring - ppreduce jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_NobleRoarDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_NobleRoarDoMoveAnim:: @@ -1832,8 +1706,6 @@ BattleScript_NobleRoarEnd:: BattleScript_EffectShellSmash:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_ShellSmashTryDef jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_ShellSmashTryDef jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ShellSmashTryDef @@ -1876,16 +1748,12 @@ BattleScript_ShellSmashEnd: BattleScript_EffectLastResort:: attackcanceler - attackstring - ppreduce trylastresort BattleScript_ButItFailed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_EffectGrowth:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_GrowthDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_GrowthDoMoveAnim:: @@ -1917,9 +1785,7 @@ BattleScript_GrowthEnd: BattleScript_EffectSoak:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifability BS_TARGET, ABILITY_MULTITYPE, BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_RKS_SYSTEM, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed @@ -1932,9 +1798,7 @@ BattleScript_EffectSoak:: BattleScript_EffectReflectType:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryreflecttype BattleScript_ButItFailed attackanimation waitanimation @@ -1944,9 +1808,7 @@ BattleScript_EffectReflectType:: BattleScript_EffectElectrify:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryelectrify BattleScript_ButItFailed attackanimation waitanimation @@ -1956,8 +1818,6 @@ BattleScript_EffectElectrify:: BattleScript_EffectShiftGear:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ShiftGearDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_ShiftGearDoMoveAnim: @@ -1984,8 +1844,6 @@ BattleScript_ShiftGearEnd: BattleScript_EffectCoil:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_CoilDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_CoilDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ACC, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -2014,8 +1872,6 @@ BattleScript_CoilEnd: BattleScript_EffectQuiverDance:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_QuiverDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_QuiverDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -2044,8 +1900,6 @@ BattleScript_QuiverDanceEnd:: BattleScript_EffectVictoryDance:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_VictoryDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_VictoryDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -2072,18 +1926,8 @@ BattleScript_VictoryDanceTrySpeed:: BattleScript_VictoryDanceEnd:: goto BattleScript_MoveEnd -BattleScript_EffectMeFirst:: - attackcanceler - attackstring - trymefirst BattleScript_FailedFromPpReduce - attackanimation - waitanimation - jumptocalledmove TRUE - BattleScript_EffectAttackSpAttackUp:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AttackSpAttackUpDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_AttackSpAttackUpDoMoveAnim:: @@ -2105,8 +1949,6 @@ BattleScript_AttackSpAttackUpEnd: BattleScript_EffectAttackAccUp:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AttackAccUpDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ACC, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_AttackAccUpDoMoveAnim:: @@ -2131,8 +1973,6 @@ BattleScript_EffectGrassyTerrain:: BattleScript_EffectElectricTerrain:: BattleScript_EffectPsychicTerrain:: attackcanceler - attackstring - ppreduce setterrain BattleScript_ButItFailed attackanimation waitanimation @@ -2144,8 +1984,6 @@ BattleScript_EffectPsychicTerrain:: BattleScript_EffectTopsyTurvy:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 6, BattleScript_EffectTopsyTurvyWorks jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_DEF, 6, BattleScript_EffectTopsyTurvyWorks @@ -2164,9 +2002,7 @@ BattleScript_EffectTopsyTurvyWorks: BattleScript_EffectIonDeluge:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE orword gFieldStatuses, STATUS_FIELD_ION_DELUGE attackanimation waitanimation @@ -2176,9 +2012,7 @@ BattleScript_EffectIonDeluge:: BattleScript_EffectQuash:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryquash BattleScript_ButItFailed attackanimation waitanimation @@ -2188,8 +2022,6 @@ BattleScript_EffectQuash:: BattleScript_EffectHealPulse:: attackcanceler - attackstring - ppreduce jumpifvolatile BS_ATTACKER, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents @ stops pollen puff jumpifvolatile BS_TARGET, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON @@ -2205,9 +2037,7 @@ BattleScript_EffectHealPulse:: BattleScript_EffectEntrainment:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryentrainment BattleScript_ButItFailed attackanimation waitanimation @@ -2218,9 +2048,7 @@ BattleScript_EffectEntrainment:: BattleScript_EffectSimpleBeam:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE setsimplebeam BattleScript_ButItFailed attackanimation waitanimation @@ -2237,14 +2065,12 @@ BattleScript_EffectSimpleBeam:: BattleScript_EffectSuckerPunch:: attackcanceler - suckerpunchcheck BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + suckerpunchcheck BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromAtkString BattleScript_EffectLuckyChant:: attackcanceler - attackstring - ppreduce setluckychant BattleScript_ButItFailed attackanimation waitanimation @@ -2254,10 +2080,8 @@ BattleScript_EffectLuckyChant:: BattleScript_EffectMetalBurst:: attackcanceler - metalburstdamagecalculator BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + metalburstdamagecalculator BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage @@ -2265,9 +2089,7 @@ BattleScript_EffectMetalBurst:: BattleScript_EffectHealingWish:: attackcanceler - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_FailedFromAtkString - attackstring - ppreduce + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation instanthpdrop @@ -2318,9 +2140,7 @@ BattleScript_EffectHealingWishRestore: BattleScript_EffectWorrySeed:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE tryworryseed BattleScript_ButItFailed attackanimation waitanimation @@ -2337,8 +2157,6 @@ BattleScript_EffectWorrySeed:: BattleScript_EffectPowerSplit:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON averagestats STAT_ATK averagestats STAT_SPATK @@ -2350,8 +2168,6 @@ BattleScript_EffectPowerSplit:: BattleScript_EffectGuardSplit:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON averagestats STAT_DEF averagestats STAT_SPDEF @@ -2363,8 +2179,6 @@ BattleScript_EffectGuardSplit:: BattleScript_EffectHeartSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_ATK swapstatstages STAT_DEF @@ -2381,8 +2195,6 @@ BattleScript_EffectHeartSwap:: BattleScript_EffectPowerSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_ATK swapstatstages STAT_SPATK @@ -2394,8 +2206,6 @@ BattleScript_EffectPowerSwap:: BattleScript_EffectGuardSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_DEF swapstatstages STAT_SPDEF @@ -2407,8 +2217,6 @@ BattleScript_EffectGuardSwap:: BattleScript_EffectSpeedSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstats STAT_SPEED attackanimation @@ -2419,9 +2227,7 @@ BattleScript_EffectSpeedSwap:: BattleScript_EffectTelekinesis:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON settelekinesis BattleScript_ButItFailed attackanimation waitanimation @@ -2431,8 +2237,6 @@ BattleScript_EffectTelekinesis:: BattleScript_EffectStealthRock:: attackcanceler - attackstring - ppreduce setstealthrock BattleScript_ButItFailed attackanimation waitanimation @@ -2442,8 +2246,6 @@ BattleScript_EffectStealthRock:: BattleScript_EffectStickyWeb:: attackcanceler - attackstring - ppreduce setstickyweb BattleScript_ButItFailed attackanimation waitanimation @@ -2453,9 +2255,7 @@ BattleScript_EffectStickyWeb:: BattleScript_EffectGastroAcid:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifvolatile BS_TARGET, VOLATILE_GASTRO_ACID, BattleScript_ButItFailed setgastroacid BattleScript_ButItFailed attackanimation @@ -2470,8 +2270,6 @@ BattleScript_EffectGastroAcid:: BattleScript_EffectToxicSpikes:: attackcanceler - attackstring - ppreduce settoxicspikes BattleScript_ButItFailed attackanimation waitanimation @@ -2481,8 +2279,6 @@ BattleScript_EffectToxicSpikes:: BattleScript_EffectMagnetRise:: attackcanceler - attackstring - ppreduce jumpifvolatile BS_ATTACKER, VOLATILE_ROOT, BattleScript_ButItFailed jumpifvolatile BS_ATTACKER, VOLATILE_SMACK_DOWN, BattleScript_ButItFailed trysetvolatile BS_ATTACKER, VOLATILE_MAGNET_RISE, BattleScript_ButItFailed @@ -2494,8 +2290,6 @@ BattleScript_EffectMagnetRise:: BattleScript_EffectTrickRoom:: attackcanceler - attackstring - ppreduce setroom attackanimation waitanimation @@ -2520,8 +2314,6 @@ BattleScript_RoomServiceLoop_NextBattler: BattleScript_EffectWonderRoom:: BattleScript_EffectMagicRoom:: attackcanceler - attackstring - ppreduce setroom attackanimation waitanimation @@ -2531,8 +2323,6 @@ BattleScript_EffectMagicRoom:: BattleScript_EffectAquaRing:: attackcanceler - attackstring - ppreduce setvolatile BS_ATTACKER, VOLATILE_AQUA_RING attackanimation waitanimation @@ -2542,9 +2332,7 @@ BattleScript_EffectAquaRing:: BattleScript_EffectEmbargo:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE setembargo BattleScript_ButItFailed attackanimation waitanimation @@ -2554,8 +2342,6 @@ BattleScript_EffectEmbargo:: BattleScript_EffectTailwind:: attackcanceler - attackstring - ppreduce settailwind BattleScript_ButItFailed attackanimation waitanimation @@ -2591,16 +2377,12 @@ BattleScript_TryTailwindAbilitiesLoop_WindPower: BattleScript_EffectMiracleEye:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE setvolatile BS_TARGET, VOLATILE_MIRACLE_EYE goto BattleScript_IdentifiedFoe BattleScript_EffectGravity:: attackcanceler - attackstring - ppreduce setgravity BattleScript_ButItFailed attackanimation waitanimation @@ -2627,8 +2409,6 @@ BattleScript_GravityLoopEnd: BattleScript_EffectRoost:: attackcanceler - attackstring - ppreduce tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET setroost goto BattleScript_PresentHealTarget @@ -2636,8 +2416,6 @@ BattleScript_EffectRoost:: BattleScript_EffectCaptivate:: setstatchanger STAT_SPATK, 2, TRUE attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed jumpifcaptivateaffected BattleScript_CaptivateCheckAcc goto BattleScript_ButItFailed @@ -2647,9 +2425,7 @@ BattleScript_CaptivateCheckAcc: BattleScript_EffectHealBlock:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects sethealblock BattleScript_ButItFailed attackanimation @@ -2668,8 +2444,6 @@ BattleScript_HitEscapeSwitch: BattleScript_EffectPlaceholder:: attackcanceler - attackstring - ppreduce pause 5 printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd @@ -2677,10 +2451,8 @@ BattleScript_EffectPlaceholder:: BattleScript_EffectHit:: attackcanceler BattleScript_HitFromAccCheck:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE BattleScript_HitFromAtkString:: - attackstring - ppreduce BattleScript_HitFromCritCalc:: critcalc damagecalc @@ -2696,9 +2468,7 @@ BattleScript_MoveEnd:: BattleScript_EffectHit_Ret:: attackcanceler BattleScript_EffectHit_RetFromAccCheck:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE BattleScript_EffectHit_RetFromCritCalc:: critcalc damagecalc @@ -2720,8 +2490,6 @@ BattleScript_Hit_RetFromAtkAnimation:: BattleScript_EffectNaturalGift:: attackcanceler - attackstring - ppreduce jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailed jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailed @@ -2731,9 +2499,6 @@ BattleScript_EffectNaturalGift:: BattleScript_MakeMoveMissed:: setmoveresultflags MOVE_RESULT_MISSED -BattleScript_PrintMoveMissed:: - attackstring - ppreduce BattleScript_MoveMissedPause:: pause B_WAIT_TIME_SHORT BattleScript_MoveMissed:: @@ -2848,13 +2613,11 @@ BattleScript_EffectAbsorb:: BattleScript_EffectExplosion:: attackcanceler - attackstring - ppreduce tryexplosion setatkhptozero waitstate jumpiffainted BS_TARGET, TRUE, BattleScript_MoveEnd - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_FaintAttackerForExplosion:: @@ -2875,17 +2638,6 @@ BattleScript_EffectDreamEater:: jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_HitFromAccCheck goto BattleScript_DoesntAffectTargetAtkString -BattleScript_EffectMirrorMove:: - attackcanceler - attackstring - pause B_WAIT_TIME_LONG - trymirrormove - ppreduce - setmoveresultflags MOVE_RESULT_FAILED - printstring STRINGID_MIRRORMOVEFAILED - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - BattleScript_EffectAttackUp:: setstatchanger STAT_ATK, 1, FALSE goto BattleScript_EffectStatUp @@ -2915,8 +2667,6 @@ BattleScript_EffectEvasionUp:: BattleScript_EffectStatUp:: attackcanceler BattleScript_EffectStatUpAfterAtkCanceler:: - attackstring - ppreduce statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpAttackAnim pause B_WAIT_TIME_SHORT @@ -2965,12 +2715,10 @@ BattleScript_EffectEvasionDown:: setstatchanger STAT_EVASION, 1, TRUE BattleScript_EffectStatDown: attackcanceler - jumpifsubstituteblocks BattleScript_FailedFromAtkString + jumpifsubstituteblocks BattleScript_ButItFailed BattleScript_EffectStatDownFromAccCheck: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE BattleScript_StatDownFromAttackString: - attackstring - ppreduce BattleScript_EffectStatDownFromStatBuffChange: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatDownEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim @@ -3028,8 +2776,6 @@ BattleScript_StatDown:: BattleScript_EffectHaze:: attackcanceler - attackstring - ppreduce attackanimation waitanimation normalisebuffs @@ -3039,8 +2785,6 @@ BattleScript_EffectHaze:: BattleScript_EffectBide:: attackcanceler - attackstring - ppreduce attackanimation waitanimation setbide @@ -3048,8 +2792,6 @@ BattleScript_EffectBide:: BattleScript_EffectRoar:: attackcanceler - attackstring - ppreduce jumpifroarfails BattleScript_ButItFailed jumpifcommanderactive BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_ButItFailed @@ -3080,8 +2822,6 @@ BattleScript_ScaleShot:: BattleScript_EffectConversion:: attackcanceler - attackstring - ppreduce tryconversiontypechange BattleScript_ButItFailed attackanimation waitanimation @@ -3091,8 +2831,6 @@ BattleScript_EffectConversion:: BattleScript_EffectRestoreHp:: attackcanceler - attackstring - ppreduce tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER attackanimation waitanimation @@ -3117,22 +2855,16 @@ BattleScript_ImmunityProtected:: BattleScript_EffectAuroraVeil:: attackcanceler - attackstring - ppreduce setauroraveil goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectLightScreen:: attackcanceler - attackstring - ppreduce setlightscreen goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectRest:: attackcanceler - attackstring - ppreduce jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_RestIsAlreadyAsleep jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_RestIsAlreadyAsleep jumpifuproarwakes BattleScript_RestCantSleep @@ -3171,8 +2903,6 @@ BattleScript_LeafGuardPreventsRest:: BattleScript_EffectOHKO:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE typecalc jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation @@ -3197,8 +2927,6 @@ BattleScript_RecoilIfMiss:: BattleScript_EffectMist:: attackcanceler - attackstring - ppreduce setmist attackanimation waitanimation @@ -3208,8 +2936,6 @@ BattleScript_EffectMist:: BattleScript_EffectFocusEnergy:: attackcanceler - attackstring - ppreduce jumpifvolatile BS_ATTACKER, VOLATILE_DRAGON_CHEER, BattleScript_ButItFailed jumpifvolatile BS_ATTACKER, VOLATILE_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy BS_TARGET @@ -3221,8 +2947,6 @@ BattleScript_EffectFocusEnergy:: BattleScript_EffectConfuse:: attackcanceler - attackstring - ppreduce jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsubstituteblocks BattleScript_ButItFailed jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_AlreadyConfused @@ -3281,8 +3005,6 @@ BattleScript_EffectEvasionUp2:: BattleScript_EffectTransform:: attackcanceler - attackstring - ppreduce trytoclearprimalweather flushtextbox transformdataexecution @@ -3322,8 +3044,6 @@ BattleScript_EffectEvasionDown2:: BattleScript_EffectReflect:: attackcanceler - attackstring - ppreduce setreflect BattleScript_PrintReflectLightScreenSafeguardString:: attackanimation @@ -3354,9 +3074,8 @@ BattleScript_PowerHerbActivation: BattleScript_EffectTwoTurnsAttack:: jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_TwoTurnMovesSecondTurn - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_ATTACKSTRING_PRINTED, BattleScript_EffectHit @ if it's not the first hit tryfiretwoturnmovewithoutcharging BS_ATTACKER, BattleScript_EffectHit @ e.g. Solar Beam + jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_ATTACKSTRING_PRINTED, BattleScript_EffectHit @ if it's not the first hit call BattleScript_FirstChargingTurn tryfiretwoturnmoveaftercharging BS_ATTACKER, BattleScript_TwoTurnMovesSecondTurn @ e.g. Electro Shot jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_TwoTurnMovesSecondPowerHerbActivates, TRUE @@ -3364,7 +3083,6 @@ BattleScript_EffectTwoTurnsAttack:: BattleScript_EffectGeomancy:: jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_GeomancySecondTurn - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING, BattleScript_GeomancySecondTurn call BattleScript_FirstChargingTurn jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd call BattleScript_PowerHerbActivation @@ -3372,8 +3090,6 @@ BattleScript_GeomancySecondTurn: attackcanceler setbyte sB_ANIM_TURN, 1 clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS - orword gHitMarker, HITMARKER_NO_PPDEDUCT - attackstring jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -3402,13 +3118,7 @@ BattleScript_GeomancyEnd:: BattleScript_FirstChargingTurn:: attackcanceler -@ before Gen 5, charge moves did not print an attack string on the charge turn -.if B_UPDATED_MOVE_DATA >= GEN_5 - flushtextbox - attackstring waitmessage B_WAIT_TIME_LONG -.endif - ppreduce BattleScript_FirstChargingTurnAfterAttackString: setsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP setchargingturn @@ -3421,17 +3131,12 @@ BattleScript_TwoTurnMovesSecondPowerHerbActivates: trygulpmissile @ Edge case for Cramorant ability Gulp Missile BattleScript_FromTwoTurnMovesSecondTurnRet: call BattleScript_TwoTurnMovesSecondTurnRet - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE -@ before Gen 5, charge moves did not print an attack string on the charge turn -.if B_UPDATED_MOVE_DATA < GEN_5 - attackstring -.endif + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_TwoTurnMovesSecondTurn:: attackcanceler call BattleScript_TwoTurnMovesSecondTurnRet - orword gHitMarker, HITMARKER_NO_PPDEDUCT goto BattleScript_HitFromAccCheck BattleScript_TwoTurnMovesSecondTurnRet: @@ -3443,8 +3148,6 @@ BattleScript_TwoTurnMovesSecondTurnRet: BattleScript_EffectSubstitute:: attackcanceler - ppreduce - attackstring waitstate jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute setsubstitute @@ -3478,12 +3181,10 @@ BattleScript_EffectRage:: goto BattleScript_HitFromAtkString BattleScript_RageMiss:: clearvolatile BS_ATTACKER, VOLATILE_RAGE - goto BattleScript_PrintMoveMissed + goto BattleScript_MoveMissedPause BattleScript_EffectMimic:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON mimicattackcopy BattleScript_ButItFailed @@ -3493,19 +3194,9 @@ BattleScript_EffectMimic:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectMetronome:: - attackcanceler - attackstring - pause B_WAIT_TIME_SHORT - attackanimation - waitanimation - metronome - BattleScript_EffectLeechSeed:: attackcanceler - attackstring pause B_WAIT_TIME_SHORT - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_DoLeechSeed, ACC_CURR_MOVE BattleScript_DoLeechSeed:: @@ -3518,8 +3209,6 @@ BattleScript_DoLeechSeed:: BattleScript_EffectDoNothing:: attackcanceler - attackstring - ppreduce attackanimation waitanimation incrementgamestat GAME_STAT_USED_SPLASH @@ -3529,8 +3218,6 @@ BattleScript_EffectDoNothing:: BattleScript_EffectHoldHands:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed attackanimation @@ -3539,8 +3226,6 @@ BattleScript_EffectHoldHands:: BattleScript_EffectCelebrate:: attackcanceler - attackstring - ppreduce attackanimation waitanimation printstring STRINGID_CELEBRATEMESSAGE @@ -3549,8 +3234,6 @@ BattleScript_EffectCelebrate:: BattleScript_EffectHappyHour:: attackcanceler - attackstring - ppreduce attackanimation waitanimation seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_HAPPY_HOUR @@ -3558,8 +3241,6 @@ BattleScript_EffectHappyHour:: BattleScript_EffectDisable:: attackcanceler - attackstring - ppreduce jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE disablelastusedattack BattleScript_ButItFailed @@ -3571,10 +3252,8 @@ BattleScript_EffectDisable:: BattleScript_EffectCounter:: attackcanceler - counterdamagecalculator BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + counterdamagecalculator BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage @@ -3582,9 +3261,7 @@ BattleScript_EffectCounter:: BattleScript_EffectEncore:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects trysetencore BattleScript_ButItFailed attackanimation @@ -3595,8 +3272,6 @@ BattleScript_EffectEncore:: BattleScript_EffectPainSplit:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON painsplitdmgcalc BattleScript_ButItFailed attackanimation @@ -3614,8 +3289,6 @@ BattleScript_EffectSnore:: attackcanceler jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SnoreIsAsleep jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SnoreIsAsleep - attackstring - ppreduce goto BattleScript_ButItFailed BattleScript_SnoreIsAsleep:: jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoSnore @@ -3623,15 +3296,11 @@ BattleScript_SnoreIsAsleep:: waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER BattleScript_DoSnore:: - attackstring - ppreduce accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_EffectConversion2:: attackcanceler - attackstring - ppreduce settypetorandomresistance BattleScript_ButItFailed attackanimation waitanimation @@ -3641,8 +3310,6 @@ BattleScript_EffectConversion2:: BattleScript_EffectLockOn:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE setalwayshitflag @@ -3654,8 +3321,6 @@ BattleScript_EffectLockOn:: BattleScript_EffectSketch:: attackcanceler - attackstring - ppreduce copymovepermanently BattleScript_ButItFailed attackanimation waitanimation @@ -3663,32 +3328,8 @@ BattleScript_EffectSketch:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectSleepTalk:: - attackcanceler - jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SleepTalkIsAsleep - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SleepTalkIsAsleep - attackstring - ppreduce - goto BattleScript_ButItFailed -BattleScript_SleepTalkIsAsleep:: - printstring STRINGID_PKMNFASTASLEEP - waitmessage B_WAIT_TIME_LONG - statusanimation BS_ATTACKER - attackstring - ppreduce - orword gHitMarker, HITMARKER_NO_PPDEDUCT - trychoosesleeptalkmove BattleScript_SleepTalkUsingMove - pause B_WAIT_TIME_LONG - goto BattleScript_ButItFailed -BattleScript_SleepTalkUsingMove:: - attackanimation - waitanimation - jumptocalledmove TRUE - BattleScript_EffectDestinyBond:: attackcanceler - attackstring - ppreduce trysetdestinybond BattleScript_ButItFailed attackanimation waitanimation @@ -3703,8 +3344,6 @@ BattleScript_MoveEffectEerieSpell:: BattleScript_EffectSpite:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryspiteppreduce BattleScript_ButItFailed attackanimation @@ -3715,8 +3354,6 @@ BattleScript_EffectSpite:: BattleScript_EffectHealBell:: attackcanceler - attackstring - ppreduce attackanimation waitanimation BattleScript_EffectHealBell_FromHeal:: @@ -3741,8 +3378,6 @@ BattleScript_PartyHealEnd:: BattleScript_EffectMeanLook:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed @@ -3758,8 +3393,6 @@ BattleScript_EffectMeanLook:: BattleScript_EffectNightmare:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed jumpifvolatile BS_TARGET, VOLATILE_NIGHTMARE, BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_NightmareWorked @@ -3787,8 +3420,6 @@ BattleScript_EffectCurse:: jumpiftype BS_ATTACKER, TYPE_GHOST, BattleScript_GhostCurse attackcanceler jumpiftype BS_ATTACKER, TYPE_GHOST, BattleScript_DoGhostCurse - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPEED, MIN_STAT_STAGE, BattleScript_CurseTrySpeed jumpifstat BS_ATTACKER, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CurseTrySpeed jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_ButItFailed @@ -3818,8 +3449,6 @@ BattleScript_GhostCurse:: getmovetarget BattleScript_DoGhostCurse:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON cursetarget BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE @@ -3835,15 +3464,13 @@ BattleScript_DoGhostCurse:: BattleScript_EffectMatBlock:: attackcanceler - jumpifnotfirstturn BattleScript_FailedFromAtkString - goto BattleScript_ProtectLikeAtkString + jumpifnotfirstturn BattleScript_ButItFailed + goto BattleScript_ProtectLikeAttack BattleScript_EffectProtect:: BattleScript_EffectEndure:: attackcanceler -BattleScript_ProtectLikeAtkString: - attackstring - ppreduce +BattleScript_ProtectLikeAttack: setprotectlike attackanimation waitanimation @@ -3853,9 +3480,7 @@ BattleScript_ProtectLikeAtkString: BattleScript_EffectSpikes:: attackcanceler - trysetspikes BattleScript_FailedFromAtkString - attackstring - ppreduce + trysetspikes BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_SPIKESSCATTERED @@ -3864,8 +3489,6 @@ BattleScript_EffectSpikes:: BattleScript_EffectForesight:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_FORESIGHT, BattleScript_ButItFailed setvolatile BS_TARGET, VOLATILE_FORESIGHT @@ -3878,8 +3501,6 @@ BattleScript_IdentifiedFoe: BattleScript_EffectPerishSong:: attackcanceler - attackstring - ppreduce trysetperishsong BattleScript_ButItFailed savetarget attackanimation @@ -3909,17 +3530,13 @@ BattleScript_PerishSongNotAffected: BattleScript_EffectSandstorm:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_SANDSTORM goto BattleScript_MoveWeatherChange BattleScript_EffectRollout:: attackcanceler - attackstring jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy - ppreduce BattleScript_RolloutCheckAccuracy:: accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE BattleScript_RolloutHit:: @@ -3930,9 +3547,7 @@ BattleScript_RolloutHit:: BattleScript_EffectSwagger:: attackcanceler jumpifsubstituteblocks BattleScript_MakeMoveMissed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifconfusedandstatmaxed STAT_ATK, BattleScript_ButItFailed attackanimation waitanimation @@ -3949,8 +3564,6 @@ BattleScript_SwaggerTryConfuse: BattleScript_EffectFuryCutter:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE BattleScript_FuryCutterHit: handlefurycutter @@ -3986,8 +3599,6 @@ BattleScript_TryDestinyKnotAttackerRet: BattleScript_EffectAttract:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects tryinfatuating BattleScript_ButItFailed @@ -4000,36 +3611,26 @@ BattleScript_EffectAttract:: BattleScript_EffectPresent:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc presentdamagecalculation BattleScript_EffectSafeguard:: attackcanceler - attackstring - ppreduce setsafeguard goto BattleScript_PrintReflectLightScreenSafeguardString BattleScript_EffectMagnitude:: - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT, BattleScript_EffectMagnitudeTarget attackcanceler - attackstring - ppreduce magnitudedamagecalculation pause B_WAIT_TIME_SHORT printstring STRINGID_MAGNITUDESTRENGTH waitmessage B_WAIT_TIME_LONG -BattleScript_EffectMagnitudeTarget: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc BattleScript_EffectBatonPass:: attackcanceler - attackstring - ppreduce jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed attackanimation @@ -4055,15 +3656,11 @@ BattleScript_EffectSynthesis:: BattleScript_EffectMoonlight:: BattleScript_EffectShoreUp:: attackcanceler - attackstring - ppreduce recoverbasedonsunlight BattleScript_AlreadyAtFullHp goto BattleScript_PresentHealTarget BattleScript_EffectRainDance:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_RAIN BattleScript_MoveWeatherChange:: @@ -4080,8 +3677,6 @@ BattleScript_MoveWeatherChangeRet:: BattleScript_EffectSunnyDay:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_SUN goto BattleScript_MoveWeatherChange @@ -4156,8 +3751,6 @@ BattleScript_BlockedByPrimalWeatherRet:: BattleScript_EffectBellyDrum:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed halvehp BattleScript_ButItFailed orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE @@ -4173,8 +3766,6 @@ BattleScript_EffectBellyDrum:: BattleScript_EffectPsychUp:: attackcanceler - attackstring - ppreduce copyfoestats attackanimation waitanimation @@ -4184,10 +3775,8 @@ BattleScript_EffectPsychUp:: BattleScript_EffectMirrorCoat:: attackcanceler - mirrorcoatdamagecalculator BattleScript_FailedFromAtkString - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + mirrorcoatdamagecalculator BattleScript_ButItFailed + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE adjustdamage @@ -4195,8 +3784,6 @@ BattleScript_EffectMirrorCoat:: BattleScript_EffectFutureSight:: attackcanceler - attackstring - ppreduce trysetfutureattack BattleScript_ButItFailed attackanimation waitanimation @@ -4212,8 +3799,6 @@ BattleScript_EffectTeleport:: jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FailedFromAtkCanceler .endif attackcanceler - attackstring - ppreduce isrunningimpossible jumpifbyte CMP_EQUAL, gBattleCommunication, BATTLE_RUN_FORBIDDEN, BattleScript_ButItFailed jumpifbyte CMP_EQUAL, gBattleCommunication, BATTLE_RUN_FAILURE, BattleScript_PrintAbilityMadeIneffective @@ -4226,19 +3811,15 @@ BattleScript_EffectTeleport:: BattleScript_EffectBeatUp:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE .if B_BEAT_UP >= GEN_5 - attackstring - ppreduce critcalc damagecalc adjustdamage trydobeatup goto BattleScript_HitFromAtkAnimation .else - attackstring pause B_WAIT_TIME_SHORT - ppreduce setbyte gBattleCommunication, 0 BattleScript_BeatUpLoop:: movevaluescleanup @@ -4269,8 +3850,6 @@ BattleScript_BeatUpEnd:: BattleScript_EffectDefenseCurl:: attackcanceler - attackstring - ppreduce setvolatile BS_TARGET, VOLATILE_DEFENSE_CURL setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefenseCurlDoStatUpAnim @@ -4282,8 +3861,6 @@ BattleScript_DefenseCurlDoStatUpAnim:: BattleScript_EffectSoftboiled:: attackcanceler - attackstring - ppreduce tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET BattleScript_PresentHealTarget:: attackanimation @@ -4303,15 +3880,11 @@ BattleScript_AlreadyAtFullHp:: BattleScript_EffectFirstTurnOnly:: attackcanceler - jumpifnotfirstturn BattleScript_FailedFromAtkString + jumpifnotfirstturn BattleScript_ButItFailed goto BattleScript_EffectHit BattleScript_FailedFromAtkCanceler:: attackcanceler -BattleScript_FailedFromAtkString:: - attackstring -BattleScript_FailedFromPpReduce:: - ppreduce BattleScript_ButItFailed:: pause B_WAIT_TIME_SHORT setmoveresultflags MOVE_RESULT_FAILED @@ -4342,17 +3915,13 @@ BattleScript_NotAffectedAbilityPopUp:: BattleScript_EffectUproar:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_UproarHit - ppreduce BattleScript_UproarHit:: goto BattleScript_HitFromCritCalc BattleScript_EffectStockpile:: attackcanceler - attackstring - ppreduce stockpile 0 attackanimation waitanimation @@ -4398,9 +3967,7 @@ BattleScript_StockpileStatChangeDown_Ret: BattleScript_EffectSpitUp:: attackcanceler jumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_SpitUpFailProtect - attackstring - ppreduce - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE damagecalc adjustdamage stockpiletobasedamage BattleScript_SpitUpFail @@ -4417,8 +3984,6 @@ BattleScript_SpitUpEnd: goto BattleScript_MoveEnd BattleScript_SpitUpFailProtect:: - attackstring - ppreduce pause B_WAIT_TIME_LONG stockpiletobasedamage BattleScript_SpitUpFail resultmessage @@ -4427,8 +3992,6 @@ BattleScript_SpitUpFailProtect:: BattleScript_EffectSwallow:: attackcanceler - attackstring - ppreduce stockpiletohpheal BattleScript_SwallowFail attackanimation waitanimation @@ -4449,16 +4012,12 @@ BattleScript_SwallowFail:: BattleScript_EffectHail:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_HAIL goto BattleScript_MoveWeatherChange BattleScript_EffectTorment:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects settorment BattleScript_ButItFailed @@ -4471,9 +4030,7 @@ BattleScript_EffectTorment:: BattleScript_EffectFlatter:: attackcanceler jumpifsubstituteblocks BattleScript_MakeMoveMissed - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE jumpifconfusedandstatmaxed STAT_SPATK, BattleScript_ButItFailed attackanimation waitanimation @@ -4495,8 +4052,6 @@ BattleScript_EffectDarkVoid:: .endif BattleScript_EffectNonVolatileStatus:: attackcanceler - attackstring - ppreduce trynonvolatilestatus accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE attackanimation @@ -4516,8 +4071,6 @@ BattleScript_AlreadyBurned:: BattleScript_EffectMemento:: attackcanceler jumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_MementoTargetProtect - attackstring - ppreduce trymemento BattleScript_ButItFailed setatkhptozero attackanimation @@ -4545,8 +4098,6 @@ BattleScript_EffectMementoPrintNoEffect: goto BattleScript_EffectMementoTryFaint @ If the target is protected there's no need to check the target's stats or animate, the user will just faint BattleScript_MementoTargetProtect: - attackstring - ppreduce trymemento BattleScript_MementoTargetProtectEnd BattleScript_MementoTargetProtectEnd: setatkhptozero @@ -4560,15 +4111,12 @@ BattleScript_MementoTargetProtectEnd: BattleScript_EffectFocusPunch:: attackcanceler jumpifnodamage BattleScript_HitFromAccCheck - ppreduce printstring STRINGID_PKMNLOSTFOCUS waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectFollowMe:: attackcanceler - attackstring - ppreduce .if B_UPDATED_MOVE_DATA >= GEN_8 jumpifnotbattletype BATTLE_TYPE_DOUBLE, BattleScript_ButItFailed .endif @@ -4579,19 +4127,8 @@ BattleScript_EffectFollowMe:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectNaturePower:: - attackcanceler - attackstring - pause B_WAIT_TIME_SHORT - callenvironmentattack - printstring STRINGID_NATUREPOWERTURNEDINTO - waitmessage B_WAIT_TIME_LONG - return - BattleScript_EffectCharge:: attackcanceler - attackstring - ppreduce setcharge BS_ATTACKER attackanimation waitanimation @@ -4609,8 +4146,6 @@ BattleScript_EffectChargeString: BattleScript_EffectTaunt:: attackcanceler - attackstring - ppreduce jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE settaunt BattleScript_ButItFailed @@ -4622,8 +4157,6 @@ BattleScript_EffectTaunt:: BattleScript_EffectHelpingHand:: attackcanceler - attackstring - ppreduce trysethelpinghand BattleScript_ButItFailed attackanimation waitanimation @@ -4633,8 +4166,6 @@ BattleScript_EffectHelpingHand:: BattleScript_EffectTrick:: attackcanceler - attackstring - ppreduce jumpifsubstituteblocks BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE tryswapitems BattleScript_ButItFailed @@ -4648,8 +4179,6 @@ BattleScript_EffectTrick:: BattleScript_EffectRolePlay:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON trycopyability BS_ATTACKER, BattleScript_ButItFailed attackanimation @@ -4664,25 +4193,13 @@ BattleScript_EffectRolePlay:: BattleScript_EffectWish:: attackcanceler - attackstring - ppreduce trywish BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd -BattleScript_EffectAssist:: - attackcanceler - attackstring - assistattackselect BattleScript_FailedFromPpReduce - attackanimation - waitanimation - jumptocalledmove TRUE - BattleScript_EffectIngrain:: attackcanceler - attackstring - ppreduce trysetvolatile BS_ATTACKER, VOLATILE_ROOT, BattleScript_ButItFailed attackanimation waitanimation @@ -4692,9 +4209,7 @@ BattleScript_EffectIngrain:: BattleScript_EffectMagicCoat:: attackcanceler - trysetmagiccoat BattleScript_FailedFromAtkString - attackstring - ppreduce + trysetmagiccoat BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_PKMNSHROUDEDITSELF @@ -4703,8 +4218,6 @@ BattleScript_EffectMagicCoat:: BattleScript_EffectRecycle:: attackcanceler - attackstring - ppreduce tryrecycleitem BattleScript_ButItFailed attackanimation waitanimation @@ -4714,9 +4227,7 @@ BattleScript_EffectRecycle:: BattleScript_EffectBrickBreak:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc removescreens critcalc @@ -4747,8 +4258,6 @@ BattleScript_BrickBreakDoHit:: BattleScript_EffectYawn:: attackcanceler - attackstring - ppreduce trynonvolatilestatus accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON setyawn BattleScript_ButItFailed @@ -4768,8 +4277,6 @@ BattleScript_PrintAbilityMadeIneffective:: BattleScript_EffectEndeavor:: attackcanceler - attackstring - ppreduce setdamagetohealthdifference BattleScript_ButItFailed accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE typecalc @@ -4780,8 +4287,6 @@ BattleScript_EffectEndeavor:: BattleScript_EffectSkillSwap:: attackcanceler - attackstring - ppreduce accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON tryswapabilities BattleScript_ButItFailed attackanimation @@ -4805,8 +4310,6 @@ BattleScript_EffectSkillSwap_AfterAbilityPopUp: BattleScript_EffectImprison:: attackcanceler - attackstring - ppreduce tryimprison BattleScript_ButItFailed attackanimation waitanimation @@ -4816,8 +4319,6 @@ BattleScript_EffectImprison:: BattleScript_EffectRefresh:: attackcanceler - attackstring - ppreduce curestatuswithmove BattleScript_ButItFailed attackanimation waitanimation @@ -4828,8 +4329,6 @@ BattleScript_EffectRefresh:: BattleScript_EffectGrudge:: attackcanceler - attackstring - ppreduce trysetvolatile BS_ATTACKER, VOLATILE_GRUDGE, BattleScript_ButItFailed attackanimation waitanimation @@ -4839,9 +4338,7 @@ BattleScript_EffectGrudge:: BattleScript_EffectSnatch:: attackcanceler - trysetsnatch BattleScript_FailedFromAtkString - attackstring - ppreduce + trysetsnatch BattleScript_ButItFailed attackanimation waitanimation pause B_WAIT_TIME_SHORT @@ -4857,8 +4354,6 @@ BattleScript_EffectStruggle:: BattleScript_EffectMudSport:: BattleScript_EffectWaterSport:: attackcanceler - attackstring - ppreduce settypebasedhalvers BattleScript_ButItFailed attackanimation waitanimation @@ -4868,8 +4363,6 @@ BattleScript_EffectWaterSport:: BattleScript_EffectTickle:: attackcanceler - attackstring - ppreduce jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_TickleDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_DEF, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_TickleDoMoveAnim:: @@ -4899,8 +4392,6 @@ BattleScript_CantLowerMultipleStats:: BattleScript_EffectCosmicPower:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_CosmicPowerDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_CosmicPowerDoMoveAnim:: @@ -4922,8 +4413,6 @@ BattleScript_CosmicPowerEnd:: BattleScript_EffectBulkUp:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_BulkUpDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats BattleScript_BulkUpDoMoveAnim:: @@ -4945,8 +4434,6 @@ BattleScript_BulkUpEnd:: BattleScript_EffectCalmMind:: attackcanceler - attackstring - ppreduce BattleScript_CalmMindTryToRaiseStats:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_CalmMindDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -4977,8 +4464,6 @@ BattleScript_CantRaiseMultipleStats:: BattleScript_EffectDragonDance:: attackcanceler - attackstring - ppreduce BattleScript_EffectDragonDanceFromStatUp:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_DragonDanceDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -5001,8 +4486,6 @@ BattleScript_DragonDanceEnd:: BattleScript_EffectCamouflage:: attackcanceler - attackstring - ppreduce settypetoenvironment BattleScript_ButItFailed attackanimation waitanimation @@ -6120,7 +5603,7 @@ BattleScript_SelectingMoveWithNoPP:: endselectionscript BattleScript_NoPPForMove:: - attackstring + printattackstring pause B_WAIT_TIME_SHORT printstring STRINGID_BUTNOPPLEFT waitmessage B_WAIT_TIME_LONG @@ -6354,31 +5837,21 @@ BattleScript_GrudgeTakesPp:: return BattleScript_MagicBounce:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNMOVEBOUNCEDABILITY waitmessage B_WAIT_TIME_LONG setmagiccoattarget - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING return BattleScript_MagicCoat:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT setmagiccoattarget printstring STRINGID_PKMNMOVEBOUNCED waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING return BattleScript_MagicCoatPrankster:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNMOVEBOUNCED waitmessage B_WAIT_TIME_LONG @@ -6388,13 +5861,10 @@ BattleScript_MagicCoatPrankster:: goto BattleScript_MoveEnd BattleScript_SnatchedMove:: - attackstring - ppreduce snatchsetbattlers playanimation BS_TARGET, B_ANIM_SNATCH_MOVE printstring STRINGID_PKMNSNATCHEDMOVE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_NO_PPDEDUCT | HITMARKER_ALLOW_NO_PP swapattackerwithtarget return @@ -6754,8 +6224,6 @@ BattleScript_MoveUsedIsParalyzed:: goto BattleScript_MoveEnd BattleScript_PowderMoveNoEffect:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_PowderMoveNoEffectPrint jumpifability BS_TARGET, ABILITY_OVERCOAT, BattleScript_PowderMoveNoEffectOvercoat @@ -6825,9 +6293,6 @@ BattleScript_MoveUsedIsConfusedRet:: return BattleScript_MoveUsedPowder:: - bicword gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED - attackstring - ppreduce pause B_WAIT_TIME_SHORT cancelmultiturnmoves volatileanimation BS_ATTACKER, VOLATILE_POWDER @@ -7440,11 +6905,7 @@ BattleScript_DesolateLandActivates:: end3 BattleScript_PrimalWeatherBlocksMove:: - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_ATTACKSTRING_PRINTED, BattleScript_MoveEnd @in case of multi-target moves, if move fails once, no point in printing the message twice - accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring pause B_WAIT_TIME_SHORT - ppreduce printfromtable gPrimalWeatherBlocksStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -7681,11 +7142,9 @@ BattleScript_BadDreams_HidePopUp: goto BattleScript_BadDreamsIncrement BattleScript_TookAttack:: - attackstring pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNSXTOOKATTACK waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_ATTACKSTRING_PRINTED return BattleScript_SturdyPreventsOHKO:: @@ -7704,10 +7163,7 @@ BattleScript_DampStopsExplosion:: moveendcase MOVEEND_CLEAR_BITS end -BattleScript_MoveHPDrain_PPLoss:: - ppreduce BattleScript_MoveHPDrain:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE @@ -7718,10 +7174,7 @@ BattleScript_MoveHPDrain:: setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd -BattleScript_MoveStatDrain_PPLoss:: - ppreduce BattleScript_MoveStatDrain:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont @@ -7736,10 +7189,7 @@ BattleScript_MoveStatDrain_Cont: clearsemiinvulnerablebit goto BattleScript_MoveEnd -BattleScript_MonMadeMoveUseless_PPLoss:: - ppreduce BattleScript_MonMadeMoveUseless:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYUSELESS @@ -7747,10 +7197,7 @@ BattleScript_MonMadeMoveUseless:: setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd -BattleScript_FlashFireBoost_PPLoss:: - ppreduce BattleScript_FlashFireBoost:: - attackstring pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printfromtable gFlashFireStringIds @@ -7803,8 +7250,6 @@ BattleScript_OwnTempoPrevents:: goto BattleScript_MoveEnd BattleScript_SoundproofProtected:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXBLOCKSY @@ -7817,8 +7262,6 @@ BattleScript_IceFaceNullsDamage:: return BattleScript_DazzlingProtected:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpScripting printstring STRINGID_POKEMONCANNOTUSEMOVE @@ -8179,7 +7622,6 @@ BattleScript_EffectBattleBondStatIncreaseRet: BattleScript_DancerActivates:: call BattleScript_AbilityPopUp waitmessage B_WAIT_TIME_SHORT - orword gHitMarker, HITMARKER_ALLOW_NO_PP jumptocalledmove TRUE BattleScript_SynchronizeActivates:: @@ -8222,8 +7664,7 @@ BattleScript_IgnoresWhileAsleep:: BattleScript_IgnoresAndUsesRandomMove:: printstring STRINGID_PKMNIGNOREDORDERS waitmessage B_WAIT_TIME_LONG - setbyte sMOVE_EFFECT, 0 - jumptocalledmove FALSE + return BattleScript_MoveUsedLoafingAround:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_LOAFING, BattleScript_MoveUsedLoafingAroundMsg @@ -8885,16 +8326,6 @@ BattleScript_ZMoveActivateStatus:: copybyte sSTATCHANGER, sSAVED_STAT_CHANGER return -BattleScript_ZMoveActivatePowder:: - flushtextbox - trytrainerslidezmovemsg - savetarget - printstring STRINGID_ZPOWERSURROUNDS - playanimation BS_ATTACKER, B_ANIM_ZMOVE_ACTIVATE, NULL - setzeffect - restoretarget - goto BattleScript_MoveUsedPowder - BattleScript_ZEffectPrintString:: printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG @@ -8927,8 +8358,6 @@ BattleScript_HealReplacementZMove:: BattleScript_EffectExtremeEvoboost:: attackcanceler - attackstring - ppreduce jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ExtremeEvoboostAnim @@ -8967,9 +8396,7 @@ BattleScript_ExtremeEvoboostEnd:: BattleScript_EffectHitSetTerrain:: attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE critcalc damagecalc adjustdamage @@ -8994,7 +8421,7 @@ BattleScript_TryFaint: BattleScript_EffectSteelRoller:: attackcanceler - jumpifhalfword CMP_NO_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_FailedFromAtkString + jumpifhalfword CMP_NO_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_ButItFailed goto BattleScript_HitFromAccCheck BattleScript_RemoveTerrain:: @@ -9109,8 +8536,6 @@ BattleScript_EjectPackActivates:: goto BattleScript_EjectPackActivate_Ret BattleScript_DoesntAffectTargetAtkString:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT printstring STRINGID_ITDOESNTAFFECT waitmessage B_WAIT_TIME_LONG @@ -9118,8 +8543,6 @@ BattleScript_DoesntAffectTargetAtkString:: goto BattleScript_MoveEnd BattleScript_WellBakedBodyActivates:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpTarget setmoveresultflags MOVE_RESULT_NO_EFFECT @@ -9128,8 +8551,6 @@ BattleScript_WellBakedBodyEnd: goto BattleScript_MoveEnd BattleScript_WindRiderActivatesMoveEnd:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpTarget setmoveresultflags MOVE_RESULT_NO_EFFECT @@ -9138,8 +8559,6 @@ BattleScript_WindRiderActivatesMoveEnd_End: goto BattleScript_MoveEnd BattleScript_GoodAsGoldActivates:: - attackstring - ppreduce call BattleScript_AbilityPopUpTarget pause B_WAIT_TIME_SHORT printstring STRINGID_ITDOESNTAFFECT @@ -9218,8 +8637,6 @@ BattleScript_TargetAbilityStatRaiseRet_End: BattleScript_EffectMaxMove:: attackcanceler accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - attackstring - ppreduce critcalc damagecalc adjustdamage @@ -9562,10 +8979,8 @@ BattleScript_DynamaxEnds_Ret:: return BattleScript_MoveBlockedByDynamax:: - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring + accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE pause B_WAIT_TIME_SHORT - ppreduce jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd printstring STRINGID_MOVEBLOCKEDBYDYNAMAX waitmessage B_WAIT_TIME_LONG @@ -9573,8 +8988,6 @@ BattleScript_MoveBlockedByDynamax:: goto BattleScript_MoveEnd BattleScript_PokemonCantUseTheMove:: - attackstring - ppreduce pause B_WAIT_TIME_SHORT printstring STRINGID_BUTPOKEMONCANTUSETHEMOVE waitmessage B_WAIT_TIME_LONG @@ -9635,8 +9048,6 @@ BattleScript_BoosterEnergyRet:: BattleScript_EffectSnow:: attackcanceler - attackstring - ppreduce call BattleScript_CheckPrimalWeather setfieldweather BATTLE_WEATHER_SNOW goto BattleScript_MoveWeatherChange @@ -9668,3 +9079,44 @@ BattleScript_ForfeitBattleGaveMoney:: .endif waitmessage B_WAIT_TIME_LONG end2 + +BattleScript_Attackstring:: + printattackstring + return + +BattleScript_SubmoveAttackstring:: + printattackstring + pause B_WAIT_TIME_LONG + attackanimation + waitanimation + setcalledmove + return + +BattleScript_SleepTalkAttackstring:: + printattackstring + pause B_WAIT_TIME_LONG + printstring STRINGID_PKMNFASTASLEEP + waitmessage B_WAIT_TIME_LONG + statusanimation BS_ATTACKER + attackanimation + waitanimation + setcalledmove + return + +BattleScript_MetronomeAttackstring:: + printattackstring + pause B_WAIT_TIME_LONG + attackanimation + waitanimation + setcalledmove + printstring STRINGID_WAGGLINGAFINGER + waitmessage B_WAIT_TIME_LONG + return + +BattleScript_NaturePowerAttackstring:: + printattackstring + pause B_WAIT_TIME_SHORT + printstring STRINGID_NATUREPOWERTURNEDINTO + waitmessage B_WAIT_TIME_LONG + setcalledmove + return diff --git a/docs/tutorials/how_to_new_move.md b/docs/tutorials/how_to_new_move.md index 442e2b28c9..0262ca3202 100644 --- a/docs/tutorials/how_to_new_move.md +++ b/docs/tutorials/how_to_new_move.md @@ -96,11 +96,11 @@ Each move's effect is governed by a script defined here. For a simple example, l ``` BattleScript_EffectFirstTurnOnly:: attackcanceler - jumpifnotfirstturn BattleScript_FailedFromAtkString + jumpifnotfirstturn BattleScript_ButItFailed goto BattleScript_EffectHit ``` -`attackcanceler` is a command that covers all the cases that could cause a move to fail before it's even attempted (e.g. paralysis). And as we can tell from the commands, if it's not the first turn, we go to `BattleScript_FailedFromAtkString` which evidently causes us to print the `attackstring` ("POKEMON used MOVE") then fail ("But it failed!"). Otherwise, we go to the generic "hit" effect which is the same script for moves that just deal damage and nothing else. +`attackcanceler` is a command that covers all the cases that could cause a move to fail before it's even attempted (e.g. paralysis). And as we can tell from the commands, if it's not the first turn, we go to `BattleScript_ButItFailed` which evidently causes us to print the `attackstring` ("POKEMON used MOVE") then fail ("But it failed!"). Otherwise, we go to the generic "hit" effect which is the same script for moves that just deal damage and nothing else. This is the most advanced part of the ROM. There are dozens upon dozens of commands and hundreds of scripts so this guide would go on forever if I were to go into more detail. To learn how these scripts work, it's best to look at a few examples of moves you know. diff --git a/include/battle.h b/include/battle.h index 6276a7098a..bf3cb78c47 100644 --- a/include/battle.h +++ b/include/battle.h @@ -151,11 +151,10 @@ struct ProtectStruct u32 unableToUseMove:1; // Not to be confused with HITMARKER_UNABLE_TO_USE_MOVE (It is questionable though if there is a difference. Needs further research) u32 notFirstStrike:1; u32 palaceUnableToUseMove:1; - u32 powderSelfDmg:1; u32 statRaised:1; u32 usedCustapBerry:1; // also quick claw u32 touchedProtectLike:1; - u32 unused:8; + u32 unused:9; // End of 32-bit bitfield u16 disableEjectPack:1; u16 tryEjectPack:1; @@ -666,7 +665,7 @@ struct BattleStruct u8 multipleSwitchInState:2; u8 multipleSwitchInCursor:3; u8 sleepClauseNotBlocked:1; - u8 padding1:1; + u8 isSkyBattle:1; u8 multipleSwitchInSortedBattlers[MAX_BATTLERS_COUNT]; void (*savedCallback)(void); u16 usedHeldItems[PARTY_SIZE][NUM_BATTLE_SIDES]; // For each party member and side. For harvest, recycle @@ -745,7 +744,6 @@ struct BattleStruct u8 bonusCritStages[MAX_BATTLERS_COUNT]; // G-Max Chi Strike boosts crit stages of allies. u8 itemPartyIndex[MAX_BATTLERS_COUNT]; u8 itemMoveIndex[MAX_BATTLERS_COUNT]; - u8 isSkyBattle:1; s32 aiDelayTimer; // Counts number of frames AI takes to choose an action. s32 aiDelayFrames; // Number of frames it took to choose an action. s32 aiDelayCycles; // Number of cycles it took to choose an action. @@ -780,7 +778,8 @@ struct BattleStruct u8 hazardsQueue[NUM_BATTLE_SIDES][HAZARDS_MAX_COUNT]; u8 numHazards[NUM_BATTLE_SIDES]; u8 hazardsCounter:4; // Counter for applying hazard on switch in - u8 padding2:4; + enum SubmoveState submoveAnnouncement:2; + u8 padding2:2; }; struct AiBattleData diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index df7163840f..d8f37a293a 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -64,7 +64,6 @@ bool32 IsShieldsDownProtected(u32 battler, u32 ability); u32 IsAbilityStatusProtected(u32 battler, u32 ability); bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); -u32 GetNaturePowerMove(u32 battler); void StealTargetItem(u8 battlerStealer, u8 battlerItem); u8 GetCatchingBattler(void); u32 GetHighestStatId(u32 battlerId); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 46326a42df..5a62556be3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -9,11 +9,10 @@ extern const u8 BattleScript_NotAffected[]; extern const u8 BattleScript_HitFromCritCalc[]; extern const u8 BattleScript_MoveEnd[]; extern const u8 BattleScript_MakeMoveMissed[]; -extern const u8 BattleScript_PrintMoveMissed[]; +extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissed[]; extern const u8 BattleScript_FlingFailConsumeItem[]; -extern const u8 BattleScript_FailedFromAtkString[]; extern const u8 BattleScript_FailedFromAtkCanceler[]; extern const u8 BattleScript_ButItFailed[]; extern const u8 BattleScript_StatUp[]; @@ -180,11 +179,8 @@ extern const u8 BattleScript_DroughtActivates[]; extern const u8 BattleScript_TookAttack[]; extern const u8 BattleScript_SturdyPreventsOHKO[]; extern const u8 BattleScript_DampStopsExplosion[]; -extern const u8 BattleScript_MoveHPDrain_PPLoss[]; extern const u8 BattleScript_MoveHPDrain[]; -extern const u8 BattleScript_MonMadeMoveUseless_PPLoss[]; extern const u8 BattleScript_MonMadeMoveUseless[]; -extern const u8 BattleScript_FlashFireBoost_PPLoss[]; extern const u8 BattleScript_FlashFireBoost[]; extern const u8 BattleScript_AbilityNoStatLoss[]; extern const u8 BattleScript_ItemNoStatLoss[]; @@ -279,7 +275,6 @@ extern const u8 BattleScript_WaterSportEnds[]; extern const u8 BattleScript_SturdiedMsg[]; extern const u8 BattleScript_GravityEnds[]; extern const u8 BattleScript_MoveStatDrain[]; -extern const u8 BattleScript_MoveStatDrain_PPLoss[]; extern const u8 BattleScript_TargetsStatWasMaxedOut[]; extern const u8 BattleScript_AttackerAbilityStatRaise[]; extern const u8 BattleScript_AttackerAbilityStatRaiseEnd3[]; @@ -328,7 +323,6 @@ extern const u8 BattleScript_ProteanActivates[]; extern const u8 BattleScript_DazzlingProtected[]; extern const u8 BattleScript_MoveUsedPsychicTerrainPrevents[]; extern const u8 BattleScript_MoveUsedPowder[]; -extern const u8 BattleScript_ZMoveActivatePowder[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeks[]; extern const u8 BattleScript_SelectingNotAllowedStuffCheeksInPalace[]; extern const u8 BattleScript_SelectingNotAllowedBelch[]; @@ -581,7 +575,6 @@ extern const u8 BattleScript_EffectAbsorb[]; extern const u8 BattleScript_EffectAbsorbLiquidOoze[]; extern const u8 BattleScript_EffectExplosion[]; extern const u8 BattleScript_EffectDreamEater[]; -extern const u8 BattleScript_EffectMirrorMove[]; extern const u8 BattleScript_EffectAttackUp[]; extern const u8 BattleScript_EffectDefenseUp[]; extern const u8 BattleScript_EffectSpeedUp[]; @@ -631,7 +624,6 @@ extern const u8 BattleScript_EffectTwoTurnsAttack[]; extern const u8 BattleScript_EffectSubstitute[]; extern const u8 BattleScript_EffectRage[]; extern const u8 BattleScript_EffectMimic[]; -extern const u8 BattleScript_EffectMetronome[]; extern const u8 BattleScript_EffectLeechSeed[]; extern const u8 BattleScript_EffectDoNothing[]; extern const u8 BattleScript_EffectHoldHands[]; @@ -645,7 +637,6 @@ extern const u8 BattleScript_EffectSnore[]; extern const u8 BattleScript_EffectConversion2[]; extern const u8 BattleScript_EffectLockOn[]; extern const u8 BattleScript_EffectSketch[]; -extern const u8 BattleScript_EffectSleepTalk[]; extern const u8 BattleScript_EffectDestinyBond[]; extern const u8 BattleScript_EffectSpite[]; extern const u8 BattleScript_EffectHealBell[]; @@ -700,14 +691,12 @@ extern const u8 BattleScript_EffectNonVolatileStatus[]; extern const u8 BattleScript_EffectMemento[]; extern const u8 BattleScript_EffectFocusPunch[]; extern const u8 BattleScript_EffectFollowMe[]; -extern const u8 BattleScript_EffectNaturePower[]; extern const u8 BattleScript_EffectCharge[]; extern const u8 BattleScript_EffectTaunt[]; extern const u8 BattleScript_EffectHelpingHand[]; extern const u8 BattleScript_EffectTrick[]; extern const u8 BattleScript_EffectRolePlay[]; extern const u8 BattleScript_EffectWish[]; -extern const u8 BattleScript_EffectAssist[]; extern const u8 BattleScript_EffectIngrain[]; extern const u8 BattleScript_EffectMagicCoat[]; extern const u8 BattleScript_EffectRecycle[]; @@ -768,7 +757,6 @@ extern const u8 BattleScript_EffectElectricTerrain[]; extern const u8 BattleScript_EffectPsychicTerrain[]; extern const u8 BattleScript_EffectAttackAccUp[]; extern const u8 BattleScript_EffectAttackSpAttackUp[]; -extern const u8 BattleScript_EffectMeFirst[]; extern const u8 BattleScript_EffectQuiverDance[]; extern const u8 BattleScript_EffectCoil[]; extern const u8 BattleScript_EffectElectrify[]; @@ -788,7 +776,6 @@ extern const u8 BattleScript_AbilityPreventsPhasingOutRet[]; extern const u8 BattleScript_PrintMonIsRootedRet[]; extern const u8 BattleScript_FinalGambit[]; extern const u8 BattleScript_EffectAutotomize[]; -extern const u8 BattleScript_EffectCopycat[]; extern const u8 BattleScript_EffectDefog[]; extern const u8 BattleScript_EffectHitEnemyHealAlly[]; extern const u8 BattleScript_EffectSynchronoise[]; @@ -865,5 +852,10 @@ extern const u8 BattleScript_FickleBeamDoubled[]; extern const u8 BattleScript_QuestionForfeitBattle[]; extern const u8 BattleScript_ForfeitBattleGaveMoney[]; extern const u8 BattleScript_AbilityPopUp[]; +extern const u8 BattleScript_Attackstring[]; +extern const u8 BattleScript_SubmoveAttackstring[]; +extern const u8 BattleScript_MetronomeAttackstring[]; +extern const u8 BattleScript_SleepTalkAttackstring[]; +extern const u8 BattleScript_NaturePowerAttackstring[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_util.h b/include/battle_util.h index 0c486f4a3a..1fe67a1cd6 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -110,20 +110,25 @@ enum MoveSuccessOrder CANCELLER_SKY_DROP, CANCELLER_RECHARGE, CANCELLER_ASLEEP_OR_FROZEN, + CANCELLER_POWER_POINTS, CANCELLER_OBEDIENCE, CANCELLER_TRUANT, CANCELLER_FLINCH, CANCELLER_DISABLED, - CANCELLER_VOLATILE_BLOCKED, + CANCELLER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop CANCELLER_TAUNTED, CANCELLER_IMPRISONED, CANCELLER_CONFUSED, CANCELLER_PARALYSED, CANCELLER_INFATUATION, CANCELLER_BIDE, + CANCELLER_Z_MOVES, + CANCELLER_CHOICE_LOCK, + CANCELLER_CALLSUBMOVE, CANCELLER_THAW, CANCELLER_STANCE_CHANGE_2, - CANCELLER_CHOICE_LOCK, + CANCELLER_ATTACKSTRING, + CANCELLER_PPDEDUCTION, CANCELLER_WEATHER_PRIMAL, CANCELLER_DYNAMAX_BLOCKED, CANCELLER_POWDER_STATUS, @@ -131,7 +136,6 @@ enum MoveSuccessOrder CANCELLER_PSYCHIC_TERRAIN, CANCELLER_EXPLODING_DAMP, CANCELLER_MULTIHIT_MOVES, - CANCELLER_Z_MOVES, CANCELLER_MULTI_TARGET_MOVES, CANCELLER_END, }; @@ -149,7 +153,8 @@ enum Obedience enum MoveCanceller { MOVE_STEP_SUCCESS, - MOVE_STEP_BREAK, + MOVE_STEP_BREAK, // Breaks out of the function to run a script + MOVE_STEP_FAILURE, // Same as break but breaks out of it due to move failure and jumps to script that handles the failure MOVE_STEP_REMOVES_STATUS, }; @@ -238,7 +243,6 @@ u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); enum MoveCanceller AtkCanceller_MoveSuccessOrder(void); -void SetAtkCancellerForCalledMove(void); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option); @@ -408,5 +412,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander); bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); +u32 GetNaturePowerMove(u32 battler); +u32 GetNaturePowerMove(u32 battler); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 858f2c8785..503caf406e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -237,9 +237,9 @@ enum SemiInvulnerableExclusion #define HITMARKER_DESTINYBOND (1 << 6) #define HITMARKER_NO_ANIMATIONS (1 << 7) // set from battleSceneOff. Never changed during battle #define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) -#define HITMARKER_NO_ATTACKSTRING (1 << 9) -#define HITMARKER_ATTACKSTRING_PRINTED (1 << 10) -#define HITMARKER_NO_PPDEDUCT (1 << 11) +#define HITMARKER_ATTACKSTRING_PRINTED (1 << 9) +#define HITMARKER_UNUSED_10 (1 << 10) +#define HITMARKER_UNUSED_11 (1 << 11) #define HITMARKER_UNUSED_12 (1 << 12) #define HITMARKER_STATUS_ABILITY_EFFECT (1 << 13) #define HITMARKER_UNUSED_14 (1 << 14) @@ -251,7 +251,7 @@ enum SemiInvulnerableExclusion #define HITMARKER_PASSIVE_HP_UPDATE (1 << 20) #define HITMARKER_UNUSED_21 (1 << 21) #define HITMARKER_PLAYER_FAINTED (1 << 22) -#define HITMARKER_ALLOW_NO_PP (1 << 23) +#define HITMARKER_UNUSED_23 (1 << 23) #define HITMARKER_GRUDGE (1 << 24) #define HITMARKER_OBEYS (1 << 25) #define HITMARKER_UNUSED_26 (1 << 26) @@ -679,4 +679,11 @@ enum __attribute__((packed)) CalcDamageState CHECK_ACCURACY, }; +enum SubmoveState +{ + SUBMOVE_NO_EFFECT, + SUBMOVE_SUCCESS, + SUBMOVE_FAILURE, +}; + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index b9313eba18..228d7c8571 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -226,7 +226,6 @@ enum StringID STRINGID_BUTNOTHINGHAPPENED, STRINGID_BUTITFAILED, STRINGID_ITHURTCONFUSION, - STRINGID_MIRRORMOVEFAILED, STRINGID_STARTEDTORAIN, STRINGID_DOWNPOURSTARTED, STRINGID_RAINCONTINUES, diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 04eba48677..3c1ff0039a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -870,10 +870,6 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u if (gBattleStruct->gimmick.usableGimmick[battlerAtk] && GetActiveGimmick(battlerAtk) == GIMMICK_NONE && gBattleStruct->gimmick.usableGimmick[battlerAtk] != GIMMICK_NONE && considerGimmickAtk == USE_GIMMICK) { - // Set Z-Move variables if needed - if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && IsViableZMove(battlerAtk, move)) - gBattleStruct->zmove.baseMoves[battlerAtk] = move; - toggledGimmickAtk = TRUE; SetActiveGimmick(battlerAtk, gBattleStruct->gimmick.usableGimmick[battlerAtk]); } @@ -973,7 +969,6 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u // Undo temporary settings gBattleStruct->dynamicMoveType = 0; gBattleStruct->swapDamageCategory = FALSE; - gBattleStruct->zmove.baseMoves[battlerAtk] = MOVE_NONE; if (toggledGimmickAtk) SetActiveGimmick(battlerAtk, GIMMICK_NONE); if (toggledGimmickDef) diff --git a/src/battle_main.c b/src/battle_main.c index 3c3b363e86..796582aedd 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3982,8 +3982,8 @@ void BattleTurnPassed(void) gBattleStruct->faintedActionsState = 0; TurnValuesCleanUp(FALSE); - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gHitMarker &= ~HITMARKER_PLAYER_FAINTED; gHitMarker &= ~HITMARKER_PASSIVE_HP_UPDATE; gBattleScripting.animTurn = 0; @@ -5378,7 +5378,7 @@ static void RunTurnActionsFunctions(void) { if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battler { - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; + gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; } } diff --git a/src/battle_message.c b/src/battle_message.c index 19738969dd..297cbc48c0 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -385,7 +385,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_BUTNOTHINGHAPPENED] = COMPOUND_STRING("But nothing happened!"), [STRINGID_BUTITFAILED] = COMPOUND_STRING("But it failed!"), [STRINGID_ITHURTCONFUSION] = COMPOUND_STRING("It hurt itself in its confusion!"), - [STRINGID_MIRRORMOVEFAILED] = COMPOUND_STRING("The Mirror Move failed!"), //not in gen 5+, uses "but it failed" [STRINGID_STARTEDTORAIN] = COMPOUND_STRING("It started to rain!"), [STRINGID_DOWNPOURSTARTED] = COMPOUND_STRING("A downpour started!"), // corresponds to DownpourText in pokegold and pokecrystal and is used by Rain Dance in GSC [STRINGID_RAINCONTINUES] = COMPOUND_STRING("Rain continues to fall."), //not in gen 5+ diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6845e760f4..dfbcbd0a5c 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -339,8 +339,8 @@ static bool32 CanAbilityShieldActivateForBattler(u32 battler); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); -static void Cmd_attackstring(void); -static void Cmd_ppreduce(void); +static void Cmd_printattackstring(void); +static void Cmd_unused0x3(void); static void Cmd_critcalc(void); static void Cmd_damagecalc(void); static void Cmd_typecalc(void); @@ -461,7 +461,7 @@ static void Cmd_tryexplosion(void); static void Cmd_setatkhptozero(void); static void Cmd_jumpifnexttargetvalid(void); static void Cmd_tryhealhalfhealth(void); -static void Cmd_trymirrormove(void); +static void Cmd_unused_0x7e(void); static void Cmd_setfieldweather(void); static void Cmd_setreflect(void); static void Cmd_setseeded(void); @@ -495,7 +495,7 @@ static void Cmd_setfocusenergy(void); static void Cmd_transformdataexecution(void); static void Cmd_setsubstitute(void); static void Cmd_mimicattackcopy(void); -static void Cmd_metronome(void); +static void Cmd_setcalledmove(void); static void Cmd_unused_0x9f(void); static void Cmd_unused_0xA0(void); static void Cmd_counterdamagecalculator(void); @@ -506,7 +506,7 @@ static void Cmd_painsplitdmgcalc(void); static void Cmd_settypetorandomresistance(void); static void Cmd_setalwayshitflag(void); static void Cmd_copymovepermanently(void); -static void Cmd_trychoosesleeptalkmove(void); +static void Cmd_unused_0xA9(void); static void Cmd_trysetdestinybond(void); static void Cmd_trysetdestinybondtohappen(void); static void Cmd_settailwind(void); @@ -541,7 +541,7 @@ static void Cmd_unused_c8(void); static void Cmd_trymemento(void); static void Cmd_setforcedtarget(void); static void Cmd_setcharge(void); -static void Cmd_callenvironmentattack(void); +static void Cmd_unused_0xCC(void); static void Cmd_curestatuswithmove(void); static void Cmd_settorment(void); static void Cmd_jumpifnodamage(void); @@ -559,7 +559,7 @@ static void Cmd_tryswapabilities(void); static void Cmd_tryimprison(void); static void Cmd_setstealthrock(void); static void Cmd_trysetvolatile(void); -static void Cmd_assistattackselect(void); +static void Cmd_unused_0xde(void); static void Cmd_trysetmagiccoat(void); static void Cmd_trysetsnatch(void); static void Cmd_unused2(void); @@ -598,8 +598,8 @@ void (*const gBattleScriptingCommandsTable[])(void) = { Cmd_attackcanceler, //0x0 Cmd_accuracycheck, //0x1 - Cmd_attackstring, //0x2 - Cmd_ppreduce, //0x3 + Cmd_printattackstring, //0x2 + Cmd_unused0x3, //0x3 Cmd_critcalc, //0x4 Cmd_damagecalc, //0x5 Cmd_typecalc, //0x6 @@ -720,7 +720,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setatkhptozero, //0x79 Cmd_jumpifnexttargetvalid, //0x7A Cmd_tryhealhalfhealth, //0x7B - Cmd_trymirrormove, //0x7C + Cmd_unused_0x7e, //0x7C Cmd_setfieldweather, //0x7D Cmd_setreflect, //0x7E Cmd_setseeded, //0x7F @@ -754,7 +754,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_transformdataexecution, //0x9B Cmd_setsubstitute, //0x9C Cmd_mimicattackcopy, //0x9D - Cmd_metronome, //0x9E + Cmd_setcalledmove, //0x9E Cmd_unused_0x9f, //0x9F Cmd_unused_0xA0, //0xA0 Cmd_counterdamagecalculator, //0xA1 @@ -765,7 +765,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_settypetorandomresistance, //0xA6 Cmd_setalwayshitflag, //0xA7 Cmd_copymovepermanently, //0xA8 - Cmd_trychoosesleeptalkmove, //0xA9 + Cmd_unused_0xA9, //0xA9 Cmd_trysetdestinybond, //0xAA Cmd_trysetdestinybondtohappen, //0xAB Cmd_settailwind, //0xAC @@ -800,7 +800,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_trymemento, //0xC9 Cmd_setforcedtarget, //0xCA Cmd_setcharge, //0xCB - Cmd_callenvironmentattack, //0xCC + Cmd_unused_0xCC, //0xCC Cmd_curestatuswithmove, //0xCD Cmd_settorment, //0xCE Cmd_jumpifnodamage, //0xCF @@ -818,7 +818,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_tryimprison, //0xDB Cmd_setstealthrock, //0xDC Cmd_trysetvolatile, //0xDD - Cmd_assistattackselect, //0xDE + Cmd_unused_0xde, //0xDE Cmd_trysetmagiccoat, //0xDF Cmd_trysetsnatch, //0xE0 Cmd_unused2, //0xE1 @@ -1107,13 +1107,13 @@ static void Cmd_attackcanceler(void) if (!IsBattlerAlive(gBattlerAttacker) && effect != EFFECT_EXPLOSION - && effect != EFFECT_MISTY_EXPLOSION - && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + && effect != EFFECT_MISTY_EXPLOSION) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } + if (AtkCanceller_MoveSuccessOrder() != MOVE_STEP_SUCCESS) return; @@ -1129,7 +1129,6 @@ static void Cmd_attackcanceler(void) return; } - u32 abilityDef = GetBattlerAbility(gBattlerTarget); if (CanAbilityBlockMove( gBattlerAttacker, @@ -1155,17 +1154,6 @@ static void Cmd_attackcanceler(void) if (IsMovePowderBlocked(gBattlerAttacker, gBattlerTarget, gCurrentMove)) return; - if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE - && !(gHitMarker & (HITMARKER_ALLOW_NO_PP | HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT)) - && !(gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) - { - gBattlescriptCurrInstr = BattleScript_NoPPForMove; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - return; - } - - gHitMarker &= ~HITMARKER_ALLOW_NO_PP; - // Check if no available target present on the field or if Sky Battles ban the move if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) @@ -1176,7 +1164,7 @@ static void Cmd_attackcanceler(void) if (effect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. gBattlescriptCurrInstr = BattleScript_FlingFailConsumeItem; else - gBattlescriptCurrInstr = BattleScript_FailedFromAtkString; + gBattlescriptCurrInstr = BattleScript_ButItFailed; if (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); @@ -1192,7 +1180,6 @@ static void Cmd_attackcanceler(void) // Edge case for bouncing a powder move against a grass type pokemon. ClearDamageCalcResults(); - SetAtkCancellerForCalledMove(); gEffectBattler = gBattlerTarget; if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker, TRUE)) { @@ -1226,7 +1213,6 @@ static void Cmd_attackcanceler(void) if (gBattleStruct->bouncedMoveIsUsed) { ClearDamageCalcResults(); - SetAtkCancellerForCalledMove(); // Edge case for bouncing a powder move against a grass type pokemon. BattleScriptCall(BattleScript_MagicBounce); gBattlerAbility = battler; return; @@ -1489,76 +1475,20 @@ static void Cmd_accuracycheck(void) AccuracyCheck(FALSE, cmd->nextInstr, cmd->failInstr, cmd->move); } -static void Cmd_attackstring(void) +static void Cmd_printattackstring(void) { CMD_ARGS(); if (gBattleControllerExecFlags) return; - if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED))) - { - PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; - } - gBattlescriptCurrInstr = cmd->nextInstr; + PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); gBattleCommunication[MSG_DISPLAY] = 0; + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_ppreduce(void) +static void Cmd_unused0x3(void) { - CMD_ARGS(); - - s32 i, ppToDeduct = 1; - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - - if (gBattleControllerExecFlags) - return; - - if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - - if (moveTarget == MOVE_TARGET_BOTH - || moveTarget == MOVE_TARGET_FOES_AND_ALLY - || moveTarget == MOVE_TARGET_ALL_BATTLERS - || MoveForcesPressure(gCurrentMove)) - { - for (i = 0; i < gBattlersCount; i++) - { - if (!IsBattlerAlly(i, gBattlerAttacker) && IsBattlerAlive(i)) - ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); - } - } - else if (moveTarget != MOVE_TARGET_OPPONENTS_FIELD) - { - if (gBattlerAttacker != gBattlerTarget && GetBattlerAbility(gBattlerTarget) == ABILITY_PRESSURE) - ppToDeduct++; - } - - if (!(gHitMarker & (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING)) && gBattleMons[gBattlerAttacker].pp[gCurrMovePos]) - { - gProtectStructs[gBattlerAttacker].notFirstStrike = TRUE; - - // For item Metronome, echoed voice - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || WasUnableToUseMove(gBattlerAttacker)) - gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; - - if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] > ppToDeduct) - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] -= ppToDeduct; - else - gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0; - - if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos)) - { - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, - sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]), - &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); - MarkBattlerForControllerExec(gBattlerAttacker); - } - } - - gHitMarker &= ~HITMARKER_NO_PPDEDUCT; - gBattlescriptCurrInstr = cmd->nextInstr; } // The chance is 1/N for each stage. @@ -6354,11 +6284,9 @@ static void Cmd_moveend(void) && IsDoubleBattle() && !gProtectStructs[gBattlerAttacker].chargingTurn && (moveTarget == MOVE_TARGET_BOTH - || moveTarget == MOVE_TARGET_FOES_AND_ALLY) - && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) + || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) { u32 nextTarget = GetNextTarget(moveTarget, FALSE); - gHitMarker |= HITMARKER_NO_PPDEDUCT; if (nextTarget != MAX_BATTLERS_COUNT) { @@ -6367,8 +6295,11 @@ static void Cmd_moveend(void) MoveValuesCleanUp(); gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; - if (moveEffect == EFFECT_EXPLOSION || moveEffect == EFFECT_MISTY_EXPLOSION // Edge case for Explosion not changing targets - || moveEffect == EFFECT_SYNCHRONOISE) // So we don't go back to the Synchronoise script + // Edge cases for moves that shouldn't repeat their own script + if (moveEffect == EFFECT_EXPLOSION + || moveEffect == EFFECT_MISTY_EXPLOSION + || moveEffect == EFFECT_MAGNITUDE + || moveEffect == EFFECT_SYNCHRONOISE) BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); else BattleScriptPush(GetMoveBattleScript(gCurrentMove)); @@ -6398,9 +6329,6 @@ static void Cmd_moveend(void) return; } } - - gHitMarker |= HITMARKER_NO_ATTACKSTRING; - gHitMarker &= ~HITMARKER_NO_PPDEDUCT; } RecordLastUsedMoveBy(gBattlerAttacker, gCurrentMove); gBattleScripting.moveendState++; @@ -6445,7 +6373,6 @@ static void Cmd_moveend(void) if (gSpecialStatuses[gBattlerAttacker].parentalBondState) gSpecialStatuses[gBattlerAttacker].parentalBondState--; - gHitMarker |= (HITMARKER_NO_PPDEDUCT | HITMARKER_NO_ATTACKSTRING); gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; @@ -6879,7 +6806,6 @@ static void Cmd_moveend(void) gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_NONE; - gBattleStruct->isAtkCancelerForCalledMove = FALSE; gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->categoryOverride = FALSE; gBattleStruct->additionalEffectsCounter = 0; @@ -8422,7 +8348,7 @@ static void ResetValuesForCalledMove(void) if (gBattlerByTurnOrder[gCurrentTurnActionNumber] != gBattlerAttacker) gBattleStruct->atkCancellerTracker = 0; else - SetAtkCancellerForCalledMove(); + gBattleStruct->atkCancellerTracker = CANCELLER_VOLATILE_BLOCKED; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); @@ -9627,59 +9553,8 @@ static void Cmd_tryhealhalfhealth(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void SetMoveForMirrorMove(u32 move) +static void Cmd_unused_0x7e(void) { - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - // Edge case, we used Z Mirror Move, got the stat boost and now need to use the Z-move - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; - gCurrentMove = GetTypeBasedZMove(move); - } - else - { - gCurrentMove = move; - } - - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - ResetValuesForCalledMove(); - gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); -} - -static void Cmd_trymirrormove(void) -{ - CMD_ARGS(); - - s32 i, validMovesCount; - u16 move; - u16 validMoves[MAX_BATTLERS_COUNT] = {0}; - - for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) - { - if (i != gBattlerAttacker) - { - move = gBattleStruct->lastTakenMoveFrom[gBattlerAttacker][i]; - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) - { - validMoves[validMovesCount] = move; - validMovesCount++; - } - } - } - - move = gBattleStruct->lastTakenMove[gBattlerAttacker]; - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) - { - SetMoveForMirrorMove(move); - } - else if (validMovesCount != 0) - { - SetMoveForMirrorMove(validMoves[Random() % validMovesCount]); - } - else // no valid moves found - { - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void Cmd_setfieldweather(void) @@ -11255,41 +11130,11 @@ static void Cmd_mimicattackcopy(void) } } -static bool32 InvalidMetronomeMove(u32 move) -{ - return GetMoveEffect(move) == EFFECT_PLACEHOLDER - || IsMoveMetronomeBanned(move); -} - -static void Cmd_metronome(void) +static void Cmd_setcalledmove(void) { CMD_ARGS(); - -#if B_METRONOME_MOVES >= GEN_9 - u32 moveCount = MOVES_COUNT_GEN9; -#elif B_METRONOME_MOVES >= GEN_8 - u32 moveCount = MOVES_COUNT_GEN8; -#elif B_METRONOME_MOVES >= GEN_7 - u32 moveCount = MOVES_COUNT_GEN7; -#elif B_METRONOME_MOVES >= GEN_6 - u32 moveCount = MOVES_COUNT_GEN6; -#elif B_METRONOME_MOVES >= GEN_5 - u32 moveCount = MOVES_COUNT_GEN5; -#elif B_METRONOME_MOVES >= GEN_4 - u32 moveCount = MOVES_COUNT_GEN4; -#elif B_METRONOME_MOVES >= GEN_3 - u32 moveCount = MOVES_COUNT_GEN3; -#elif B_METRONOME_MOVES >= GEN_2 - u32 moveCount = MOVES_COUNT_GEN2; -#else - u32 moveCount = MOVES_COUNT_GEN1; -#endif - - gCurrentMove = RandomUniformExcept(RNG_METRONOME, 1, moveCount - 1, InvalidMetronomeMove); - PrepareStringBattle(STRINGID_WAGGLINGAFINGER, gBattlerAttacker); - gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - ResetValuesForCalledMove(); + gCurrentMove = gCalledMove; + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_unused_0x9f(void) @@ -11635,49 +11480,8 @@ static void Cmd_copymovepermanently(void) } } -static void Cmd_trychoosesleeptalkmove(void) +static void Cmd_unused_0xA9(void) { - CMD_ARGS(const u8 *failInstr); - - u32 i, unusableMovesBits = 0, movePosition; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (IsMoveSleepTalkBanned(gBattleMons[gBattlerAttacker].moves[i]) - || gBattleMoveEffects[GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i])].twoTurnEffect) - { - unusableMovesBits |= (1 << (i)); - } - } - - unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP | MOVE_LIMITATION_CHOICE_ITEM)); - if (unusableMovesBits == ALL_MOVES_MASK) // all 4 moves cannot be chosen - { - gBattlescriptCurrInstr = cmd->nextInstr; - } - else // at least one move can be chosen - { - // Set Sleep Talk as used move, so it works with Last Resort. - gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; - do - { - movePosition = MOD(Random(), MAX_MON_MOVES); - } while ((1u << movePosition) & unusableMovesBits); - - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gBattleMons[gBattlerAttacker].moves[movePosition])) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = gBattleMons[gBattlerAttacker].moves[movePosition]; - gCalledMove = GetTypeBasedZMove(gBattleMons[gBattlerAttacker].moves[movePosition]); - } - else - { - gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition]; - } - gCurrMovePos = movePosition; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->failInstr; - } } static inline bool32 IsDanamaxMonPresent(void) @@ -12629,39 +12433,8 @@ static void Cmd_setcharge(void) gBattlescriptCurrInstr = cmd->nextInstr; } -// Nature Power -static void Cmd_callenvironmentattack(void) +static void Cmd_unused_0xCC(void) { - CMD_ARGS(); - - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gCurrentMove = GetNaturePowerMove(gBattlerAttacker); - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); - BattleScriptPush(GetMoveBattleScript(gCurrentMove)); - gBattlescriptCurrInstr = cmd->nextInstr; -} - -u32 GetNaturePowerMove(u32 battler) -{ - u32 move = gBattleEnvironmentInfo[gBattleEnvironment].naturePower; - if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) - move = MOVE_MOONBLAST; - else if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) - move = MOVE_THUNDERBOLT; - else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) - move = MOVE_ENERGY_BALL; - else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) - move = MOVE_PSYCHIC; - else if (gBattleEnvironmentInfo[gBattleEnvironment].naturePower == MOVE_NONE) - move = MOVE_TRI_ATTACK; - - if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; - move = GetTypeBasedZMove(move); - } - - return move; } static void Cmd_curestatuswithmove(void) @@ -13192,53 +12965,8 @@ static void Cmd_trysetvolatile(void) } } -static void Cmd_assistattackselect(void) +static void Cmd_unused_0xde(void) { - CMD_ARGS(const u8 *failInstr); - - s32 chooseableMovesNo = 0; - struct Pokemon *party; - s32 monId, moveId; - u16 *validMoves = Alloc(sizeof(u16) * PARTY_SIZE * MAX_MON_MOVES); - - if (validMoves != NULL) - { - party = GetBattlerParty(gBattlerAttacker); - - for (monId = 0; monId < PARTY_SIZE; monId++) - { - if (monId == gBattlerPartyIndexes[gBattlerAttacker]) - continue; - if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) - continue; - if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) - continue; - - for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) - { - u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); - - if (IsMoveAssistBanned(move)) - continue; - - validMoves[chooseableMovesNo++] = move; - } - } - } - - if (chooseableMovesNo) - { - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gCalledMove = validMoves[Random() % chooseableMovesNo]; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } - - TRY_FREE_AND_SET_NULL(validMoves); } static void Cmd_trysetmagiccoat(void) @@ -15362,9 +15090,6 @@ void BS_SetPledge(void) if (gBattleStruct->pledgeMove && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)) { - PrepareStringBattle(STRINGID_USEDMOVE, gBattlerAttacker); - gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; - if ((gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_WATER_PLEDGE) || (gCurrentMove == MOVE_WATER_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE)) { @@ -15531,36 +15256,6 @@ void BS_TryHealPulse(void) } } -void BS_TryCopycat(void) -{ - NATIVE_ARGS(const u8 *failInstr); - - if (gLastUsedMove == MOVE_NONE || gLastUsedMove == MOVE_UNAVAILABLE || IsMoveCopycatBanned(gLastUsedMove) || IsZMove(gLastUsedMove)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(gLastUsedMove)) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = gLastUsedMove; - gCalledMove = GetTypeBasedZMove(gLastUsedMove); - } - else if (IsMaxMove(gLastUsedMove)) - { - gCalledMove = gBattleStruct->dynamax.lastUsedBaseMove; - } - else - { - gCalledMove = gLastUsedMove; - } - - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - void BS_TryDefog(void) { NATIVE_ARGS(u8 clear, const u8 *failInstr); @@ -17433,32 +17128,6 @@ void BS_InvertStatStages(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryMeFirst(void) -{ - NATIVE_ARGS(const u8 *failInstr); - u16 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; - if (IsBattleMoveStatus(move) || IsMoveMeFirstBanned(move) - || GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) - { - gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; - gCalledMove = GetTypeBasedZMove(move); - } - else - { - gCalledMove = move; - } - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - void BS_TryElectrify(void) { NATIVE_ARGS(const u8 *failInstr); @@ -17571,7 +17240,6 @@ void BS_TryInstruct(void) else { gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index 61616f502e..984d9e2699 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2,6 +2,7 @@ #include "battle.h" #include "battle_anim.h" #include "battle_arena.h" +#include "battle_environment.h" #include "battle_pyramid.h" #include "battle_util.h" #include "battle_controllers.h" @@ -69,6 +70,14 @@ static bool32 IsAnyTargetAffected(u32 battlerAtk); static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum FunctionCallOption option); static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option); +// Submoves +static u32 GetMirrorMoveMove(void); +static u32 GetMetronomeMove(void); +static u32 GetAssistMove(void); +static u32 GetSleepTalkMove(void); +static u32 GetCopyCatMove(void); +static u32 GetMeFirstMove(void); + ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent); ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent); @@ -410,7 +419,6 @@ void HandleAction_UseMove(void) { gProtectStructs[gBattlerAttacker].noValidMoves = FALSE; gCurrentMove = gChosenMove = MOVE_STRUGGLE; - gHitMarker |= HITMARKER_NO_PPDEDUCT; gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); } else if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns || gBattleMons[gBattlerAttacker].volatiles.recharge) @@ -880,9 +888,8 @@ void HandleAction_NothingIsFainted(void) gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; gHitMarker &= ~(HITMARKER_DESTINYBOND - | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT + | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_OBEYS); @@ -899,7 +906,6 @@ void HandleAction_ActionFinished(void) gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_NO_PPDEDUCT | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_OBEYS @@ -1152,7 +1158,6 @@ bool32 WasUnableToUseMove(u32 battler) { if (gProtectStructs[battler].nonVolatileStatusImmobility || gProtectStructs[battler].unableToUseMove - || gProtectStructs[battler].powderSelfDmg || gProtectStructs[battler].confusionSelfDmg) return TRUE; return FALSE; @@ -1898,12 +1903,6 @@ static inline bool32 TryActivatePowderStatus(u32 move) return FALSE; } -void SetAtkCancellerForCalledMove(void) -{ - gBattleStruct->atkCancellerTracker = CANCELLER_VOLATILE_BLOCKED; - gBattleStruct->isAtkCancelerForCalledMove = TRUE; -} - static enum MoveCanceller CancellerFlags(void) { gBattleMons[gBattlerAttacker].volatiles.destinyBond = FALSE; @@ -1914,7 +1913,7 @@ static enum MoveCanceller CancellerFlags(void) static enum MoveCanceller CancellerStanceChangeOne(void) { - if (B_STANCE_CHANGE_FAIL < GEN_7 && TryFormChangeBeforeMove()) + if (B_STANCE_CHANGE_FAIL < GEN_7 && gChosenMove == gCurrentMove && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } @@ -1926,7 +1925,7 @@ static enum MoveCanceller CancellerSkyDrop(void) { gBattlescriptCurrInstr = BattleScript_MoveEnd; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -1940,7 +1939,7 @@ static enum MoveCanceller CancellerRecharge(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -1996,7 +1995,7 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) { gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; - gHitMarker |= (HITMARKER_NO_ATTACKSTRING | HITMARKER_UNABLE_TO_USE_MOVE); + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } else // unfreeze { @@ -2004,29 +2003,28 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } - return MOVE_STEP_REMOVES_STATUS; + return MOVE_STEP_REMOVES_STATUS; // Move failure but also removes status } return MOVE_STEP_SUCCESS; } static enum MoveCanceller CancellerObedience(void) { - enum Obedience obedienceResult = GetAttackerObedienceForAction(); - if (!(gHitMarker & HITMARKER_NO_PPDEDUCT) // Don't check obedience after first hit of multi target move or multi hit moves - && !gBattleMons[gBattlerAttacker].volatiles.multipleTurns) + if (!gBattleMons[gBattlerAttacker].volatiles.multipleTurns) { + enum Obedience obedienceResult = GetAttackerObedienceForAction(); switch (obedienceResult) { case OBEYS: gHitMarker |= HITMARKER_OBEYS; - break; + return MOVE_STEP_SUCCESS; case DISOBEYS_LOAFS: // Randomly select, then print a disobedient string // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE gBattleCommunication[MULTISTRING_CHOOSER] = MOD(Random(), NUM_LOAF_STRINGS); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - break; + return MOVE_STEP_FAILURE; case DISOBEYS_HITS_SELF: gBattlerTarget = gBattlerAttacker; struct DamageContext ctx; @@ -2041,31 +2039,45 @@ static enum MoveCanceller CancellerObedience(void) gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker |= HITMARKER_OBEYS; - break; + return MOVE_STEP_FAILURE; // Move doesn't fail but mon hits itself case DISOBEYS_FALL_ASLEEP: if (IsSleepClauseEnabled()) gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + return MOVE_STEP_FAILURE; break; case DISOBEYS_WHILE_ASLEEP: gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - break; + return MOVE_STEP_FAILURE; case DISOBEYS_RANDOM_MOVE: - gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - SetAtkCancellerForCalledMove(); - gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; + gCurrentMove = gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; + BattleScriptCall(BattleScript_IgnoresAndUsesRandomMove); gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gHitMarker |= HITMARKER_OBEYS; - break; + return MOVE_STEP_BREAK; } - return MOVE_STEP_BREAK; } gHitMarker |= HITMARKER_OBEYS; return MOVE_STEP_SUCCESS; } +static enum MoveCanceller CancellerPowerPoints(void) +{ + if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] == 0 + && gCurrentMove != MOVE_STRUGGLE + && !gSpecialStatuses[gBattlerAttacker].dancerUsedMove + && !gBattleMons[gBattlerAttacker].volatiles.multipleTurns) + { + gBattlescriptCurrInstr = BattleScript_NoPPForMove; + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + return MOVE_STEP_FAILURE; + } + + return MOVE_STEP_SUCCESS; +} + static enum MoveCanceller CancellerTruant(void) { if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) @@ -2076,7 +2088,7 @@ static enum MoveCanceller CancellerTruant(void) gBattlerAbility = gBattlerAttacker; gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2089,7 +2101,7 @@ static enum MoveCanceller CancellerFlinch(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2103,7 +2115,7 @@ static enum MoveCanceller CancellerDisabled(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2117,7 +2129,7 @@ static enum MoveCanceller CancellerVolatileBlocked(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } else if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) { @@ -2126,7 +2138,7 @@ static enum MoveCanceller CancellerVolatileBlocked(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer > gBattleTurnCounter && IsSoundMove(gCurrentMove)) { @@ -2134,7 +2146,7 @@ static enum MoveCanceller CancellerVolatileBlocked(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2160,16 +2172,13 @@ static enum MoveCanceller CancellerImprisoned(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } static enum MoveCanceller CancellerConfused(void) { - if (gBattleStruct->isAtkCancelerForCalledMove) - return MOVE_STEP_SUCCESS; - if (gBattleMons[gBattlerAttacker].volatiles.confusionTurns) { if (!gBattleMons[gBattlerAttacker].volatiles.infiniteConfusion) @@ -2211,8 +2220,7 @@ static enum MoveCanceller CancellerConfused(void) static enum MoveCanceller CancellerParalysed(void) { - if (!gBattleStruct->isAtkCancelerForCalledMove - && (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) && !RandomPercentage(RNG_PARALYSIS, 75)) { @@ -2221,19 +2229,20 @@ static enum MoveCanceller CancellerParalysed(void) //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } static enum MoveCanceller CancellerInfatuation(void) { - if (!gBattleStruct->isAtkCancelerForCalledMove && gBattleMons[gBattlerAttacker].volatiles.infatuation) + if (gBattleMons[gBattlerAttacker].volatiles.infatuation) { gBattleScripting.battler = gBattleMons[gBattlerAttacker].volatiles.infatuation - 1; if (!RandomPercentage(RNG_INFATUATION, 50)) { BattleScriptCall(BattleScript_MoveUsedIsInLove); + return MOVE_STEP_BREAK; } else { @@ -2242,8 +2251,8 @@ static enum MoveCanceller CancellerInfatuation(void) gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; + return MOVE_STEP_FAILURE; } - return MOVE_STEP_BREAK; } return MOVE_STEP_SUCCESS; } @@ -2267,17 +2276,122 @@ static enum MoveCanceller CancellerBide(void) if (gAbsentBattlerFlags & (1u << gBattlerTarget)) gBattlerTarget = GetBattleMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); gBattlescriptCurrInstr = BattleScript_BideAttack; + return MOVE_STEP_BREAK; // Jumps to a different script but no failure } else { gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; + return MOVE_STEP_FAILURE; } } + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceller CancellerZMoves(void) +{ + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) + { + // attacker has a queued z move + RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL); + SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); + + gBattleScripting.battler = gBattlerAttacker; + if (GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) + BattleScriptCall(BattleScript_ZMoveActivateStatus); + else + BattleScriptCall(BattleScript_ZMoveActivateDamaging); + return MOVE_STEP_BREAK; } return MOVE_STEP_SUCCESS; } +static enum MoveCanceller CancellerChoiceLock(void) +{ + u16 *choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + + if (gChosenMove != MOVE_STRUGGLE + && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) + && (IsHoldEffectChoice(holdEffect) || GetBattlerAbility(gBattlerAttacker) == ABILITY_GORILLA_TACTICS)) + *choicedMoveAtk = gChosenMove; + + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (gBattleMons[gBattlerAttacker].moves[moveIndex] == *choicedMoveAtk) + break; + } + + if (moveIndex == MAX_MON_MOVES) + *choicedMoveAtk = MOVE_NONE; + + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceller CancellerCallSubmove(void) +{ + u32 noEffect = FALSE; + u32 calledMove = MOVE_NONE; + u32 effect = GetMoveEffect(gCurrentMove); + const u8 *battleScript = NULL; + battleScript = BattleScript_SubmoveAttackstring; + + switch(effect) + { + case EFFECT_MIRROR_MOVE: + calledMove = GetMirrorMoveMove(); + break; + case EFFECT_METRONOME: + calledMove = GetMetronomeMove(); + battleScript = BattleScript_MetronomeAttackstring; + break; + case EFFECT_ASSIST: + calledMove = GetAssistMove(); + break; + case EFFECT_NATURE_POWER: + calledMove = GetNaturePowerMove(gBattlerAttacker); + battleScript = BattleScript_NaturePowerAttackstring; + break; + case EFFECT_SLEEP_TALK: + calledMove = GetSleepTalkMove(); + battleScript = BattleScript_SleepTalkAttackstring; + break; + case EFFECT_COPYCAT: + calledMove = GetCopyCatMove(); + break; + case EFFECT_ME_FIRST: + calledMove = GetMeFirstMove(); + break; + default: + noEffect = TRUE; + break; + } + + if (noEffect) + { + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + return MOVE_STEP_SUCCESS; + } + + if (calledMove != MOVE_NONE) + { + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(calledMove)) + calledMove = GetTypeBasedZMove(calledMove); + if (effect == EFFECT_COPYCAT && IsMaxMove(calledMove)) + calledMove = gBattleStruct->dynamax.lastUsedBaseMove; + + gBattleStruct->submoveAnnouncement = SUBMOVE_SUCCESS; + gCalledMove = calledMove; + BattleScriptCall(battleScript); + return MOVE_STEP_BREAK; + } + + gBattleStruct->submoveAnnouncement = SUBMOVE_FAILURE; + return MOVE_STEP_SUCCESS; +} + static enum MoveCanceller CancellerThaw(void) { if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) @@ -2305,30 +2419,95 @@ static enum MoveCanceller CancellerThaw(void) static enum MoveCanceller CancellerStanceChangeTwo(void) { - if (B_STANCE_CHANGE_FAIL >= GEN_7 && !gBattleStruct->isAtkCancelerForCalledMove && TryFormChangeBeforeMove()) + if (B_STANCE_CHANGE_FAIL >= GEN_7 && gChosenMove == gCurrentMove && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerChoiceLock(void) +static enum MoveCanceller CancellerAttackstring(void) { - u16 *choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; + BattleScriptCall(BattleScript_Attackstring); + return MOVE_STEP_BREAK; +} - if (gChosenMove != MOVE_STRUGGLE - && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) - && (IsHoldEffectChoice(holdEffect) || GetBattlerAbility(gBattlerAttacker) == ABILITY_GORILLA_TACTICS)) - *choicedMoveAtk = gChosenMove; +static enum MoveCanceller CancellerPPDeduction(void) +{ + if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns + || gSpecialStatuses[gBattlerAttacker].dancerUsedMove + || gCurrentMove == MOVE_STRUGGLE) + return MOVE_STEP_SUCCESS; - u32 moveIndex; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + s32 ppToDeduct = 1; + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + u32 movePosition = gCurrMovePos; + + if (gBattleStruct->submoveAnnouncement == SUBMOVE_SUCCESS) + movePosition = gChosenMovePos; + + if (moveTarget == MOVE_TARGET_BOTH + || moveTarget == MOVE_TARGET_FOES_AND_ALLY + || moveTarget == MOVE_TARGET_ALL_BATTLERS + || MoveForcesPressure(gCurrentMove)) { - if (gBattleMons[gBattlerAttacker].moves[moveIndex] == *choicedMoveAtk) - break; + for (u32 i = 0; i < gBattlersCount; i++) + { + if (!IsBattlerAlly(i, gBattlerAttacker) && IsBattlerAlive(i)) + ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); + } + } + else if (moveTarget != MOVE_TARGET_OPPONENTS_FIELD) + { + if (gBattlerAttacker != gBattlerTarget && GetBattlerAbility(gBattlerTarget) == ABILITY_PRESSURE) + ppToDeduct++; } - if (moveIndex == MAX_MON_MOVES) - *choicedMoveAtk = MOVE_NONE; + gProtectStructs[gBattlerAttacker].notFirstStrike = TRUE; + + // For item Metronome, echoed voice + if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || WasUnableToUseMove(gBattlerAttacker)) + gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; + + if (gBattleMons[gBattlerAttacker].pp[movePosition] > ppToDeduct) + gBattleMons[gBattlerAttacker].pp[movePosition] -= ppToDeduct; + else + gBattleMons[gBattlerAttacker].pp[movePosition] = 0; + + if (MOVE_IS_PERMANENT(gBattlerAttacker, movePosition)) + { + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + movePosition, 0, + sizeof(gBattleMons[gBattlerAttacker].pp[movePosition]), + &gBattleMons[gBattlerAttacker].pp[movePosition]); + MarkBattlerForControllerExec(gBattlerAttacker); + } + + if (gBattleStruct->submoveAnnouncement != SUBMOVE_NO_EFFECT) + { + if (gBattleStruct->submoveAnnouncement == SUBMOVE_FAILURE) + { + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + gBattlescriptCurrInstr = BattleScript_ButItFailed; + return MOVE_STEP_FAILURE; + } + else if (CancellerVolatileBlocked() == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove + { + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + return MOVE_STEP_FAILURE; + } + else + { + gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattleScripting.animTurn = 0; + gBattleScripting.animTargetsHit = 0; + + // Possibly better to just move type setting and redirection to attackcanceller as a new case at this point + SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); + HandleMoveTargetRedirection(); + gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); + return MOVE_STEP_BREAK; + } + } return MOVE_STEP_SUCCESS; } @@ -2342,20 +2521,20 @@ static enum MoveCanceller CancellerWeatherPrimal(void) if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; - effect = MOVE_STEP_BREAK; + effect = MOVE_STEP_FAILURE; } else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN; - effect = MOVE_STEP_BREAK; + effect = MOVE_STEP_FAILURE; } - if (effect == MOVE_STEP_BREAK) + if (effect == MOVE_STEP_FAILURE) { gBattleScripting.moveEffect = MOVE_EFFECT_NONE; gProtectStructs[gBattlerAttacker].chargingTurn = FALSE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - BattleScriptCall(BattleScript_PrimalWeatherBlocksMove); + gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; } } return effect; @@ -2366,8 +2545,8 @@ static enum MoveCanceller CancellerDynamaxBlocked(void) if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - BattleScriptCall(BattleScript_MoveBlockedByDynamax); - return MOVE_STEP_BREAK; + gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2376,10 +2555,10 @@ static enum MoveCanceller CancellerPowderStatus(void) { if (TryActivatePowderStatus(gCurrentMove)) { - gProtectStructs[gBattlerAttacker].powderSelfDmg = TRUE; if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + // This might be incorrect if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; @@ -2418,7 +2597,7 @@ static enum MoveCanceller CancellerPsychicTerrain(void) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2431,7 +2610,7 @@ static enum MoveCanceller CancellerExplodingDamp(void) gBattleScripting.battler = dampBattler - 1; gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2503,38 +2682,6 @@ static enum MoveCanceller CancellerMultihitMoves(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerZMoves(void) -{ - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) - { - // For Z-Mirror Move, so it doesn't play the animation twice. - bool32 alreadyUsed = HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE); - - // attacker has a queued z move - RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL); - SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); - - gBattleScripting.battler = gBattlerAttacker; - if (gProtectStructs[gBattlerAttacker].powderSelfDmg) - { - if (!alreadyUsed) - BattleScriptCall(BattleScript_ZMoveActivatePowder); - } - else if (GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) - { - if (!alreadyUsed) - BattleScriptCall(BattleScript_ZMoveActivateStatus); - } - else - { - if (!alreadyUsed) - BattleScriptCall(BattleScript_ZMoveActivateDamaging); - } - return MOVE_STEP_BREAK; // The original move is cancelled, not the z move - } - return MOVE_STEP_SUCCESS; -} - static enum MoveCanceller CancellerMultiTargetMoves(void) { u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); @@ -2591,19 +2738,24 @@ static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(void) = [CANCELLER_RECHARGE] = CancellerRecharge, [CANCELLER_ASLEEP_OR_FROZEN] = CancellerAsleepOrFrozen, [CANCELLER_OBEDIENCE] = CancellerObedience, + [CANCELLER_POWER_POINTS] = CancellerPowerPoints, [CANCELLER_TRUANT] = CancellerTruant, [CANCELLER_FLINCH] = CancellerFlinch, - [CANCELLER_INFATUATION] = CancellerInfatuation, [CANCELLER_DISABLED] = CancellerDisabled, [CANCELLER_VOLATILE_BLOCKED] = CancellerVolatileBlocked, [CANCELLER_TAUNTED] = CancellerTaunted, [CANCELLER_IMPRISONED] = CancellerImprisoned, [CANCELLER_CONFUSED] = CancellerConfused, [CANCELLER_PARALYSED] = CancellerParalysed, + [CANCELLER_INFATUATION] = CancellerInfatuation, [CANCELLER_BIDE] = CancellerBide, + [CANCELLER_Z_MOVES] = CancellerZMoves, + [CANCELLER_CHOICE_LOCK] = CancellerChoiceLock, + [CANCELLER_CALLSUBMOVE] = CancellerCallSubmove, [CANCELLER_THAW] = CancellerThaw, [CANCELLER_STANCE_CHANGE_2] = CancellerStanceChangeTwo, - [CANCELLER_CHOICE_LOCK] = CancellerChoiceLock, + [CANCELLER_ATTACKSTRING] = CancellerAttackstring, + [CANCELLER_PPDEDUCTION] = CancellerPPDeduction, [CANCELLER_WEATHER_PRIMAL] = CancellerWeatherPrimal, [CANCELLER_DYNAMAX_BLOCKED] = CancellerDynamaxBlocked, [CANCELLER_POWDER_STATUS] = CancellerPowderStatus, @@ -2611,7 +2763,6 @@ static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(void) = [CANCELLER_PSYCHIC_TERRAIN] = CancellerPsychicTerrain, [CANCELLER_EXPLODING_DAMP] = CancellerExplodingDamp, [CANCELLER_MULTIHIT_MOVES] = CancellerMultihitMoves, - [CANCELLER_Z_MOVES] = CancellerZMoves, [CANCELLER_MULTI_TARGET_MOVES] = CancellerMultiTargetMoves, }; @@ -3017,29 +3168,17 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a { case ABILITY_SOUNDPROOF: if (IsSoundMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) - { - if (gBattleMons[battlerAtk].volatiles.multipleTurns) - gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_SoundproofProtected; - } break; case ABILITY_BULLETPROOF: if (IsBallisticMove(move)) - { - if (gBattleMons[battlerAtk].volatiles.multipleTurns) - gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_SoundproofProtected; - } break; case ABILITY_DAZZLING: case ABILITY_QUEENLY_MAJESTY: case ABILITY_ARMOR_TAIL: if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, battlerDef)) - { - if (gBattleMons[battlerAtk].volatiles.multipleTurns) - gHitMarker |= HITMARKER_NO_PPDEDUCT; battleScriptBlocksMove = BattleScript_DazzlingProtected; - } break; case ABILITY_GOOD_AS_GOLD: if (IsBattleMoveStatus(move)) @@ -3081,8 +3220,6 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a case ABILITY_DAZZLING: case ABILITY_QUEENLY_MAJESTY: case ABILITY_ARMOR_TAIL: - if (gBattleMons[battlerAtk].volatiles.multipleTurns) - gHitMarker |= HITMARKER_NO_PPDEDUCT; battlerAbility = partnerDef; battleScriptBlocksMove = BattleScript_DazzlingProtected; break; @@ -3190,18 +3327,11 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 gBattleStruct->pledgeMove = FALSE; if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) { - if ((gProtectStructs[battlerAtk].notFirstStrike)) - battleScript = BattleScript_MonMadeMoveUseless; - else - battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + battleScript = BattleScript_MonMadeMoveUseless; } else { - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_MoveHPDrain; - else - battleScript = BattleScript_MoveHPDrain_PPLoss; - + battleScript = BattleScript_MoveHPDrain; gBattleStruct->moveDamage[battlerDef] = GetNonDynamaxMaxHP(battlerDef) / 4; if (gBattleStruct->moveDamage[battlerDef] == 0) gBattleStruct->moveDamage[battlerDef] = 1; @@ -3212,18 +3342,11 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 gBattleStruct->pledgeMove = FALSE; if (!CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) { - if ((gProtectStructs[battlerAtk].notFirstStrike)) - battleScript = BattleScript_MonMadeMoveUseless; - else - battleScript = BattleScript_MonMadeMoveUseless_PPLoss; + battleScript = BattleScript_MonMadeMoveUseless; } else { - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_MoveStatDrain; - else - battleScript = BattleScript_MoveStatDrain_PPLoss; - + battleScript = BattleScript_MoveStatDrain; SET_STATCHANGER(statId, statAmount, FALSE); if (B_ABSORBING_ABILITY_STRING < GEN_5) PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); @@ -3234,19 +3357,13 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 if (!gDisableStructs[battlerDef].flashFireBoosted) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_FlashFireBoost; - else - battleScript = BattleScript_FlashFireBoost_PPLoss; + battleScript = BattleScript_FlashFireBoost; gDisableStructs[battlerDef].flashFireBoosted = TRUE; } else { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; - if (gProtectStructs[battlerAtk].notFirstStrike) - battleScript = BattleScript_FlashFireBoost; - else - battleScript = BattleScript_FlashFireBoost_PPLoss; + battleScript = BattleScript_FlashFireBoost; } break; } @@ -5048,13 +5165,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // Set the target to the original target of the mon that first used a Dance move gBattlerTarget = gBattleScripting.savedBattler & 0x3; - // Edge case for dance moves that hit multiply targets - gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; - // Make sure that the target isn't an ally - if it is, target the original user if (IsBattlerAlly(gBattlerTarget, gBattlerAttacker)) gBattlerTarget = (gBattleScripting.savedBattler & 0xF0) >> 4; - gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; BattleScriptExecute(BattleScript_DancerActivates); effect++; } @@ -7998,7 +8111,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) u32 weight, hpFraction, speed; if (GetActiveGimmick(battlerAtk) == GIMMICK_Z_MOVE) - return GetZMovePower(gBattleStruct->zmove.baseMoves[battlerAtk]); + return GetZMovePower(gCurrentMove); if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX) return GetMaxMovePower(move); @@ -11862,3 +11975,180 @@ bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move) return FALSE; } + +static u32 GetMirrorMoveMove(void) +{ + s32 i, validMovesCount; + u16 move = MOVE_NONE; + u16 validMoves[MAX_BATTLERS_COUNT] = {0}; + + for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) + { + if (i != gBattlerAttacker) + { + move = gBattleStruct->lastTakenMoveFrom[gBattlerAttacker][i]; + if (move != MOVE_NONE && move != MOVE_UNAVAILABLE) + { + validMoves[validMovesCount] = move; + validMovesCount++; + } + } + } + + move = gBattleStruct->lastTakenMove[gBattlerAttacker]; + if ((move == MOVE_NONE || move == MOVE_UNAVAILABLE) && validMovesCount != 0) + move = validMoves[Random() % validMovesCount]; + + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(move)) + move = GetTypeBasedZMove(move); + + return move; +} + +static bool32 InvalidMetronomeMove(u32 move) +{ + return GetMoveEffect(move) == EFFECT_PLACEHOLDER + || IsMoveMetronomeBanned(move); +} + +static u32 GetMetronomeMove(void) +{ + u32 move = MOVE_NONE; + +#if B_METRONOME_MOVES >= GEN_9 + u32 moveCount = MOVES_COUNT_GEN9; +#elif B_METRONOME_MOVES >= GEN_8 + u32 moveCount = MOVES_COUNT_GEN8; +#elif B_METRONOME_MOVES >= GEN_7 + u32 moveCount = MOVES_COUNT_GEN7; +#elif B_METRONOME_MOVES >= GEN_6 + u32 moveCount = MOVES_COUNT_GEN6; +#elif B_METRONOME_MOVES >= GEN_5 + u32 moveCount = MOVES_COUNT_GEN5; +#elif B_METRONOME_MOVES >= GEN_4 + u32 moveCount = MOVES_COUNT_GEN4; +#elif B_METRONOME_MOVES >= GEN_3 + u32 moveCount = MOVES_COUNT_GEN3; +#elif B_METRONOME_MOVES >= GEN_2 + u32 moveCount = MOVES_COUNT_GEN2; +#else + u32 moveCount = MOVES_COUNT_GEN1; +#endif + + move = RandomUniformExcept(RNG_METRONOME, 1, moveCount - 1, InvalidMetronomeMove); + return move; +} + +static u32 GetAssistMove(void) +{ + u32 move = MOVE_NONE; + s32 chooseableMovesNo = 0; + struct Pokemon *party; + u16 *validMoves = Alloc(sizeof(u16) * PARTY_SIZE * MAX_MON_MOVES); + + if (validMoves != NULL) + { + party = GetBattlerParty(gBattlerAttacker); + + for (u32 monId = 0; monId < PARTY_SIZE; monId++) + { + if (monId == gBattlerPartyIndexes[gBattlerAttacker]) + continue; + if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_NONE) + continue; + if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) + continue; + + for (u32 moveId = 0; moveId < MAX_MON_MOVES; moveId++) + { + u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); + + if (IsMoveAssistBanned(move)) + continue; + + validMoves[chooseableMovesNo++] = move; + } + } + } + + if (chooseableMovesNo) + move = validMoves[Random() % chooseableMovesNo]; + + TRY_FREE_AND_SET_NULL(validMoves); + + return move; +} + +u32 GetNaturePowerMove(u32 battler) +{ + u32 move = gBattleEnvironmentInfo[gBattleEnvironment].naturePower; + if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) + move = MOVE_MOONBLAST; + else if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + move = MOVE_THUNDERBOLT; + else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) + move = MOVE_ENERGY_BALL; + else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) + move = MOVE_PSYCHIC; + else if (gBattleEnvironmentInfo[gBattleEnvironment].naturePower == MOVE_NONE) + move = MOVE_TRI_ATTACK; + + return move; +} + +static u32 GetSleepTalkMove(void) +{ + u32 move = MOVE_NONE; + + u32 i, unusableMovesBits = 0, movePosition; + + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_COMATOSE + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) + return move; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (IsMoveSleepTalkBanned(gBattleMons[gBattlerAttacker].moves[i]) + || gBattleMoveEffects[GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i])].twoTurnEffect) + unusableMovesBits |= (1 << (i)); + } + + unusableMovesBits = CheckMoveLimitations(gBattlerAttacker, unusableMovesBits, ~(MOVE_LIMITATION_PP | MOVE_LIMITATION_CHOICE_ITEM)); + if (unusableMovesBits == ALL_MOVES_MASK) // all 4 moves cannot be chosen + return move; + + // Set Sleep Talk as used move, so it works with Last Resort. + gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; + do + { + movePosition = MOD(Random(), MAX_MON_MOVES); + } while ((1u << movePosition) & unusableMovesBits); + + move = gBattleMons[gBattlerAttacker].moves[movePosition]; + gCurrMovePos = movePosition; + + return move; +} + +static u32 GetCopyCatMove(void) +{ + if (gLastUsedMove == MOVE_NONE + || gLastUsedMove == MOVE_UNAVAILABLE + || IsMoveCopycatBanned(gLastUsedMove) + || IsZMove(gLastUsedMove)) + return MOVE_NONE; + + return gLastUsedMove; +} + +static u32 GetMeFirstMove(void) +{ + u32 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; + + if (IsBattleMoveStatus(move) + || IsMoveMeFirstBanned(move) + || GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) + return MOVE_NONE; + + return move; +} diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 638e9ef901..1c5a6118a8 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -161,7 +161,6 @@ u32 GetUsableZMove(u32 battler, u32 move) void ActivateZMove(u32 battler) { - gBattleStruct->zmove.baseMoves[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; SetActiveGimmick(battler, GIMMICK_Z_MOVE); } @@ -438,7 +437,7 @@ static void ZMoveSelectionDisplayMoveType(u16 zMove, u32 battler) void SetZEffect(void) { u32 i; - u32 effect = GetMoveZEffect(gBattleStruct->zmove.baseMoves[gBattlerAttacker]); + u32 effect = GetMoveZEffect(gChosenMove); if (effect == Z_EFFECT_CURSE) { diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 88d4075570..7c855ff1bd 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -49,7 +49,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_MIRROR_MOVE] = { - .battleScript = BattleScript_EffectMirrorMove, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, }, @@ -398,7 +398,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_METRONOME] = { - .battleScript = BattleScript_EffectMetronome, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, }, @@ -502,7 +502,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_SLEEP_TALK] = { - .battleScript = BattleScript_EffectSleepTalk, + .battleScript = BattleScript_EffectHit, .battleTvScore = 3, .encourageEncore = TRUE, }, @@ -911,7 +911,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_NATURE_POWER] = { - .battleScript = BattleScript_EffectNaturePower, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -956,7 +956,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_ASSIST] = { - .battleScript = BattleScript_EffectAssist, + .battleScript = BattleScript_EffectHit, .battleTvScore = 2, }, @@ -1486,7 +1486,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_ME_FIRST] = { - .battleScript = BattleScript_EffectMeFirst, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1601,7 +1601,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_COPYCAT] = { - .battleScript = BattleScript_EffectCopycat, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, diff --git a/test/battle/move_effect/copycat.c b/test/battle/move_effect/copycat.c index cdc164cd0f..6b14df8615 100644 --- a/test/battle/move_effect/copycat.c +++ b/test/battle/move_effect/copycat.c @@ -21,6 +21,27 @@ TO_DO_BATTLE_TEST("Copycat ignores the recharging turn of recharging moves (Gen TO_DO_BATTLE_TEST("Copycat can copy Bide on all turns"); TO_DO_BATTLE_TEST("Copycat copies moves called by other calling moves instead of the calling move (Gen 5+)"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_COPYCAT) == EFFECT_COPYCAT); +} + +SINGLE_BATTLE_TEST("Copycat deducts power points from itself, not the copied move") +{ + ASSUME(GetMovePP(MOVE_COPYCAT) == 20); + ASSUME(GetMovePP(MOVE_POUND) == 35); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_COPYCAT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND); } + } WHEN { + TURN { MOVE(opponent, MOVE_POUND); MOVE(player, MOVE_COPYCAT); } + } SCENE { + } THEN { + EXPECT_EQ(opponent->pp[0], 34); + EXPECT_EQ(player->pp[0], 19); + } +} + DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") { GIVEN { diff --git a/test/battle/move_effect/me_first.c b/test/battle/move_effect/me_first.c index f351c1a498..51f673ae5f 100644 --- a/test/battle/move_effect/me_first.c +++ b/test/battle/move_effect/me_first.c @@ -1,6 +1,11 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ME_FIRST) == EFFECT_ME_FIRST); +} + SINGLE_BATTLE_TEST("Me First copies the move from the target and increases it's power by 1.5", s16 damage) { u32 move; @@ -77,4 +82,21 @@ SINGLE_BATTLE_TEST("Me First can be selected if users holds Assault Vest") } } +SINGLE_BATTLE_TEST("Me Frist deducts power points from itself, not the copied move") +{ + ASSUME(GetMovePP(MOVE_ME_FIRST) == 20); + ASSUME(GetMovePP(MOVE_POUND) == 35); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Moves(MOVE_ME_FIRST); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Moves(MOVE_POUND); } + } WHEN { + TURN { MOVE(player, MOVE_ME_FIRST); MOVE(opponent, MOVE_POUND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ME_FIRST, player); + } THEN { + EXPECT_EQ(opponent->pp[0], 34); + EXPECT_EQ(player->pp[0], 19); + } +} + // TO_DO_BATTLE_TEST: Not everything has been tested diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index 642998cbcf..c9e468a5e4 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") TURN { MOVE(player, MOVE_MIRROR_MOVE); MOVE(opponent, MOVE_SCRATCH); } } SCENE { MESSAGE("Wobbuffet used Mirror Move!"); - MESSAGE("The Mirror Move failed!"); + MESSAGE("But it failed!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); HP_BAR(player); } diff --git a/test/battle/move_effect/sleep_talk.c b/test/battle/move_effect/sleep_talk.c index 1f53530c46..2a2443c7ee 100644 --- a/test/battle/move_effect/sleep_talk.c +++ b/test/battle/move_effect/sleep_talk.c @@ -146,3 +146,21 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Sto ABILITY_POPUP(opponentRight, ABILITY_STORM_DRAIN); } } + +SINGLE_BATTLE_TEST("Sleep Talk deducts power points from itself, not the called move") +{ + ASSUME(GetMovePP(MOVE_SLEEP_TALK) == 10); + ASSUME(GetMovePP(MOVE_POUND) == 35); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_POUND); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SLEEP_TALK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + } THEN { + EXPECT_EQ(player->pp[0], 9); + EXPECT_EQ(player->pp[1], 35); + } +} From 97376a5b5a8ca11a0ec0523c49e5d1e56bdfcd16 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 4 Sep 2025 20:41:00 +0100 Subject: [PATCH 023/183] Support gimmicks in AI tests --- include/test/battle.h | 3 ++- include/test_runner.h | 4 ++- src/battle_main.c | 5 +++- test/battle/ai/ai_smart_tera.c | 13 +++++----- test/test_runner_battle.c | 47 +++++++++++++++++++++++++++++----- 5 files changed, 55 insertions(+), 17 deletions(-) diff --git a/include/test/battle.h b/include/test/battle.h index d909aa0332..28547f2614 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -638,7 +638,8 @@ struct BattlerTurn struct ExpectedAIAction { - u16 sourceLine; + u16 sourceLine:13; // TODO: Avoid stealing these bits. + enum Gimmick gimmick:3; u8 type:4; // which action u8 moveSlots:4; // Expected move(s) to be chosen or not, marked as bits. u8 target:4; // move target or id of mon which gets sent out diff --git a/include/test_runner.h b/include/test_runner.h index 9e0d96ff5b..3b11568f60 100644 --- a/include/test_runner.h +++ b/include/test_runner.h @@ -7,6 +7,8 @@ extern const bool8 gTestRunnerSkipIsFail; #if TESTING +enum Gimmick; + void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability); void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId); void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP); @@ -14,7 +16,7 @@ void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp); void TestRunner_Battle_RecordMessage(const u8 *message); void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1); void TestRunner_Battle_AfterLastTurn(void); -void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target); +void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target, enum Gimmick gimmick); void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex); void TestRunner_Battle_CheckAiMoveScores(u32 battlerId); void TestRunner_Battle_AISetScore(const char *file, u32 line, u32 battlerId, u32 moveIndex, s32 score); diff --git a/src/battle_main.c b/src/battle_main.c index 796582aedd..488a1e81f8 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4502,7 +4502,10 @@ static void HandleTurnActionSelectionState(void) if (gTestRunnerEnabled) { - TestRunner_Battle_CheckChosenMove(battler, gChosenMoveByBattler[battler], gBattleStruct->moveTarget[battler]); + UNUSED enum Gimmick gimmick = GIMMICK_NONE; + if (gBattleResources->bufferB[battler][2] & RET_GIMMICK) + gimmick = gBattleStruct->gimmick.usableGimmick[battler]; + TestRunner_Battle_CheckChosenMove(battler, gChosenMoveByBattler[battler], gBattleStruct->moveTarget[battler], gimmick); } } break; diff --git a/test/battle/ai/ai_smart_tera.c b/test/battle/ai/ai_smart_tera.c index 550ba7d2a1..dadc910fdb 100644 --- a/test/battle/ai/ai_smart_tera.c +++ b/test/battle/ai/ai_smart_tera.c @@ -4,7 +4,6 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will tera if it enables a ko") { - KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. GIVEN { ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); ASSUME(GetMovePower(MOVE_AQUA_TAIL) == 90); @@ -14,9 +13,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will tera if it enables a ko") OPPONENT(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_AQUA_TAIL, MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } } WHEN { - TURN { EXPECT_MOVE(opponent, MOVE_SEED_BOMB); } + TURN { EXPECT_MOVE(opponent, MOVE_SEED_BOMB, gimmick: GIMMICK_TERA); SEND_OUT(player, 1); } } SCENE { - MESSAGE("The opposing Wobbuffet terastilized into the Grass type!"); + MESSAGE("The opposing Wobbuffet terastallized into the Grass type!"); MESSAGE("Wobbuffet fainted!"); } } @@ -34,7 +33,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets outsped a } WHEN { TURN { } } SCENE { - NOT MESSAGE("The opposing Wobbuffet terastilized into the Grass type!"); + NOT MESSAGE("The opposing Wobbuffet terastallized into the Grass type!"); } } @@ -50,7 +49,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets ko'd by p } WHEN { TURN { } } SCENE { - NOT MESSAGE("The opposing Wobbuffet terastilized into the Grass type!"); + NOT MESSAGE("The opposing Wobbuffet terastallized into the Grass type!"); } } @@ -68,6 +67,6 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets ko'd by p // } WHEN { // TURN { MOVE(player, MOVE_SEED_BOMB); } // } SCENE { -// MESSAGE("The opposing Wobbuffet terastilized into the Fire type!"); +// MESSAGE("The opposing Wobbuffet terastallized into the Fire type!"); // } -// } \ No newline at end of file +// } diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index a0f3e0e953..ba1c0ba109 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -765,6 +765,16 @@ static const char *const sBattleActionNames[] = [B_ACTION_SWITCH] = "SWITCH", }; +static const char *const sGimmickIdentifiers[GIMMICKS_COUNT] = +{ + [GIMMICK_NONE] = "N/A", + [GIMMICK_MEGA] = "Mega Evolution", + [GIMMICK_ULTRA_BURST] = "Ultra Burst", + [GIMMICK_Z_MOVE] = "Z-Move", + [GIMMICK_DYNAMAX] = "Dynamax", + [GIMMICK_TERA] = "Terastallize", +}; + static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battlerId, bool32 printLog) { u32 i, countExpected = 0; @@ -780,7 +790,7 @@ static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battl return countExpected; } -void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target) +void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target, enum Gimmick gimmick) { const char *filename = gTestRunnerState.test->filename; u32 id = DATA.trial.aiActionsPlayed[battlerId]; @@ -802,6 +812,9 @@ void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target) if (expectedAction->explicitTarget && expectedAction->target != target) Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected target %s, got %s", filename, expectedAction->sourceLine, BattlerIdentifier(expectedAction->target), BattlerIdentifier(target)); + if (expectedAction->gimmick != GIMMICKS_COUNT && expectedAction->gimmick != gimmick) + Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected gimmick %s, got %s", filename, expectedAction->sourceLine, sGimmickIdentifiers[expectedAction->gimmick], sGimmickIdentifiers[gimmick]); + for (i = 0; i < MAX_MON_MOVES; i++) { if ((1u << i) & expectedAction->moveSlots) @@ -1616,6 +1629,17 @@ void ClosePokemon(u32 sourceLine) DATA.currentMon = NULL; } +static void SetGimmick(u32 sourceLine, u32 side, u32 partyIndex, enum Gimmick gimmick) +{ + enum Gimmick currentGimmick = DATA.chosenGimmick[side][partyIndex]; + if (!((currentGimmick == GIMMICK_ULTRA_BURST && gimmick == GIMMICK_Z_MOVE) + || (currentGimmick == GIMMICK_Z_MOVE && gimmick == GIMMICK_ULTRA_BURST))) + { + INVALID_IF(currentGimmick != GIMMICK_NONE && currentGimmick != gimmick, "Cannot set %s because %s already set", sGimmickIdentifiers[gimmick], sGimmickIdentifiers[currentGimmick]); + } + DATA.chosenGimmick[side][partyIndex] = gimmick; +} + void Gender_(u32 sourceLine, u32 gender) { const struct SpeciesInfo *info; @@ -1778,6 +1802,15 @@ void Item_(u32 sourceLine, u32 item) INVALID_IF(!DATA.currentMon, "Item outside of PLAYER/OPPONENT"); INVALID_IF(item >= ITEMS_COUNT, "Illegal item: %d", item); SetMonData(DATA.currentMon, MON_DATA_HELD_ITEM, &item); + switch (GetItemHoldEffect(item)) + { + case HOLD_EFFECT_MEGA_STONE: + SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_MEGA); + break; + case HOLD_EFFECT_Z_CRYSTAL: + SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_Z_MOVE); + break; + } } void Moves_(u32 sourceLine, u16 moves[MAX_MON_MOVES]) @@ -1834,18 +1867,21 @@ void DynamaxLevel_(u32 sourceLine, u32 dynamaxLevel) { INVALID_IF(!DATA.currentMon, "DynamaxLevel outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_DYNAMAX_LEVEL, &dynamaxLevel); + SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor) { INVALID_IF(!DATA.currentMon, "GigantamaxFactor outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_GIGANTAMAX_FACTOR, &gigantamaxFactor); + SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } void TeraType_(u32 sourceLine, u32 teraType) { INVALID_IF(!DATA.currentMon, "TeraType outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_TERA_TYPE, &teraType); + SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_TERA); } void Shadow_(u32 sourceLine, bool32 isShadow) @@ -2146,11 +2182,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * INVALID_IF(ctx->gimmick != GIMMICK_Z_MOVE && ctx->gimmick != GIMMICK_ULTRA_BURST && holdEffect == HOLD_EFFECT_Z_CRYSTAL, "Cannot use another gimmick while holding a Z-Crystal"); // Check multiple gimmick use. - INVALID_IF(DATA.chosenGimmick[side][DATA.currentMonIndexes[battlerId]] != GIMMICK_NONE - && !(DATA.chosenGimmick[side][DATA.currentMonIndexes[battlerId]] == GIMMICK_ULTRA_BURST - && ctx->gimmick == GIMMICK_Z_MOVE), "Cannot use multiple gimmicks on the same battler"); - - DATA.chosenGimmick[side][DATA.currentMonIndexes[battlerId]] = ctx->gimmick; + SetGimmick(sourceLine, side, DATA.currentMonIndexes[battlerId], ctx->gimmick); *moveSlot |= RET_GIMMICK; } } @@ -2280,11 +2312,12 @@ static void TryMarkExpectMove(u32 sourceLine, struct BattlePokemon *battler, str id = DATA.expectedAiActionIndex[battlerId]; DATA.expectedAiActions[battlerId][id].type = B_ACTION_USE_MOVE; - DATA.expectedAiActions[battlerId][id].moveSlots |= 1 << moveSlot; + DATA.expectedAiActions[battlerId][id].moveSlots |= 1 << (moveSlot & ~RET_GIMMICK); DATA.expectedAiActions[battlerId][id].target = target; DATA.expectedAiActions[battlerId][id].explicitTarget = ctx->explicitTarget; DATA.expectedAiActions[battlerId][id].sourceLine = sourceLine; DATA.expectedAiActions[battlerId][id].actionSet = TRUE; + DATA.expectedAiActions[battlerId][id].gimmick = ctx->explicitGimmick ? ctx->gimmick : GIMMICKS_COUNT; if (ctx->explicitNotExpected) DATA.expectedAiActions[battlerId][id].notMove = ctx->notExpected; From 9e56a259e6b08627f4389becbdff2f65e61578b2 Mon Sep 17 00:00:00 2001 From: surskitty Date: Thu, 4 Sep 2025 17:08:30 -0400 Subject: [PATCH 024/183] Simple gimmick tests --- test/battle/ai/ai_smart_tera.c | 33 +++++++++++++++---------------- test/battle/ai/gimmick_dynamax.c | 15 ++++++++++++++ test/battle/ai/gimmick_mega.c | 19 ++++++++++++++++++ test/battle/ai/gimmick_z_move.c | 34 ++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 test/battle/ai/gimmick_dynamax.c create mode 100644 test/battle/ai/gimmick_mega.c create mode 100644 test/battle/ai/gimmick_z_move.c diff --git a/test/battle/ai/ai_smart_tera.c b/test/battle/ai/ai_smart_tera.c index dadc910fdb..7bed476b43 100644 --- a/test/battle/ai/ai_smart_tera.c +++ b/test/battle/ai/ai_smart_tera.c @@ -53,20 +53,19 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets ko'd by p } } -// AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI might tera if it gets saved from a ko") -// { -// KNOWN_FAILING; // Tests don't currently give the AI the capability to tera, even with a tera type set. -// PASSES_RANDOMLY(90, 100, RNG_AI_CONSERVE_TERA); -// GIVEN { -// ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); -// AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); -// PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_SEED_BOMB); } -// PLAYER(SPECIES_WOBBUFFET) { Speed(100); } -// OPPONENT(SPECIES_WOBBUFFET) { Speed(100); HP(30); Moves(MOVE_SEED_BOMB); TeraType(TYPE_FIRE); } -// OPPONENT(SPECIES_WOBBUFFET) { Speed(100); TeraType(TYPE_FIRE); } -// } WHEN { -// TURN { MOVE(player, MOVE_SEED_BOMB); } -// } SCENE { -// MESSAGE("The opposing Wobbuffet terastallized into the Fire type!"); -// } -// } +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI might tera if it gets saved from a ko") +{ + PASSES_RANDOMLY(90, 100, RNG_AI_CONSERVE_TERA); + GIVEN { + ASSUME(GetMovePower(MOVE_SEED_BOMB) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_TERA | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { HP(47); Speed(100); Moves(MOVE_SEED_BOMB); } + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); HP(30); Moves(MOVE_SEED_BOMB); TeraType(TYPE_FIRE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); TeraType(TYPE_FIRE); } + } WHEN { + TURN { MOVE(player, MOVE_SEED_BOMB); } + } SCENE { + MESSAGE("The opposing Wobbuffet terastallized into the Fire type!"); + } +} diff --git a/test/battle/ai/gimmick_dynamax.c b/test/battle/ai/gimmick_dynamax.c new file mode 100644 index 0000000000..1f97e490b9 --- /dev/null +++ b/test/battle/ai/gimmick_dynamax.c @@ -0,0 +1,15 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI uses Dynamax") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH); DynamaxLevel(10); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } + } +} + diff --git a/test/battle/ai/gimmick_mega.c b/test/battle/ai/gimmick_mega.c new file mode 100644 index 0000000000..ef94223122 --- /dev/null +++ b/test/battle/ai/gimmick_mega.c @@ -0,0 +1,19 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("AI uses Mega Evolution") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VENUSAUR) { Item(ITEM_VENUSAURITE); Moves(MOVE_SLUDGE_BOMB); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SLUDGE_BOMB, gimmick: GIMMICK_MEGA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + } THEN { + EXPECT_EQ(opponent->species, SPECIES_VENUSAUR_MEGA); + } +} + diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c new file mode 100644 index 0000000000..bf6b3cc3ec --- /dev/null +++ b/test/battle/ai/gimmick_z_move.c @@ -0,0 +1,34 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" +#include "constants/battle_z_move_effects.h" + +AI_SINGLE_BATTLE_TEST("AI uses Z-moves.") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_QUICK_ATTACK); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI does not use damaging Z-moves if the player would faint anyway.") +{ + u32 currentHP; + PARAMETRIZE { currentHP = 1; } + PARAMETRIZE { currentHP = 500; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET) { HP(currentHP); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_QUICK_ATTACK); } + } WHEN { + if (currentHP != 1) + TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_NONE); } + } +} From c3dec7d03083f06c2b109d162aeb8fec1fd02e5a Mon Sep 17 00:00:00 2001 From: surskitty Date: Sun, 7 Sep 2025 12:00:02 -0400 Subject: [PATCH 025/183] AI can use Z-status moves (#7666) --- include/config/ai.h | 4 ++ src/battle_ai_main.c | 8 ++- src/battle_ai_util.c | 91 ++++++++++++++++++++++++--- test/battle/ai/gimmick_z_move.c | 91 +++++++++++++++++++++++++++ test/battle/move_effect/last_resort.c | 40 ++++++++++++ 5 files changed, 225 insertions(+), 9 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index b6eb7bfe21..877b3da427 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -110,4 +110,8 @@ #define POWER_SPLIT_ALLY_PERCENTAGE 150 #define POWER_SPLIT_ENEMY_PERCENTAGE 50 +// HP thresholds to use a status z-move. +#define Z_EFFECT_FOLLOW_ME_THRESHOLD 30 +#define Z_EFFECT_RESTORE_HP_THRESHOLD 60 + #endif // GUARD_CONFIG_AI_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index f77d142407..a28ef05aa9 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1985,7 +1985,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (aiData->hpPercents[battlerAtk] <= 60) + else if (aiData->hpPercents[battlerAtk] <= 60 && (GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE || GetMoveZEffect(move) == Z_EFFECT_NONE)) ADJUST_SCORE(-10); break; case EFFECT_FUTURE_SIGHT: @@ -2760,6 +2760,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: case EFFECT_HAPPY_HOUR: + case EFFECT_LAST_RESORT: + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move)) + break; ADJUST_SCORE(-10); break; case EFFECT_INSTRUCT: @@ -4443,7 +4446,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: case EFFECT_HAPPY_HOUR: - //todo - check z splash, z celebrate, z happy hour (lol) + if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_TELEPORT: // Either remove or add better logic if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) || !IsOnPlayerSide(battlerAtk)) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 08bcf26fad..0b440ec39f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -4847,15 +4847,97 @@ bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) { // simple logic. just upgrades chosen move to z move if possible, unless regular move would kill opponent - if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk)) + if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk) && !(GetBattlerMoveTargetType(battlerAtk, chosenMove) & MOVE_TARGET_ALLY)) return FALSE; // don't use z move on partner if (HasTrainerUsedGimmick(battlerAtk, GIMMICK_Z_MOVE)) return FALSE; // can't use z move twice if (IsViableZMove(battlerAtk, chosenMove)) { - uq4_12_t effectiveness; u32 zMove = GetUsableZMove(battlerAtk, chosenMove); + + if (IsBattleMoveStatus(chosenMove)) + { + u8 zEffect = GetMoveZEffect(chosenMove); + enum StatChange statChange = 0; + + if (zEffect == Z_EFFECT_CURSE) + { + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) + zEffect = Z_EFFECT_RECOVER_HP; + else + zEffect = Z_EFFECT_ATK_UP_1; + } + + switch (zEffect) + { + case Z_EFFECT_NONE: + return FALSE; + case Z_EFFECT_RESET_STATS: + if (CountNegativeStatStages(battlerAtk) > 1) + return TRUE; + break; + case Z_EFFECT_ALL_STATS_UP_1: + if (AreBattlersStatsMaxed(battlerAtk)) + return FALSE; + return IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK) > 0 + || IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK) > 0; + break; + case Z_EFFECT_BOOST_CRITS: + return TRUE; + case Z_EFFECT_FOLLOW_ME: + return HasPartnerIgnoreFlags(battlerAtk) && (GetHealthPercentage(battlerAtk) <= Z_EFFECT_FOLLOW_ME_THRESHOLD || GetBestNoOfHitsToKO(battlerDef, battlerAtk, AI_DEFENDING) == 1); + break; + case Z_EFFECT_RECOVER_HP: + return gAiLogicData->hpPercents[battlerAtk] <= Z_EFFECT_RESTORE_HP_THRESHOLD; + case Z_EFFECT_RESTORE_REPLACEMENT_HP: + break; + case Z_EFFECT_ACC_UP_1: + case Z_EFFECT_ACC_UP_2: + case Z_EFFECT_ACC_UP_3: + statChange = STAT_CHANGE_ACC; + break; + case Z_EFFECT_EVSN_UP_1: + case Z_EFFECT_EVSN_UP_2: + case Z_EFFECT_EVSN_UP_3: + statChange = STAT_CHANGE_EVASION; + break; + case Z_EFFECT_ATK_UP_1: + case Z_EFFECT_DEF_UP_1: + case Z_EFFECT_SPD_UP_1: + case Z_EFFECT_SPATK_UP_1: + case Z_EFFECT_SPDEF_UP_1: + statChange = STAT_CHANGE_ATK + zEffect - Z_EFFECT_ATK_UP_1; + break; + case Z_EFFECT_ATK_UP_2: + case Z_EFFECT_DEF_UP_2: + case Z_EFFECT_SPD_UP_2: + case Z_EFFECT_SPATK_UP_2: + case Z_EFFECT_SPDEF_UP_2: + statChange = STAT_CHANGE_ATK_2 + zEffect - Z_EFFECT_ATK_UP_2; + break; + case Z_EFFECT_ATK_UP_3: + case Z_EFFECT_DEF_UP_3: + case Z_EFFECT_SPD_UP_3: + case Z_EFFECT_SPATK_UP_3: + case Z_EFFECT_SPDEF_UP_3: + statChange = STAT_CHANGE_ATK_2 + zEffect - Z_EFFECT_ATK_UP_3; + break; + default: + return FALSE; + } + + if (statChange != 0 && IncreaseStatUpScore(battlerAtk, battlerDef, statChange) > 0) + return TRUE; + } + else if (GetMoveEffect(zMove) == EFFECT_EXTREME_EVOBOOST) + { + return (!AreBattlersStatsMaxed(battlerAtk) && (IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2) || IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_2))); + } + else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) + return FALSE; + + uq4_12_t effectiveness; struct SimulatedDamage dmg; if (gBattleMons[battlerDef].ability == ABILITY_DISGUISE @@ -4867,11 +4949,6 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) && gBattleMons[battlerDef].species == SPECIES_EISCUE_ICE && IsBattleMovePhysical(chosenMove)) return FALSE; // Don't waste a Z-Move busting Ice Face - if (IsBattleMoveStatus(chosenMove) && !IsBattleMoveStatus(zMove)) - return FALSE; - else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) - return FALSE; - dmg = AI_CalcDamageSaveBattlers(chosenMove, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK); if (!IsBattleMoveStatus(chosenMove) && dmg.minimum >= gBattleMons[battlerDef].hp) diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c index bf6b3cc3ec..0b74507b22 100644 --- a/test/battle/ai/gimmick_z_move.c +++ b/test/battle/ai/gimmick_z_move.c @@ -32,3 +32,94 @@ AI_SINGLE_BATTLE_TEST("AI does not use damaging Z-moves if the player would fain TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_NONE); } } } + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Splash") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_SPLASH); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SPLASH, gimmick: GIMMICK_Z_MOVE); + SCORE_GT_VAL(opponent, MOVE_SPLASH, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_EQ_VAL(opponent, MOVE_SPLASH, 90); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Happy Hour") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_HAPPY_HOUR); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_HAPPY_HOUR, gimmick: GIMMICK_Z_MOVE); + SCORE_GT_VAL(opponent, MOVE_HAPPY_HOUR, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_EQ_VAL(opponent, MOVE_HAPPY_HOUR, 90); } + } +} + +// Last Resort itself is missing logic! +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EEVEE) { Item(ITEM_EEVIUM_Z); Moves(MOVE_POUND, MOVE_LAST_RESORT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_EQ_VAL(opponent, MOVE_LAST_RESORT, 80); } +// Uncomment when Last Resort works correctly. +// TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- 10,000,000 Volt Thunderbolt") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); Moves(MOVE_THUNDERBOLT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_THUNDERBOLT, gimmick: GIMMICK_Z_MOVE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Destiny Bond is not used in singles") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_GHOSTIUM_Z); Moves(MOVE_DESTINY_BOND); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_DESTINY_BOND, gimmick: GIMMICK_NONE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI uses Z-Moves -- Z-Destiny Bond is used when about to die") +{ + u32 currentHP; + PARAMETRIZE { currentHP = 1; } + PARAMETRIZE { currentHP = 500; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_POUND); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(currentHP); Item(ITEM_GHOSTIUM_Z); Moves(MOVE_DESTINY_BOND); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (currentHP == 1) + TURN { EXPECT_MOVE(opponentLeft, MOVE_DESTINY_BOND, gimmick: GIMMICK_Z_MOVE); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_DESTINY_BOND, gimmick: GIMMICK_NONE); } + } +} + diff --git a/test/battle/move_effect/last_resort.c b/test/battle/move_effect/last_resort.c index c0b2380f27..602f4ad2a3 100644 --- a/test/battle/move_effect/last_resort.c +++ b/test/battle/move_effect/last_resort.c @@ -114,3 +114,43 @@ SINGLE_BATTLE_TEST("Last Resort works with Sleep Talk") HP_BAR(opponent); } } + +AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 2 moves") +{ + KNOWN_FAILING; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_SCRATCH); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 3 moves") +{ + KNOWN_FAILING; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_QUICK_ATTACK, MOVE_SCRATCH); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 4 moves") +{ + KNOWN_FAILING; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_QUICK_ATTACK, MOVE_SCRATCH, MOVE_GUST); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } + } +} + From 8486e0e045bf12cf7d2c28a77144dd1cdc62e618 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 7 Sep 2025 19:30:00 +0100 Subject: [PATCH 026/183] Fixes Weak Armor and items not displaying stat change attributes (#7701) --- data/battle_scripts_1.s | 239 +++++++++++------------- include/battle_message.h | 1 + include/battle_scripts.h | 1 - include/battle_util.h | 1 - include/constants/battle_string_ids.h | 31 +-- src/battle_message.c | 45 +++-- src/battle_script_commands.c | 56 +++--- src/battle_util.c | 121 ++++++------ test/battle/ability/weak_armor.c | 16 +- test/battle/hold_effect/restore_stats.c | 4 +- test/text.c | 2 - 11 files changed, 228 insertions(+), 289 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index fcd44ec92f..b1b7c76616 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -477,7 +477,7 @@ BattleScript_EffectAttackUpUserAlly_TryAlly_: jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_EffectAttackUpUserAlly_TryAllyBlocked setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_End - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectAttackUpUserAlly_AllyString + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectAttackUpUserAlly_AllyString pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER waitmessage B_WAIT_TIME_LONG @@ -1108,7 +1108,7 @@ BattleScript_StrengthSapAnimation: attackanimation waitanimation statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_StrengthSapHp - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StrengthSapHp + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_StrengthSapHp printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @ Drain HP without lowering a stat @@ -1137,7 +1137,7 @@ BattleScript_StrengthSapLiquidOoze: goto BattleScript_MoveEnd BattleScript_StrengthSapMustLower: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_MoveEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_MoveEnd goto BattleScript_StrengthSapAnimation BattleScript_MoveEffectIncinerate:: @@ -1184,19 +1184,19 @@ BattleScript_VCreateStatLoss:: BattleScript_VCreateStatAnim: setstatchanger STAT_DEF, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateTrySpDef, BIT_SPDEF | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VCreateTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateTrySpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VCreateTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateTrySpeed: setstatchanger STAT_SPEED, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_VCreateStatLossRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VCreateStatLossRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VCreateStatLossRet: @@ -1298,14 +1298,14 @@ BattleScript_EffectMagneticFluxTryDef: BattleScript_EffectMagneticFluxSkipAnim: setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxTrySpDef, BIT_SPDEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectMagneticFluxTrySpDef addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMagneticFluxTrySpDef: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMagneticFluxLoop - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectMagneticFluxLoop + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectMagneticFluxLoop addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1333,14 +1333,14 @@ BattleScript_EffectGearUpTryAtk: BattleScript_EffectGearUpSkipAnim: setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpTrySpAtk, BIT_SPATK - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectGearUpTrySpAtk addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectGearUpTrySpAtk: setstatchanger STAT_SPATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectGearUpLoop - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectGearUpLoop + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectGearUpLoop addbyte gBattleCommunication, 1 printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG @@ -1396,8 +1396,8 @@ BattleScript_FlowerShieldLoop: BattleScript_FlowerShieldLoop2: setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_FlowerShieldMoveTargetEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlowerShieldDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_FlowerShieldMoveTargetEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_FlowerShieldDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_FlowerShieldMoveTargetEnd pause 21 goto BattleScript_FlowerShieldString BattleScript_FlowerShieldDoAnim: @@ -1429,13 +1429,13 @@ BattleScript_RototillerCheckAffected: jumpifnotrototilleraffected BattleScript_RototillerNoEffect setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk, BIT_SPATK - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RototillerTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RototillerMoveTargetEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RototillerMoveTargetEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RototillerMoveTargetEnd: @@ -1556,8 +1556,8 @@ BattleScript_DefogIfCanClearHazards: BattleScript_DefogWorks: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefogDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_DefogTryHazardsWithAnim + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefogDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_DefogTryHazardsWithAnim pause B_WAIT_TIME_SHORT goto BattleScript_DefogPrintString BattleScript_DefogDoAnim:: @@ -1593,7 +1593,7 @@ BattleScript_EffectAutotomize:: setstatchanger STAT_SPEED, 2, FALSE attackcanceler statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_AutotomizeWeightLoss - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AutotomizeAttackAnim + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AutotomizeAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_AutotomizePrintString BattleScript_AutotomizeAttackAnim:: @@ -1638,8 +1638,8 @@ BattleScript_EffectToxicThread:: waitanimation setstatchanger STAT_SPEED, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ToxicThreadTryPsn - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_ToxicThreadDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_ToxicThreadTryPsn + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ToxicThreadDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_ToxicThreadTryPsn pause B_WAIT_TIME_SHORT goto BattleScript_ToxicThreadPrintString BattleScript_ToxicThreadDoAnim:: @@ -1665,19 +1665,19 @@ BattleScript_VenomDrenchDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpAtk, BIT_SPATK | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VenomDrenchTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpAtk:: setstatchanger STAT_SPATK, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchTryLowerSpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchTryLowerSpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VenomDrenchTryLowerSpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchTryLowerSpeed:: setstatchanger STAT_SPEED, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_VenomDrenchEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VenomDrenchEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VenomDrenchEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VenomDrenchEnd:: @@ -1693,13 +1693,13 @@ BattleScript_NobleRoarDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarTryLowerSpAtk, BIT_SPATK - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarTryLowerSpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_NobleRoarTryLowerSpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarTryLowerSpAtk:: setstatchanger STAT_SPATK, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_NobleRoarEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_NobleRoarEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_NobleRoarEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_NobleRoarEnd:: @@ -1717,31 +1717,31 @@ BattleScript_ShellSmashTryDef:: waitanimation setstatchanger STAT_DEF, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_ShellSmashTrySpDef, BIT_SPDEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpDef: setstatchanger STAT_SPDEF, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_ShellSmashTryAttack - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTryAttack + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTryAttack printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTryAttack: setstatchanger STAT_ATK, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpAtk, BIT_SPATK | BIT_SPEED, - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpAtk: setstatchanger STAT_SPATK, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashTrySpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashTrySpeed: setstatchanger STAT_SPEED, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShellSmashEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShellSmashEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShellSmashEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShellSmashEnd: @@ -1767,7 +1767,7 @@ BattleScript_GrowthAtk2: setstatchanger STAT_ATK, 2, FALSE BattleScript_GrowthAtk: statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthTrySpAtk, BIT_SPATK - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GrowthTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GrowthTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthTrySpAtk:: @@ -1778,7 +1778,7 @@ BattleScript_GrowthSpAtk2: setstatchanger STAT_SPATK, 2, FALSE BattleScript_GrowthSpAtk: statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GrowthEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GrowthEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GrowthEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GrowthEnd: @@ -1831,13 +1831,13 @@ BattleScript_ShiftGearSpeedBy1: setstatchanger STAT_SPEED, 1, FALSE BattleScript_ShiftGearDoSpeed: statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearTryAtk, BIT_ATK - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearTryAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShiftGearTryAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearTryAtk: setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_ShiftGearEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_ShiftGearEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_ShiftGearEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ShiftGearEnd: @@ -1853,19 +1853,19 @@ BattleScript_CoilDoMoveAnim: waitanimation setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryDef, BIT_DEF | BIT_ACC - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CoilTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryDef: setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilTryAcc, BIT_ACC - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilTryAcc + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CoilTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilTryAcc: setstatchanger STAT_ACC, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CoilEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CoilEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CoilEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CoilEnd: @@ -1881,19 +1881,19 @@ BattleScript_QuiverDanceDoMoveAnim:: waitanimation setstatchanger STAT_SPATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpDef, BIT_SPDEF | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_QuiverDanceTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceTrySpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_QuiverDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_QuiverDanceEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_QuiverDanceEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_QuiverDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_QuiverDanceEnd:: @@ -1909,19 +1909,19 @@ BattleScript_VictoryDanceDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTryDef, BIT_DEF | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTryDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VictoryDanceTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTryDef:: setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceTrySpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VictoryDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_VictoryDanceEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VictoryDanceEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_VictoryDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_VictoryDanceEnd:: @@ -1936,13 +1936,13 @@ BattleScript_AttackSpAttackUpDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpTrySpAtk, BIT_SPATK - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackSpAttackUpTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackSpAttackUpEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackSpAttackUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackSpAttackUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackSpAttackUpEnd: @@ -1957,13 +1957,13 @@ BattleScript_AttackAccUpDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpTryAcc, BIT_ACC - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpTryAcc + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackAccUpTryAcc printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpTryAcc:: setstatchanger STAT_ACC, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_AttackAccUpEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackAccUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackAccUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AttackAccUpEnd: @@ -2423,7 +2423,7 @@ BattleScript_EffectCaptivate:: goto BattleScript_ButItFailed BattleScript_CaptivateCheckAcc: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_StatDownFromAttackString + goto BattleScript_EffectStatDownFromStatBuffChange BattleScript_EffectHealBlock:: attackcanceler @@ -2670,7 +2670,7 @@ BattleScript_EffectStatUp:: attackcanceler BattleScript_EffectStatUpAfterAtkCanceler:: statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpAttackAnim + jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatUpAttackAnim pause B_WAIT_TIME_SHORT goto BattleScript_StatUpPrintString BattleScript_StatUpAttackAnim:: @@ -2720,11 +2720,10 @@ BattleScript_EffectStatDown: jumpifsubstituteblocks BattleScript_ButItFailed BattleScript_EffectStatDownFromAccCheck: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE -BattleScript_StatDownFromAttackString: BattleScript_EffectStatDownFromStatBuffChange: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatDownEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_StatDownDoAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StatDownEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatDownDoAnim + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_StatDownEnd pause B_WAIT_TIME_SHORT goto BattleScript_StatDownPrintString BattleScript_StatDownDoAnim:: @@ -2744,7 +2743,7 @@ BattleScript_MirrorArmorReflect:: jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_MirrorArmorDoesntAffect BattleScript_MirrorArmorReflectStatLoss: statbuffchange BS_ATTACKER, STAT_CHANGE_MIRROR_ARMOR | STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorArmorReflectEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_MirrorArmorReflectPrintString + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_MirrorArmorReflectPrintString goto BattleScript_MirrorArmorReflectWontFall BattleScript_MirrorArmorReflectPrintString: printfromtable gStatDownStringIds @@ -3100,19 +3099,19 @@ BattleScript_GeomancyDoMoveAnim:: waitanimation setstatchanger STAT_SPATK, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpDef, BIT_SPDEF | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GeomancyTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpDef:: setstatchanger STAT_SPDEF, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyTrySpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GeomancyTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyTrySpeed:: setstatchanger STAT_SPEED, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_GeomancyEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_GeomancyEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_GeomancyEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_GeomancyEnd:: @@ -3555,7 +3554,7 @@ BattleScript_EffectSwagger:: waitanimation setstatchanger STAT_ATK, 2, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_SwaggerTryConfuse - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_SwaggerTryConfuse + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_SwaggerTryConfuse printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_SwaggerTryConfuse: @@ -3856,7 +3855,7 @@ BattleScript_EffectDefenseCurl:: setvolatile BS_TARGET, VOLATILE_DEFENSE_CURL setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefenseCurlDoStatUpAnim - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpPrintString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatUpPrintString attackanimation waitanimation BattleScript_DefenseCurlDoStatUpAnim:: @@ -3939,13 +3938,13 @@ BattleScript_EffectStockpile:: BattleScript_EffectStockpileDef: setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef, BIT_SPDEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileSpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectStockpileSpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileSpDef:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectStockpileEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectStockpileEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileEnd: @@ -4039,7 +4038,7 @@ BattleScript_EffectFlatter:: waitanimation setstatchanger STAT_SPATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_FlatterTryConfuse - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_FlatterTryConfuse + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_FlatterTryConfuse printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FlatterTryConfuse:: @@ -4081,15 +4080,15 @@ BattleScript_EffectMemento:: jumpifsubstituteblocks BattleScript_EffectMementoPrintNoEffect setstatchanger STAT_ATK, 2, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTrySpAtk, BIT_SPATK -@ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTrySpAtk +@ Greater than B_MSG_DEFENDER_STAT_CHANGED is checking if the stat cannot decrease + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_EffectMementoTrySpAtk printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTrySpAtk: setstatchanger STAT_SPATK, 2, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectMementoTryFaint -@ Greater than B_MSG_DEFENDER_STAT_FELL is checking if the stat cannot decrease - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_EffectMementoTryFaint +@ Greater than B_MSG_DEFENDER_STAT_CHANGED is checking if the stat cannot decrease + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_EffectMementoTryFaint printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectMementoTryFaint: @@ -4138,7 +4137,7 @@ BattleScript_EffectCharge:: .if B_CHARGE_SPDEF_RAISE >= GEN_5 setstatchanger STAT_SPDEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectChargeString - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectChargeString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectChargeString printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectChargeString: @@ -4374,13 +4373,13 @@ BattleScript_TickleDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TickleTryLowerDef, BIT_DEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleTryLowerDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_TickleTryLowerDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleTryLowerDef:: setstatchanger STAT_DEF, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TickleEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_TickleEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_TickleEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_TickleEnd:: @@ -4402,13 +4401,13 @@ BattleScript_CosmicPowerDoMoveAnim:: waitanimation setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerTrySpDef, BIT_SPDEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CosmicPowerTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CosmicPowerEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CosmicPowerEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CosmicPowerEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CosmicPowerEnd:: @@ -4423,13 +4422,13 @@ BattleScript_BulkUpDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpTryDef, BIT_DEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpTryDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_BulkUpTryDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpTryDef:: setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_BulkUpEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_BulkUpEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_BulkUpEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_BulkUpEnd:: @@ -4446,13 +4445,13 @@ BattleScript_CalmMindDoMoveAnim:: BattleScript_CalmMindStatRaise:: setstatchanger STAT_SPATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindTrySpDef, BIT_SPDEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CalmMindTrySpDef printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindTrySpDef:: setstatchanger STAT_SPDEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CalmMindEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CalmMindEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CalmMindEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CalmMindEnd:: @@ -4475,13 +4474,13 @@ BattleScript_DragonDanceDoMoveAnim:: waitanimation setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceTrySpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DragonDanceTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceTrySpeed:: setstatchanger STAT_SPEED, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_DragonDanceEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DragonDanceEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DragonDanceEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DragonDanceEnd:: @@ -5149,13 +5148,13 @@ BattleScript_WeaknessPolicyAtk: waitanimation setstatchanger STAT_ATK, 2, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicySpAtk, BIT_SPATK - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeaknessPolicySpAtk printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG BattleScript_WeaknessPolicySpAtk: setstatchanger STAT_SPATK, 2, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeaknessPolicyRemoveItem - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeaknessPolicyRemoveItem + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeaknessPolicyRemoveItem printstring STRINGID_USINGITEMSTATOFPKMNROSE waitmessage B_WAIT_TIME_LONG BattleScript_WeaknessPolicyRemoveItem: @@ -5166,7 +5165,7 @@ BattleScript_WeaknessPolicyEnd: BattleScript_TargetItemStatRaise:: copybyte sBATTLER, gBattlerTarget statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_TargetItemStatRaiseRemoveItemRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_TargetItemStatRaiseRemoveItemRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_TargetItemStatRaiseRemoveItemRet playanimation BS_TARGET, B_ANIM_HELD_ITEM_EFFECT waitanimation statbuffchange BS_TARGET, 0, BattleScript_TargetItemStatRaiseRemoveItemRet @@ -5179,7 +5178,7 @@ BattleScript_TargetItemStatRaiseRemoveItemRet: BattleScript_AttackerItemStatRaise:: copybyte sBATTLER, gBattlerAttacker statbuffchange BS_ATTACKER, STAT_CHANGE_ONLY_CHECKING, BattleScript_AttackerItemStatRaiseRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AttackerItemStatRaiseRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AttackerItemStatRaiseRet playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation statbuffchange BS_ATTACKER, 0, BattleScript_AttackerItemStatRaiseRet @@ -5339,7 +5338,7 @@ BattleScript_StickyWebOnSwitchIn:: waitmessage B_WAIT_TIME_LONG jumpifability BS_TARGET, ABILITY_MIRROR_ARMOR, BattleScript_MirrorArmorReflectStickyWeb statbuffchange BS_TARGET, STAT_CHANGE_CHECK_PREVENTION | STAT_CHANGE_ALLOW_PTR, BattleScript_StickyWebOnSwitchInEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_StickyWebOnSwitchInEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_StickyWebOnSwitchInEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_StickyWebOnSwitchInEnd: @@ -5771,7 +5770,7 @@ BattleScript_PrintMonIsRootedRet:: BattleScript_AtkDefDown:: setstatchanger STAT_ATK, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_AtkDefDownTryDef, BIT_DEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_AtkDefDownTryDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_AtkDefDownTryDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_AtkDefDownTryDef: @@ -5785,13 +5784,13 @@ BattleScript_AtkDefDownRet: BattleScript_DefSpDefDown:: setstatchanger STAT_DEF, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownTrySpDef, BIT_SPDEF - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownTrySpDef + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefSpDefDownTrySpDef printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownTrySpDef:: setstatchanger STAT_SPDEF, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_ALLOW_PTR, BattleScript_DefSpDefDownRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_DefSpDefDownRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefSpDefDownRet printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefSpDefDownRet:: @@ -5803,13 +5802,13 @@ BattleScript_DefDownSpeedUp:: BattleScript_DefDownSpeedUpTryDef:: setstatchanger STAT_DEF, 1, TRUE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_DefDownSpeedUpTrySpeed - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefDownSpeedUpTrySpeed printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefDownSpeedUpTrySpeed: setstatchanger STAT_SPEED, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_CERTAIN, BattleScript_DefDownSpeedUpRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_DefDownSpeedUpRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefDownSpeedUpRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_DefDownSpeedUpRet:: @@ -6091,7 +6090,7 @@ BattleScript_CottonDownLoop: setstatchanger STAT_SPEED, 1, TRUE jumpifbyteequal gBattlerTarget, gEffectBattler, BattleScript_CottonDownLoopIncrement statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_CottonDownLoopIncrement - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_CottonDownTargetSpeedCantGoLower + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CottonDownTargetSpeedCantGoLower printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_CottonDownLoopIncrement @@ -6251,7 +6250,7 @@ BattleScript_MoveUsedFlinchedEnd: BattleScript_TryActivateSteadFast: setstatchanger STAT_SPEED, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_MoveUsedFlinchedEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_MoveUsedFlinchedEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_MoveUsedFlinchedEnd copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveUsedFlinchedEnd @@ -6571,14 +6570,6 @@ BattleScript_AbilityPopUpOverwriteThenNormal: setbyte sFIXED_ABILITY_POPUP, FALSE return -BattleScript_SpeedBoostActivates:: - call BattleScript_AbilityPopUp - statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_SpeedBoostActivatesEnd - printstring STRINGID_PKMNRAISEDSPEED - waitmessage B_WAIT_TIME_LONG -BattleScript_SpeedBoostActivatesEnd: - end3 - @ Can't compare directly to a value, have to compare to value at pointer sZero: .byte 0 @@ -6587,14 +6578,14 @@ BattleScript_MoodyActivates:: call BattleScript_AbilityPopUp jumpifbyteequal sSTATCHANGER, sZero, BattleScript_MoodyLower statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyLower - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_MoodyLower + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_MoodyLower printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyLower: jumpifbyteequal sSAVED_STAT_CHANGER, sZero, BattleScript_MoodyEnd copybyte sSTATCHANGER, sSAVED_STAT_CHANGER statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN | STAT_CHANGE_NOT_PROTECT_AFFECTED, BattleScript_MoodyEnd - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_FELL, BattleScript_MoodyEnd + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_MoodyEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyEnd: @@ -6803,8 +6794,7 @@ BattleScript_IntimidateEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_ATK, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_IntimidateLoopIncrement - jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_IntimidateContrary - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_IntimidateWontDecrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_IntimidateWontDecrease printstring STRINGID_PKMNCUTSATTACKWITH BattleScript_IntimidateEffect_WaitString: waitmessage B_WAIT_TIME_LONG @@ -6834,10 +6824,6 @@ BattleScript_IntimidateWontDecrease: printstring STRINGID_STATSWONTDECREASE goto BattleScript_IntimidateEffect_WaitString -BattleScript_IntimidateContrary: - printfromtable gStatUpStringIds - goto BattleScript_IntimidateEffect_WaitString - BattleScript_IntimidateInReverse:: copybyte sBATTLER, gBattlerTarget call BattleScript_AbilityPopUpTarget @@ -6860,8 +6846,7 @@ BattleScript_SupersweetSyrupEffect: copybyte sBATTLER, gBattlerAttacker setstatchanger STAT_EVASION, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_ALLOW_PTR, BattleScript_SupersweetSyrupLoopIncrement - jumpifability BS_TARGET, ABILITY_CONTRARY, BattleScript_SupersweetSyrupContrary - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_SupersweetSyrupWontDecrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_SupersweetSyrupWontDecrease printfromtable gStatDownStringIds BattleScript_SupersweetSyrupEffect_WaitString: waitmessage B_WAIT_TIME_LONG @@ -6885,10 +6870,6 @@ BattleScript_SupersweetSyrupWontDecrease: printstring STRINGID_STATSWONTDECREASE goto BattleScript_SupersweetSyrupEffect_WaitString -BattleScript_SupersweetSyrupContrary: - printfromtable gStatUpStringIds - goto BattleScript_SupersweetSyrupEffect_WaitString - BattleScript_DroughtActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp @@ -6981,31 +6962,31 @@ BattleScript_CommanderActivates:: BattleScript_CommanderAtkIncrease: setstatchanger STAT_ATK, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderDefIncrease, BIT_DEF | BIT_SPATK | BIT_SPDEF | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderDefIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderDefIncrease: setstatchanger STAT_DEF, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpAtkIncrease, BIT_SPATK | BIT_SPDEF | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpAtkIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderSpAtkIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpAtkIncrease: setstatchanger STAT_SPATK, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpDefIncrease, BIT_SPDEF | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpDefIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderSpDefIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpDefIncrease: setstatchanger STAT_SPDEF, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderSpeedIncrease, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderSpeedIncrease + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderSpeedIncrease printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderSpeedIncrease: setstatchanger STAT_SPEED, 2, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_CommanderEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_CommanderEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_CommanderEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_CommanderEnd: @@ -7290,7 +7271,7 @@ BattleScript_AbilityNoSpecificStatLoss:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXPREVENTSYLOSS waitmessage B_WAIT_TIME_LONG - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY + setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY setmoveresultflags MOVE_RESULT_NO_EFFECT return @@ -7377,7 +7358,7 @@ BattleScript_BattlerAbilityStatRaiseOnSwitchIn:: call BattleScript_AbilityPopUpScripting statbuffchange BS_SCRIPTING, STAT_CHANGE_NOT_PROTECT_AFFECTED | STAT_CHANGE_CERTAIN, BattleScript_BattlerAbilityStatRaiseOnSwitchInRet waitanimation - printstring STRINGID_BATTLERABILITYRAISEDSTAT + printstring STRINGID_SCRIPTINGABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_BattlerAbilityStatRaiseOnSwitchInRet: end3 @@ -7398,8 +7379,8 @@ BattleScript_WeakArmorActivates:: call BattleScript_AbilityPopUp setstatchanger STAT_DEF, 1, TRUE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_WeakArmorDefPrintString - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeakArmorDefPrintString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_WeakArmorActivatesSpeed pause B_WAIT_TIME_SHORTEST printfromtable gStatDownStringIds clearmoveresultflags MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased @@ -7415,8 +7396,8 @@ BattleScript_WeakArmorActivatesSpeed: setstatchanger STAT_SPEED, 1, FALSE .endif statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd - jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedPrintString - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd + jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_WeakArmorSpeedPrintString + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_WeakArmorActivatesEnd pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER clearmoveresultflags MOVE_RESULT_MISSED @@ -7449,7 +7430,7 @@ BattleScript_AttackerAbilityStatRaise_End: BattleScript_FellStingerRaisesStat:: statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_FellStingerRaisesAtkEnd - jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_ROSE, BattleScript_FellStingerRaisesAtkEnd + jumpifbyte CMP_GREATER_THAN, cMULTISTRING_CHOOSER, B_MSG_DEFENDER_STAT_CHANGED, BattleScript_FellStingerRaisesAtkEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_FellStingerRaisesAtkEnd: @@ -7604,19 +7585,19 @@ BattleScript_EffectBattleBondStatIncrease:: call BattleScript_AbilityPopUp setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpAtk, BIT_SPATK | BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpAtk + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectBattleBondStatIncreaseTrySpAtk printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseTrySpAtk: setstatchanger STAT_SPATK, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseTrySpeed, BIT_SPEED - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseTrySpeed + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectBattleBondStatIncreaseTrySpeed printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseTrySpeed: setstatchanger STAT_SPEED, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectBattleBondStatIncreaseRet - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectBattleBondStatIncreaseRet + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectBattleBondStatIncreaseRet printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_EffectBattleBondStatIncreaseRet: @@ -8016,7 +7997,7 @@ BattleScript_ConsumableStatRaiseRet_Anim: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ConsumableStatRaiseRet_End playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM + setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGED_ITEM call BattleScript_StatUp removeitem BS_SCRIPTING BattleScript_ConsumableStatRaiseRet_End: @@ -8343,7 +8324,7 @@ BattleScript_RecoverHPZMove:: BattleScript_StatUpZMove:: statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpZMoveEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_StatUpZMoveEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatUpZMoveEnd printstring STRINGID_ZMOVESTATUP waitmessage B_WAIT_TIME_LONG printfromtable gStatUpStringIds @@ -8665,7 +8646,7 @@ BattleScript_EffectRaiseStatAllies:: BattleScript_RaiseSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_RaiseSideStatsIncrement statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_RaiseSideStatsIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RaiseSideStatsIncrement printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG BattleScript_RaiseSideStatsIncrement: @@ -8681,7 +8662,7 @@ BattleScript_EffectLowerStatFoes:: BattleScript_LowerSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_LowerSideStatsIncrement statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_LowerSideStatsIncrement + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_LowerSideStatsIncrement printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_LowerSideStatsIncrement: @@ -9008,7 +8989,7 @@ BattleScript_BerserkGeneRet:: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_BerserkGeneRet_TryConfuse playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM + setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGED_ITEM call BattleScript_StatUp BattleScript_BerserkGeneRet_TryConfuse: jumpifability BS_ATTACKER, ABILITY_OWN_TEMPO, BattleScript_BerserkGeneRet_OwnTempoPrevents diff --git a/include/battle_message.h b/include/battle_message.h index 28be583551..1ce67ee17c 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -334,5 +334,6 @@ extern const u8 gText_BattleTourney[]; extern const u16 gMissStringIds[]; extern const u16 gStatUpStringIds[]; +extern const u16 gStatDownStringIds[]; #endif // GUARD_BATTLE_MESSAGE_H diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 5a62556be3..00bce64623 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -167,7 +167,6 @@ extern const u8 BattleScript_DoRecoil33[]; extern const u8 BattleScript_Recoil33End[]; extern const u8 BattleScript_ItemSteal[]; extern const u8 BattleScript_DrizzleActivates[]; -extern const u8 BattleScript_SpeedBoostActivates[]; extern const u8 BattleScript_TraceActivates[]; extern const u8 BattleScript_RainDishActivates[]; extern const u8 BattleScript_SandstreamActivates[]; diff --git a/include/battle_util.h b/include/battle_util.h index 1fe67a1cd6..745ad9a7f8 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -333,7 +333,6 @@ bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes); void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast); bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind); bool32 TryRoomService(u32 battler); -void BufferStatChange(u32 battler, u8 statId, enum StringID stringId); bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); u16 GetUsedHeldItem(u32 battler); bool32 PickupHasValidTarget(u32 battler); diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 228d7c8571..83175f285f 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -191,7 +191,6 @@ enum StringID STRINGID_PKMNWAITSFORTARGET, STRINGID_PKMNSNATCHEDMOVE, STRINGID_PKMNMADEITRAIN, - STRINGID_PKMNRAISEDSPEED, STRINGID_PKMNPROTECTEDBY, STRINGID_PKMNPREVENTSUSAGE, STRINGID_PKMNRESTOREDHPUSING, @@ -317,6 +316,7 @@ enum StringID STRINGID_SOOTHINGAROMA, STRINGID_ITEMSCANTBEUSEDNOW, STRINGID_USINGITEMSTATOFPKMNROSE, + STRINGID_USINGITEMSTATOFPKMNFELL, STRINGID_PKMNUSEDXTOGETPUMPED, STRINGID_PKMNSXMADEYUSELESS, STRINGID_PKMNTRAPPEDBYSANDTOMB, @@ -407,10 +407,8 @@ enum StringID STRINGID_FELLSTRAIGHTDOWN, STRINGID_TARGETCHANGEDTYPE, STRINGID_PKMNACQUIREDSIMPLE, - STRINGID_EMPTYSTRING5, STRINGID_KINDOFFER, STRINGID_RESETSTARGETSSTATLEVELS, - STRINGID_EMPTYSTRING6, STRINGID_ALLYSWITCHPOSITION, STRINGID_RESTORETARGETSHEALTH, STRINGID_TOOKPJMNINTOTHESKY, @@ -541,10 +539,8 @@ enum StringID STRINGID_COMATOSEENTERS, STRINGID_SCREENCLEANERENTERS, STRINGID_FETCHEDPOKEBALL, - STRINGID_BATTLERABILITYRAISEDSTAT, STRINGID_ASANDSTORMKICKEDUP, STRINGID_PKMNSWILLPERISHIN3TURNS, - STRINGID_ABILITYRAISEDSTATDRASTICALLY, STRINGID_AURAFLAREDTOLIFE, STRINGID_ASONEENTERS, STRINGID_CURIOUSMEDICINEENTERS, @@ -729,33 +725,24 @@ enum StringID // They are assigned to the MULTISTRING_CHOOSER byte of gBattleCommunication // and read when e.g. the command printfromtable is used. -// gStatUpStringIds -enum StatUpStringID +// gStatUpStringIds and gStatDownStringIds +enum StatChangedStringID { - B_MSG_ATTACKER_STAT_ROSE, - B_MSG_DEFENDER_STAT_ROSE, - B_MSG_STAT_WONT_INCREASE, - B_MSG_STAT_ROSE_EMPTY, - B_MSG_STAT_ROSE_ITEM, + B_MSG_ATTACKER_STAT_CHANGED, + B_MSG_DEFENDER_STAT_CHANGED, + B_MSG_STAT_WONT_CHANGE, + B_MSG_STAT_CHANGE_EMPTY, + B_MSG_STAT_CHANGED_ITEM, B_MSG_USED_DIRE_HIT, }; -// gStatDownStringIds -enum StatDownStringID -{ - B_MSG_ATTACKER_STAT_FELL = 0, - B_MSG_DEFENDER_STAT_FELL = 1, - B_MSG_STAT_WONT_DECREASE, - B_MSG_STAT_FELL_EMPTY, -}; - // gMissStringIds enum MissStringID { B_MSG_MISSED, B_MSG_PROTECTED, B_MSG_AVOIDED_ATK, - // Ability-related messages need to below this comment + // Ability-related messages need to be below this comment B_MSG_AVOIDED_DMG, B_MSG_GROUND_MISS, }; diff --git a/src/battle_message.c b/src/battle_message.c index 297cbc48c0..f3d804dec5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -67,7 +67,7 @@ const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1} is preventing switching const u8 gText_StatSharply[] = _("sharply "); const u8 gText_StatRose[] = _("rose!"); const u8 gText_StatFell[] = _("fell!"); -const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"); +const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}rose!"); static const u8 sText_GotAwaySafely[] = _("{PLAY_SE SE_FLEE}You got away safely!\p"); static const u8 sText_PlayerDefeatedLinkTrainer[] = _("You defeated {B_LINK_OPPONENT1_NAME}!"); static const u8 sText_TwoLinkTrainersDefeated[] = _("You defeated {B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}!"); @@ -350,7 +350,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNWAITSFORTARGET] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} waits for a target to make a move!"), [STRINGID_PKMNSNATCHEDMOVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} snatched {B_SCR_NAME_WITH_PREFIX2}'s move!"), [STRINGID_PKMNMADEITRAIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} made it rain!"), //not in gen 5+, ability popup - [STRINGID_PKMNRAISEDSPEED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its Speed!"), //not in gen 5+, ability popup [STRINGID_PKMNPROTECTEDBY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was protected by {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSUSAGE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents {B_ATK_NAME_WITH_PREFIX2} from using {B_CURRENT_MOVE}!"), //I don't see this in SV text [STRINGID_PKMNRESTOREDHPUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} restored HP using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup @@ -367,10 +366,10 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_STATROSE] = gText_StatRose, [STRINGID_STATHARSHLY] = COMPOUND_STRING("harshly "), [STRINGID_STATFELL] = gText_StatFell, - [STRINGID_ATTACKERSSTATROSE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"), + [STRINGID_ATTACKERSSTATROSE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}rose!"), [STRINGID_DEFENDERSSTATROSE] = gText_DefendersStatRose, - [STRINGID_ATTACKERSSTATFELL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"), - [STRINGID_DEFENDERSSTATFELL] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}"), + [STRINGID_ATTACKERSSTATFELL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}fell!"), + [STRINGID_DEFENDERSSTATFELL] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}fell!"), [STRINGID_CRITICALHIT] = COMPOUND_STRING("A critical hit!"), [STRINGID_ONEHITKO] = COMPOUND_STRING("It's a one-hit KO!"), [STRINGID_123POOF] = COMPOUND_STRING("One…{PAUSE 10}two…{PAUSE 10}and…{PAUSE 10}{PAUSE 20}{PLAY_SE SE_BALL_BOUNCE_1}ta-da!\p"), @@ -475,7 +474,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PLAYERDEFEATEDTRAINER1] = sText_PlayerDefeatedLinkTrainerTrainer1, [STRINGID_SOOTHINGAROMA] = COMPOUND_STRING("A soothing aroma wafted through the area!"), [STRINGID_ITEMSCANTBEUSEDNOW] = COMPOUND_STRING("Items can't be used now.{PAUSE 64}"), //not in gen 5+, i think - [STRINGID_USINGITEMSTATOFPKMNROSE] = COMPOUND_STRING("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}"), //todo: update this, will require code changes + [STRINGID_USINGITEMSTATOFPKMNROSE] = COMPOUND_STRING("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}rose!"), //todo: update this, will require code changes + [STRINGID_USINGITEMSTATOFPKMNFELL] = COMPOUND_STRING("Using {B_LAST_ITEM}, the {B_BUFF1} of {B_SCR_NAME_WITH_PREFIX2} {B_BUFF2}fell!"), [STRINGID_PKMNUSEDXTOGETPUMPED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used the {B_LAST_ITEM} to get pumped!"), [STRINGID_PKMNSXMADEYUSELESS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made {B_CURRENT_MOVE} useless!"), //not in gen 5+, ability popup [STRINGID_PKMNTRAPPEDBYSANDTOMB] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} became trapped by the quicksand!"), @@ -566,10 +566,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_FELLSTRAIGHTDOWN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fell straight down!"), [STRINGID_TARGETCHANGEDTYPE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} transformed into the {B_BUFF1} type!"), [STRINGID_PKMNACQUIREDSIMPLE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} acquired Simple!"), //shouldn't directly use the name - [STRINGID_EMPTYSTRING5] = sText_EmptyString4, [STRINGID_KINDOFFER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} took the kind offer!"), [STRINGID_RESETSTARGETSSTATLEVELS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s stat changes were removed!"), - [STRINGID_EMPTYSTRING6] = sText_EmptyString4, [STRINGID_ALLYSWITCHPOSITION] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} and {B_SCR_NAME_WITH_PREFIX2} switched places!"), [STRINGID_RESTORETARGETSHEALTH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s HP was restored!"), [STRINGID_TOOKPJMNINTOTHESKY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} took {B_DEF_NAME_WITH_PREFIX2} into the sky!"), @@ -594,9 +592,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_MISTYTERRAINENDS] = COMPOUND_STRING("The mist disappeared from the battlefield."), [STRINGID_PSYCHICTERRAINENDS] = COMPOUND_STRING("The weirdness disappeared from the battlefield!"), [STRINGID_GRASSYTERRAINENDS] = COMPOUND_STRING("The grass disappeared from the battlefield."), - [STRINGID_TARGETABILITYSTATRAISE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_TARGETABILITYSTATRAISE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} {B_BUFF2}raised its {B_BUFF1}!"), [STRINGID_TARGETSSTATWASMAXEDOUT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} maxed its {B_BUFF1}!"), - [STRINGID_ATTACKERABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_ATTACKERABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} {B_BUFF2}raised its {B_BUFF1}!"), [STRINGID_POISONHEALHPUP] = COMPOUND_STRING("The poisoning healed {B_ATK_NAME_WITH_PREFIX2} a little bit!"), //don't think this message is displayed anymore [STRINGID_BADDREAMSDMG] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is tormented!"), [STRINGID_MOLDBREAKERENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} breaks the mold!"), @@ -626,7 +624,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_LUNARDANCECAMETRUE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became cloaked in mystical moonlight!"), [STRINGID_CUSEDBODYDISABLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled by {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY}!"), [STRINGID_ATTACKERACQUIREDABILITY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} acquired {B_ATK_ABILITY}!"), - [STRINGID_TARGETABILITYSTATLOWER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} lowered its {B_BUFF1}!"), + [STRINGID_TARGETABILITYSTATLOWER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} {B_BUFF2}lowered its {B_BUFF1}!"), [STRINGID_TARGETSTATWONTGOHIGHER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} won't go any higher!"), [STRINGID_PKMNMOVEBOUNCEDABILITY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} was bounced back by {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY}!"), [STRINGID_IMPOSTERTRANSFORM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into {B_DEF_NAME_WITH_PREFIX2} using {B_LAST_ABILITY}!"), @@ -685,7 +683,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_ATTACKERCUREDTARGETSTATUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} cured {B_DEF_NAME_WITH_PREFIX2}'s problem!"), [STRINGID_ATTACKERLOSTFIRETYPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} burned itself out!"), [STRINGID_HEALERCURE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} cured {B_SCR_NAME_WITH_PREFIX2}'s problem!"), - [STRINGID_SCRIPTINGABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_SCRIPTINGABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} {B_BUFF2}raised its {B_BUFF1}!"), [STRINGID_RECEIVERABILITYTAKEOVER] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} was taken over!"), [STRINGID_PKNMABSORBINGPOWER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is absorbing power!"), [STRINGID_NOONEWILLBEABLETORUNAWAY] = COMPOUND_STRING("No one will be able to run away during the next turn!"), @@ -701,10 +699,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_COMATOSEENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is drowsing!"), [STRINGID_SCREENCLEANERENTERS] = COMPOUND_STRING("All screens on the field were cleansed!"), [STRINGID_FETCHEDPOKEBALL] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} found a {B_LAST_ITEM}!"), - [STRINGID_BATTLERABILITYRAISEDSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} raised its {B_BUFF1}!"), [STRINGID_ASANDSTORMKICKEDUP] = COMPOUND_STRING("A sandstorm kicked up!"), [STRINGID_PKMNSWILLPERISHIN3TURNS] = COMPOUND_STRING("Both Pokémon will perish in three turns!"), //don't think this message is displayed anymore - [STRINGID_ABILITYRAISEDSTATDRASTICALLY] = COMPOUND_STRING("{B_DEF_ABILITY} raised {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1} drastically!"), [STRINGID_AURAFLAREDTOLIFE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s aura flared to life!"), [STRINGID_ASONEENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} has two Abilities!"), [STRINGID_CURIOUSMEDICINEENTERS] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s stat changes were removed!"), @@ -1103,20 +1099,21 @@ const u16 gUproarAwakeStringIds[] = const u16 gStatUpStringIds[] = { - [B_MSG_ATTACKER_STAT_ROSE] = STRINGID_ATTACKERSSTATROSE, - [B_MSG_DEFENDER_STAT_ROSE] = STRINGID_DEFENDERSSTATROSE, - [B_MSG_STAT_WONT_INCREASE] = STRINGID_STATSWONTINCREASE, - [B_MSG_STAT_ROSE_EMPTY] = STRINGID_EMPTYSTRING3, - [B_MSG_STAT_ROSE_ITEM] = STRINGID_USINGITEMSTATOFPKMNROSE, - [B_MSG_USED_DIRE_HIT] = STRINGID_PKMNUSEDXTOGETPUMPED, + [B_MSG_ATTACKER_STAT_CHANGED] = STRINGID_ATTACKERSSTATROSE, + [B_MSG_DEFENDER_STAT_CHANGED] = STRINGID_DEFENDERSSTATROSE, + [B_MSG_STAT_WONT_CHANGE] = STRINGID_STATSWONTINCREASE, + [B_MSG_STAT_CHANGE_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_STAT_CHANGED_ITEM] = STRINGID_USINGITEMSTATOFPKMNROSE, + [B_MSG_USED_DIRE_HIT] = STRINGID_PKMNUSEDXTOGETPUMPED, }; const u16 gStatDownStringIds[] = { - [B_MSG_ATTACKER_STAT_FELL] = STRINGID_ATTACKERSSTATFELL, - [B_MSG_DEFENDER_STAT_FELL] = STRINGID_DEFENDERSSTATFELL, - [B_MSG_STAT_WONT_DECREASE] = STRINGID_STATSWONTDECREASE, - [B_MSG_STAT_FELL_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_ATTACKER_STAT_CHANGED] = STRINGID_ATTACKERSSTATFELL, + [B_MSG_DEFENDER_STAT_CHANGED] = STRINGID_DEFENDERSSTATFELL, + [B_MSG_STAT_WONT_CHANGE] = STRINGID_STATSWONTDECREASE, + [B_MSG_STAT_CHANGE_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_STAT_CHANGED_ITEM] = STRINGID_USINGITEMSTATOFPKMNFELL, }; // Index copied from move's index in sTrappingMoves diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b4db289adc..616b64dce6 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10169,37 +10169,32 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan statValue = -1; else if (gBattleMons[battler].statStages[statId] == 2 && statValue < -2) statValue = -2; - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; + if (statValue == -2) { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATHARSHLY; - gBattleTextBuff2[3] = STRINGID_STATHARSHLY >> 8; - index = 4; + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATHARSHLY); } else if (statValue <= -3) { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_SEVERELY & 0xFF; - gBattleTextBuff2[3] = STRINGID_SEVERELY >> 8; - index = 4; + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_SEVERELY); + } + else + { + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_EMPTYSTRING3); } - gBattleTextBuff2[index++] = B_BUFF_STRING; - gBattleTextBuff2[index++] = STRINGID_STATFELL; - gBattleTextBuff2[index++] = STRINGID_STATFELL >> 8; - gBattleTextBuff2[index] = B_BUFF_EOS; - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_CHANGED or B_MSG_DEFENDER_STAT_CHANGED if (gBattleMons[battler].statStages[statId] == MIN_STAT_STAGE) { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_CHANGE; + gBattleScripting.statChanger |= STAT_BUFF_NEGATIVE; } else if (!flags.onlyChecking) { gProtectStructs[battler].tryEjectPack = TRUE; gProtectStructs[battler].lashOutAffected = TRUE; + gBattleScripting.statChanger |= STAT_BUFF_NEGATIVE; } } } @@ -10210,32 +10205,26 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan statValue = 1; else if (gBattleMons[battler].statStages[statId] == 10 && statValue > 2) statValue = 2; - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - index = 1; + if (statValue == 2) { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATSHARPLY; - gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; - index = 4; + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATSHARPLY); } else if (statValue >= 3) { - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_DRASTICALLY & 0xFF; - gBattleTextBuff2[3] = STRINGID_DRASTICALLY >> 8; - index = 4; + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_DRASTICALLY); + } + else + { + PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_EMPTYSTRING3); } - gBattleTextBuff2[index++] = B_BUFF_STRING; - gBattleTextBuff2[index++] = STRINGID_STATROSE; - gBattleTextBuff2[index++] = STRINGID_STATROSE >> 8; - gBattleTextBuff2[index] = B_BUFF_EOS; - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_ROSE or B_MSG_DEFENDER_STAT_ROSE + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == battler); // B_MSG_ATTACKER_STAT_CHANGED or B_MSG_DEFENDER_STAT_CHANGED if (gBattleMons[battler].statStages[statId] == MAX_STAT_STAGE) { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_CHANGE; + gBattleScripting.statChanger &= ~STAT_BUFF_NEGATIVE; } else if (!flags.onlyChecking) { @@ -10246,6 +10235,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan statIncrease = statValue; gProtectStructs[battler].statRaised = TRUE; + gBattleScripting.statChanger &= ~STAT_BUFF_NEGATIVE; if (statIncrease) { @@ -10275,7 +10265,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan } } - if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE) // same as B_MSG_STAT_WONT_DECREASE + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_CHANGE) // at max or min { if (!flags.allowPtr) return STAT_CHANGE_DIDNT_WORK; diff --git a/src/battle_util.c b/src/battle_util.c index 9faf2d55fd..6a1eba7136 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1185,19 +1185,54 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) // Support for Contrary ability. // If a move attempted to raise stat - print "won't increase". // If a move attempted to lower stat - print "won't decrease". - if (stringId == STRINGID_STATSWONTDECREASE && !(gBattleScripting.statChanger & STAT_BUFF_NEGATIVE)) - stringId = STRINGID_STATSWONTINCREASE; - else if (stringId == STRINGID_STATSWONTINCREASE && gBattleScripting.statChanger & STAT_BUFF_NEGATIVE) - stringId = STRINGID_STATSWONTDECREASE; + switch (stringId) + { + case STRINGID_ATTACKERSSTATROSE: + case STRINGID_DEFENDERSSTATROSE: + case STRINGID_STATSWONTINCREASE: + case STRINGID_USINGITEMSTATOFPKMNROSE: + if (gBattleScripting.statChanger & STAT_BUFF_NEGATIVE) + stringId = gStatDownStringIds[gBattleCommunication[MULTISTRING_CHOOSER]]; + break; + case STRINGID_ATTACKERSSTATFELL: + case STRINGID_DEFENDERSSTATFELL: + case STRINGID_STATSWONTDECREASE: + case STRINGID_USINGITEMSTATOFPKMNFELL: + if (!(gBattleScripting.statChanger & STAT_BUFF_NEGATIVE)) + stringId = gStatUpStringIds[gBattleCommunication[MULTISTRING_CHOOSER]]; + break; + case STRINGID_STATSWONTINCREASE2: + if (battlerAbility == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTDECREASE2; + break; + case STRINGID_STATSWONTDECREASE2: + if (battlerAbility == ABILITY_CONTRARY) + stringId = STRINGID_STATSWONTINCREASE2; + break; + case STRINGID_PKMNCUTSATTACKWITH: + if (GetGenConfig(GEN_CONFIG_UPDATED_INTIMIDATE) >= GEN_8 + && targetAbility == ABILITY_RATTLED + && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gBattlerAbility = gBattlerTarget; + BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); + SET_STATCHANGER(STAT_SPEED, 1, FALSE); + } + else if (targetAbility == ABILITY_CONTRARY) + { + stringId = STRINGID_DEFENDERSSTATROSE; + } + break; + case STRINGID_ITDOESNTAFFECT: + case STRINGID_PKMNUNAFFECTED: + TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); + break; + default: + break; + } - else if (stringId == STRINGID_STATSWONTDECREASE2 && battlerAbility == ABILITY_CONTRARY) - stringId = STRINGID_STATSWONTINCREASE2; - else if (stringId == STRINGID_STATSWONTINCREASE2 && battlerAbility == ABILITY_CONTRARY) - stringId = STRINGID_STATSWONTDECREASE2; - - // Check Defiant and Competitive stat raise whenever a stat is lowered. - else if ((stringId == STRINGID_DEFENDERSSTATFELL || stringId == STRINGID_PKMNCUTSATTACKWITH) - && ShouldDefiantCompetitiveActivate(gBattlerTarget, targetAbility)) + if ((stringId == STRINGID_PKMNCUTSATTACKWITH || stringId == STRINGID_DEFENDERSSTATFELL) + && ShouldDefiantCompetitiveActivate(gBattlerTarget, targetAbility)) { gBattlerAbility = gBattlerTarget; BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); @@ -1206,18 +1241,6 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) else SET_STATCHANGER(STAT_SPATK, 2, FALSE); } - else if (GetGenConfig(GEN_CONFIG_UPDATED_INTIMIDATE) >= GEN_8 - && stringId == STRINGID_PKMNCUTSATTACKWITH - && targetAbility == ABILITY_RATTLED - && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - gBattlerAbility = gBattlerTarget; - BattleScriptCall(BattleScript_AbilityRaisesDefenderStat); - SET_STATCHANGER(STAT_SPEED, 1, FALSE); - } - - if ((stringId == STRINGID_ITDOESNTAFFECT || stringId == STRINGID_PKMNUNAFFECTED)) - TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); BtlController_EmitPrintString(battler, B_COMM_TO_CONTROLLER, stringId); MarkBattlerForControllerExec(battler); @@ -4415,8 +4438,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SPEED_BOOST: if (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) && gDisableStructs[battler].isFirstTurn != 2) { + SaveBattlerAttacker(gBattlerAttacker); SET_STATCHANGER(STAT_SPEED, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); + BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3); gBattleScripting.battler = battler; effect++; } @@ -6046,7 +6070,6 @@ 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 = gBattleScripting.battler = battler; if (GetBattlerAbility(battler) == ABILITY_RIPEN) SET_STATCHANGER(statId, 2, FALSE); @@ -6068,7 +6091,6 @@ static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCaseId caseID) { s32 stat; - enum StringID stringId; for (stat = STAT_ATK; stat < NUM_STATS; stat++) { @@ -6081,19 +6103,14 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa u32 savedAttacker = gBattlerAttacker; // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker gBattlerAttacker = gBattleScripting.battler = battler; - stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); + gBattleScripting.statChanger = 0; + if (battlerAbility != ABILITY_CONTRARY) + stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); + else + stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantLowerStat); gBattlerAttacker = savedAttacker; PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); - stringId = (battlerAbility == ABILITY_CONTRARY) ? STRINGID_STATFELL : STRINGID_STATROSE; - gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN; - gBattleTextBuff2[1] = B_BUFF_STRING; - gBattleTextBuff2[2] = STRINGID_STATSHARPLY; - gBattleTextBuff2[3] = STRINGID_STATSHARPLY >> 8; - gBattleTextBuff2[4] = B_BUFF_STRING; - gBattleTextBuff2[5] = stringId; - gBattleTextBuff2[6] = stringId >> 8; - gBattleTextBuff2[7] = EOS; gEffectBattler = battler; if (battlerAbility == ABILITY_RIPEN) SET_STATCHANGER(stat, 4, FALSE); @@ -6159,8 +6176,6 @@ static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, enum && IsBattlerTurnDamaged(battler))) ) { - BufferStatChange(battler, statId, STRINGID_STATROSE); - gEffectBattler = battler; if (GetBattlerAbility(battler) == ABILITY_RIPEN) SET_STATCHANGER(statId, 2, FALSE); @@ -6180,7 +6195,6 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 item { if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) { - BufferStatChange(battler, statId, STRINGID_STATROSE); gLastUsedItem = itemId; // For surge abilities gEffectBattler = gBattleScripting.battler = battler; SET_STATCHANGER(statId, 1, FALSE); @@ -6200,7 +6214,6 @@ static enum ItemEffect ConsumeBerserkGene(u32 battler, enum ItemCaseId caseID) if (CanBeInfinitelyConfused(battler)) gBattleMons[battler].volatiles.infiniteConfusion = TRUE; - BufferStatChange(battler, STAT_ATK, STRINGID_STATROSE); gBattlerAttacker = gEffectBattler = battler; SET_STATCHANGER(STAT_ATK, 2, FALSE); gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; @@ -10868,36 +10881,10 @@ bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind) return ret; } -void BufferStatChange(u32 battler, u8 statId, enum StringID stringId) -{ - bool32 hasContrary = (GetBattlerAbility(battler) == ABILITY_CONTRARY); - - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); - if (stringId == STRINGID_STATFELL) - { - if (hasContrary) - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE) - else - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATFELL) - } - else if (stringId == STRINGID_STATROSE) - { - if (hasContrary) - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATFELL) - else - PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE) - } - else - { - PREPARE_STRING_BUFFER(gBattleTextBuff2, stringId) - } -} - bool32 TryRoomService(u32 battler) { if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && CompareStat(battler, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN)) { - BufferStatChange(battler, STAT_SPEED, STRINGID_STATFELL); gEffectBattler = gBattleScripting.battler = battler; SET_STATCHANGER(STAT_SPEED, 1, TRUE); gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_SPEED; diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index e133af6508..f4d7e64afa 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -29,13 +29,13 @@ SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hi ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); } else { NONE_OF { ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); } } } THEN { @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail a ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); } } THEN { EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Weak Armor still boosts Speed if Defense can't go any lower" } MESSAGE("Slugma's Defense won't go any lower!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); } THEN { EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); @@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Weak Armor still lowers Defense if Speed can't go any higher MESSAGE("Slugma's Weak Armor lowered its Defense!"); NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); } MESSAGE("Slugma's Speed won't go any higher!"); } THEN { @@ -147,12 +147,12 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can' ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); MESSAGE("Magcargo's Weak Armor lowered its Defense!"); - MESSAGE("Magcargo's Weak Armor raised its Speed!"); + MESSAGE("Magcargo's Weak Armor sharply raised its Speed!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); MESSAGE("Magcargo's Defense won't go any lower!"); - MESSAGE("Magcargo's Weak Armor raised its Speed!"); + MESSAGE("Magcargo's Weak Armor sharply raised its Speed!"); for (j = 0; j < 2; j++) { ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); @@ -183,7 +183,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); MESSAGE("Magcargo's Weak Armor lowered its Defense!"); - MESSAGE("Magcargo's Weak Armor raised its Speed!"); + MESSAGE("Magcargo's Weak Armor sharply raised its Speed!"); for (j = 0; j < 4; j++) { ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/restore_stats.c index f2508c45ee..92aa7f0ce6 100644 --- a/test/battle/hold_effect/restore_stats.c +++ b/test/battle/hold_effect/restore_stats.c @@ -143,7 +143,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off o ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); if (move == MOVE_KNOCK_OFF) { MESSAGE("The opposing Wobbuffet knocked off Slugma's White Herb!"); } else if (move == MOVE_THIEF) { @@ -171,7 +171,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if Magician steals it" ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Slugma's Weak Armor lowered its Defense!"); - MESSAGE("Slugma's Weak Armor raised its Speed!"); + MESSAGE("Slugma's Weak Armor sharply raised its Speed!"); ABILITY_POPUP(opponent, ABILITY_MAGICIAN); MESSAGE("The opposing Fennekin stole Slugma's White Herb!"); NONE_OF { diff --git a/test/text.c b/test/text.c index dafd651461..d635df2072 100644 --- a/test/text.c +++ b/test/text.c @@ -713,8 +713,6 @@ TEST("Battle strings fit on the battle message window") case STRINGID_ATTACKERABILITYSTATRAISE: case STRINGID_TARGETABILITYSTATLOWER: case STRINGID_SCRIPTINGABILITYSTATRAISE: - case STRINGID_BATTLERABILITYRAISEDSTAT: - case STRINGID_ABILITYRAISEDSTATDRASTICALLY: case STRINGID_STATWASHEIGHTENED: StringCopy(gBattleTextBuff1, gStatNamesTable[longStatName]); break; From ce8f532c20b675bb24780646a322afb42cf8e168 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Mon, 8 Sep 2025 20:50:18 +0100 Subject: [PATCH 027/183] Battle debug menu: highlight chosen action and change separator (#7709) --- src/battle_debug.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/battle_debug.c b/src/battle_debug.c index e350638aa5..b1dfb6b30b 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -720,17 +720,27 @@ void CB2_BattleDebugMenu(void) } } +enum { + COLORID_RED, +}; + +static const u8 sTextColorTable[][3] = +{ + [COLORID_RED] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, +}; + static void PutMovesPointsText(struct BattleDebugMenu *data) { - u32 i, j, count, battlerDef; + u32 i, j, count, battlerDef, chosenMoveIndex = gAiBattleData->chosenMoveIndex[data->aiBattlerId]; u8 *text = Alloc(0x50); FillWindowPixelBuffer(data->aiMovesWindowId, 0x11); + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Score/Dmg"), 3, 0, 0, NULL); for (i = 0; i < MAX_MON_MOVES; i++) { text[0] = CHAR_SPACE; StringCopy(text + 1, GetMoveName(gBattleMons[data->aiBattlerId].moves[i])); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 0, i * 15, 0, NULL); + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 0, (i * 15) + 15, 0, NULL); for (count = 0, j = 0; j < MAX_BATTLERS_COUNT; j++) { if (data->spriteIds.aiIconSpriteIds[j] == 0xFF) @@ -739,12 +749,24 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) ConvertIntToDecimalStringN(text, gAiBattleData->finalScore[data->aiBattlerId][battlerDef][i], STR_CONV_MODE_RIGHT_ALIGN, 3); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 83 + count * 54, i * 15, 0, NULL); + // If chosen move and chosen target + if ((chosenMoveIndex == i) && (gAiBattleData->chosenTarget[data->aiBattlerId] == j) && !(gAiLogicData->shouldSwitch & (1u << data->aiBattlerId))) + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 84 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, text); + else + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 84 + count * 54, (i * 15) + 15, 0, NULL); + if ((chosenMoveIndex == i) && (gAiBattleData->chosenTarget[data->aiBattlerId] == j) && !(gAiLogicData->shouldSwitch & (1u << data->aiBattlerId))) + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 103 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, COMPOUND_STRING("/")); + else + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("/"), 103 + count * 54, (i * 15) + 15, 0, NULL); + ConvertIntToDecimalStringN(text, AI_GetDamage(data->aiBattlerId, battlerDef, i, AI_ATTACKING, gAiLogicData), - STR_CONV_MODE_RIGHT_ALIGN, 3); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 110 + count * 54, i * 15, 0, NULL); + STR_CONV_MODE_LEADING_ZEROS, 3); + if ((chosenMoveIndex == i) && (gAiBattleData->chosenTarget[data->aiBattlerId] == j) && !(gAiLogicData->shouldSwitch & (1u << data->aiBattlerId))) + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 110 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, text); + else + AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 110 + count * 54, (i * 15) + 15, 0, NULL); count++; } @@ -754,14 +776,8 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) { struct Pokemon *party = GetBattlerParty(data->aiBattlerId); u32 switchMon = GetMonData(&party[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Switching to "), 74, 64, 0, NULL); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, gSpeciesInfo[switchMon].speciesName, 74 + 68, 64, 0, NULL); - } - else - { - u32 chosenMoveIndex = gAiBattleData->chosenMoveIndex[data->aiBattlerId]; - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("Chosen move: "), 74, 64, 0, NULL); - AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, GetMoveName(gBattleMons[data->aiBattlerId].moves[chosenMoveIndex]), 74 + 68, 64, 0, NULL); + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 74, 79, sTextColorTable[COLORID_RED], 0, COMPOUND_STRING("Switching to ")); + AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 74 + 68, 79, sTextColorTable[COLORID_RED], 0, gSpeciesInfo[switchMon].speciesName); } CopyWindowToVram(data->aiMovesWindowId, COPYWIN_FULL); @@ -813,7 +829,7 @@ static void Task_ShowAiPoints(u8 taskId) { data->spriteIds.aiIconSpriteIds[i] = CreateMonIcon(gBattleMons[i].species, SpriteCallbackDummy, - 95 + (count * 60), 17, 0, 0); + 106 + (count * 54), 17, 0, 0); gSprites[data->spriteIds.aiIconSpriteIds[i]].data[0] = i; // battler id count++; } @@ -828,7 +844,7 @@ static void Task_ShowAiPoints(u8 taskId) GetMonData(mon, MON_DATA_IS_SHINY), gBattleMons[data->aiBattlerId].personality, TRUE, - 39, 130, 15, TAG_NONE); + 39, 135, 15, TAG_NONE); data->aiViewState++; break; // Put text From 0f2518c17f9b30583328669448292e421ae6d605 Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 9 Sep 2025 16:12:14 -0400 Subject: [PATCH 028/183] Some tests for future Dynamax AI behavior. (#7707) --- test/battle/ai/gimmick_dynamax.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/battle/ai/gimmick_dynamax.c b/test/battle/ai/gimmick_dynamax.c index 1f97e490b9..7e99a883c4 100644 --- a/test/battle/ai/gimmick_dynamax.c +++ b/test/battle/ai/gimmick_dynamax.c @@ -13,3 +13,29 @@ AI_SINGLE_BATTLE_TEST("AI uses Dynamax") } } +AI_SINGLE_BATTLE_TEST("AI uses Dynamax -- Max Moves are scored based on max move effects, not base effects") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, MOVE_EXPLOSION); DynamaxLevel(10); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_EXPLOSION, gimmick: GIMMICK_DYNAMAX); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Dynamax -- AI does not dynamax before using a utility move") +{ + KNOWN_FAILING; + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_FAKE_OUT); DynamaxLevel(10); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_FAKE_OUT, gimmick: GIMMICK_NONE); } + } +} + +// Copycatting an ally's Max Guard rendition of Trick Room was a notable strategy. +TO_DO_BATTLE_TEST("TODO: AI uses Dynamax -- AI uses Copycat against a Dynamaxed Pokemon intelligently") From 0ebd308497b71b273c1d4d86d4b9ef2a8d5dd6ea Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 9 Sep 2025 16:13:18 -0400 Subject: [PATCH 029/183] AI uses Extreme Evoboost. (#7706) --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 6 +++--- src/battle_ai_util.c | 8 +++++++- test/battle/ai/gimmick_z_move.c | 7 ++----- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 1b23dd7e1a..2705cc4b6d 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -136,6 +136,7 @@ bool32 CanKnockOffItem(u32 battler, u32 item); bool32 IsAbilityOfRating(u32 ability, s8 rating); bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move); +bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); bool32 IsAIUsingGimmick(u32 battler); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index a28ef05aa9..cedb2db5e7 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2760,8 +2760,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: case EFFECT_HAPPY_HOUR: - case EFFECT_LAST_RESORT: - if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move)) + if (IsConsideringZMove(battlerAtk, battlerDef, move)) break; ADJUST_SCORE(-10); break; @@ -4446,7 +4445,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: case EFFECT_HAPPY_HOUR: - if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move)) + case EFFECT_LAST_RESORT: + if (IsConsideringZMove(battlerAtk, battlerDef, move)) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_TELEPORT: // Either remove or add better logic diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0b440ec39f..ee3da9f4a5 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -665,7 +665,7 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) return TRUE; break; case EFFECT_LAST_RESORT: - if (!CanUseLastResort(ctx->battlerAtk)) + if (!CanUseLastResort(ctx->battlerAtk) && !IsConsideringZMove(ctx->battlerAtk, ctx->battlerDef, ctx->move)) return TRUE; break; case EFFECT_LOW_KICK: @@ -4843,6 +4843,12 @@ bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move return FALSE; } + +bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move) +{ + return gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move); +} + //TODO - this could use some more sophisticated logic bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) { diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c index 0b74507b22..1332abe6c0 100644 --- a/test/battle/ai/gimmick_z_move.c +++ b/test/battle/ai/gimmick_z_move.c @@ -63,10 +63,8 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Happy Hour") } } -// Last Resort itself is missing logic! AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") { - KNOWN_FAILING; GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); @@ -75,9 +73,8 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") } WHEN { TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); } TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); - SCORE_EQ_VAL(opponent, MOVE_LAST_RESORT, 80); } -// Uncomment when Last Resort works correctly. -// TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); } + SCORE_LT_VAL(opponent, MOVE_LAST_RESORT, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); } } } From 05ed9f0d39a1a6d0f673d015667025d63981b7e2 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:07:43 +0200 Subject: [PATCH 030/183] Remove Uproar attack battle script (#7715) --- data/battle_scripts_1.s | 7 ------- include/battle_scripts.h | 1 - src/data/battle_move_effects.h | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b1b7c76616..af5f7aa49d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3915,13 +3915,6 @@ BattleScript_NotAffectedAbilityPopUp:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectUproar:: - attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_UproarHit -BattleScript_UproarHit:: - goto BattleScript_HitFromCritCalc - BattleScript_EffectStockpile:: attackcanceler stockpile 0 diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 00bce64623..dc64b88e07 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -678,7 +678,6 @@ extern const u8 BattleScript_EffectSemiInvulnerable[]; extern const u8 BattleScript_EffectDefenseCurl[]; extern const u8 BattleScript_EffectSoftboiled[]; extern const u8 BattleScript_EffectFirstTurnOnly[]; -extern const u8 BattleScript_EffectUproar[]; extern const u8 BattleScript_EffectStockpile[]; extern const u8 BattleScript_EffectSpitUp[]; extern const u8 BattleScript_EffectSwallow[]; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 7c855ff1bd..3816548ba5 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -826,7 +826,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_UPROAR] = { - .battleScript = BattleScript_EffectUproar, + .battleScript = BattleScript_EffectHit, .battleTvScore = 4, }, From b8d5951dfbdb87abd643ca34f93005d3affd4200 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 12 Sep 2025 04:50:05 -0400 Subject: [PATCH 031/183] Move some checks out of IncreaseStatUpScore to ShouldRaiseAnyStat (#7722) --- include/battle_ai_util.h | 1 + src/battle_ai_util.c | 74 ++++++++++++++++++++++------------------ 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 2705cc4b6d..ec517d5a27 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -191,6 +191,7 @@ bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); bool32 IsBattlerDamagedByStatus(u32 battler); s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove); +bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef); bool32 ShouldSetWeather(u32 battler, u32 weather); bool32 ShouldClearWeather(u32 battler, u32 weather); bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ee3da9f4a5..a43b957a50 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1949,6 +1949,43 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil return FALSE; } +bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef) +{ + if (AreBattlersStatsMaxed(battlerAtk)) + return FALSE; + + // Don't increase stats if opposing battler has Unaware + if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, gAiLogicData)) + return FALSE; + + // Don't set up if AI is dead to residual damage from weather + if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp) + return FALSE; + + // Don't increase stats if opposing battler has Opportunist + if (HasBattlerSideAbility(battlerDef, ABILITY_OPPORTUNIST, gAiLogicData)) + return FALSE; + + // Don't increase stats if opposing battler has Encore + if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) + return FALSE; + + // Don't increase stats if opposing battler has used Haze effect or AI effect + if (!RandomPercentage(RNG_AI_BOOST_INTO_HAZE, BOOST_INTO_HAZE_CHANCE) + && HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE)) + return FALSE; + + if (CountPositiveStatStages(battlerAtk) > 0 + && HasBattlerSideMoveWithAIEffect(battlerDef, AI_EFFECT_RESET_STATS)) + return FALSE; + + // Don't increase stats if AI could KO target through Sturdy effect, as otherwise it always 2HKOs + if (CanBattlerKOTargetIgnoringSturdy(battlerAtk, battlerDef)) + return FALSE; + + return TRUE; +} + bool32 ShouldSetWeather(u32 battler, u32 weather) { return WeatherChecker(battler, weather, FIELD_EFFECT_POSITIVE); @@ -4559,8 +4596,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, if (considerContrary && gAiLogicData->abilities[battlerAtk] == ABILITY_CONTRARY) return NO_INCREASE; - // Don't increase stats if opposing battler has Unaware - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, gAiLogicData)) + if (!ShouldRaiseAnyStat(battlerAtk, battlerDef)) return NO_INCREASE; // Don't increase stat if AI is at +4 @@ -4571,32 +4607,6 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, if (gAiLogicData->hpPercents[battlerAtk] < 70 && noOfHitsToFaint == UNKNOWN_NO_OF_HITS) return NO_INCREASE; - // Don't set up if AI is dead to residual damage from weather - if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp) - return NO_INCREASE; - - // Don't increase stats if opposing battler has Opportunist - if (HasBattlerSideAbility(battlerDef, ABILITY_OPPORTUNIST, gAiLogicData)) - return NO_INCREASE; - - // Don't increase stats if opposing battler has Encore - if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) - return NO_INCREASE; - - // Don't increase stats if opposing battler has used Haze effect or AI effect - if (!RandomPercentage(RNG_AI_BOOST_INTO_HAZE, BOOST_INTO_HAZE_CHANCE) - && HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE)) - return NO_INCREASE; - - // Don't increase if AI is at +1 and opponent has Haze effect - if (gBattleMons[battlerAtk].statStages[statId] >= MAX_STAT_STAGE - 5 - && HasBattlerSideMoveWithAIEffect(battlerDef, AI_EFFECT_RESET_STATS)) - return NO_INCREASE; - - // Don't increase stats if AI could KO target through Sturdy effect, as otherwise it always 2HKOs - if (CanBattlerKOTargetIgnoringSturdy(battlerAtk, battlerDef)) - return NO_INCREASE; - // Don't increase stats if player has a move that can change the KO threshold if (HasMoveThatChangesKOThreshold(battlerDef, noOfHitsToFaint, aiIsFaster)) return NO_INCREASE; @@ -4884,11 +4894,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return TRUE; break; case Z_EFFECT_ALL_STATS_UP_1: - if (AreBattlersStatsMaxed(battlerAtk)) - return FALSE; - return IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK) > 0 - || IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK) > 0; - break; + return ShouldRaiseAnyStat(battlerAtk, battlerDef); case Z_EFFECT_BOOST_CRITS: return TRUE; case Z_EFFECT_FOLLOW_ME: @@ -4938,7 +4944,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) } else if (GetMoveEffect(zMove) == EFFECT_EXTREME_EVOBOOST) { - return (!AreBattlersStatsMaxed(battlerAtk) && (IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2) || IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_2))); + return ShouldRaiseAnyStat(battlerAtk, battlerDef); } else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) return FALSE; From 3c940747503e337e2e8e7f608ab1d28fa7b9ac48 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 12 Sep 2025 21:04:36 +0200 Subject: [PATCH 032/183] Add pool rules for Mega Stones and Z-Crystals (#7720) Co-authored-by: Hedara --- include/config/battle.h | 2 ++ include/trainer_pools.h | 10 ++++++---- src/data/battle_pool_rules.h | 12 ++++++++++++ src/trainer_pools.c | 5 +++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index d5fff2bf7d..82dd059754 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -364,5 +364,7 @@ #define B_POOL_RULE_EXCLUDE_FORMS FALSE // Exclude different forms from the Species Clause #define B_POOL_RULE_ITEM_CLAUSE FALSE // Only allow each item to be picked once #define B_POOL_RULES_USE_ITEM_EXCLUSIONS FALSE // Exclude items listed in poolItemClauseExclusions +#define B_POOL_RULE_MEGA_STONE_CLAUSE FALSE // Pick only 1 mon with mega stone +#define B_POOL_RULE_Z_CRYSTAL_CLAUSE FALSE // Pick only 1 mon with Z-crystal #endif // GUARD_CONFIG_BATTLE_H diff --git a/include/trainer_pools.h b/include/trainer_pools.h index 196657a55f..72df3e765c 100644 --- a/include/trainer_pools.h +++ b/include/trainer_pools.h @@ -56,10 +56,12 @@ enum PoolTags { struct PoolRules { - bool8 speciesClause; - bool8 excludeForms; - bool8 itemClause; - bool8 itemClauseExclusions; + u8 speciesClause:1; + u8 excludeForms:1; + u8 itemClause:1; + u8 itemClauseExclusions:1; + u8 megaStoneClause:1; + u8 zCrystalClause:1; u8 tagMaxMembers[POOL_NUM_TAGS]; bool8 tagRequired[POOL_NUM_TAGS]; }; diff --git a/src/data/battle_pool_rules.h b/src/data/battle_pool_rules.h index b88db3c797..eefb101f55 100644 --- a/src/data/battle_pool_rules.h +++ b/src/data/battle_pool_rules.h @@ -12,6 +12,8 @@ const struct PoolRules defaultPoolRules = .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, }; const struct PoolRules gPoolRulesetsList[] = { @@ -20,6 +22,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 1, .tagMaxMembers[POOL_TAG_ACE] = 1, }, @@ -28,6 +32,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 2, .tagMaxMembers[POOL_TAG_ACE] = 2, }, @@ -36,6 +42,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 1, .tagMaxMembers[POOL_TAG_ACE] = 1, .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, @@ -48,6 +56,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 2, .tagMaxMembers[POOL_TAG_ACE] = 2, .tagMaxMembers[POOL_TAG_WEATHER_SETTER] = 1, @@ -60,6 +70,8 @@ const struct PoolRules gPoolRulesetsList[] = { .excludeForms = B_POOL_RULE_EXCLUDE_FORMS, .itemClause = B_POOL_RULE_ITEM_CLAUSE, .itemClauseExclusions = B_POOL_RULES_USE_ITEM_EXCLUSIONS, + .megaStoneClause = B_POOL_RULE_MEGA_STONE_CLAUSE, + .zCrystalClause = B_POOL_RULE_Z_CRYSTAL_CLAUSE, .tagMaxMembers[POOL_TAG_LEAD] = 2, .tagMaxMembers[POOL_TAG_ACE] = 2, .tagMaxMembers[POOL_TAG_SUPPORT] = 1, diff --git a/src/trainer_pools.c b/src/trainer_pools.c index ec38c7a01f..6f0e57fdb2 100644 --- a/src/trainer_pools.c +++ b/src/trainer_pools.c @@ -1,5 +1,6 @@ #include "global.h" #include "data.h" +#include "item.h" #include "malloc.h" #include "pokemon.h" #include "random.h" @@ -227,6 +228,10 @@ static u32 PickMonFromPool(const struct Trainer *trainer, u8 *poolIndexArray, u3 poolIndexArray[currIndex] = POOL_SLOT_DISABLED; } } + if (rules->megaStoneClause && gItemsInfo[currentItem].sortType == ITEM_TYPE_MEGA_STONE && gItemsInfo[chosenItem].sortType == ITEM_TYPE_MEGA_STONE) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; + if (rules->zCrystalClause && gItemsInfo[currentItem].sortType == ITEM_TYPE_Z_CRYSTAL && gItemsInfo[chosenItem].sortType == ITEM_TYPE_Z_CRYSTAL) + poolIndexArray[currIndex] = POOL_SLOT_DISABLED; } } return monIndex; From fab4dc1163b48212a13fffb75839c8ae318e0178 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 12 Sep 2025 17:16:45 -0400 Subject: [PATCH 033/183] Adjusted AI handling for Gravity; AI for weather/field status additional effects. (#7651) --- include/battle_ai_util.h | 8 +- src/battle_ai_field_statuses.c | 80 ++++++++++---- src/battle_ai_main.c | 170 +++++++++++++++++++++-------- src/battle_ai_util.c | 35 +++--- test/battle/ai/can_use_all_moves.c | 2 +- test/battle/move_effect/gravity.c | 33 ++++++ 6 files changed, 231 insertions(+), 97 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index ec517d5a27..02e34961c8 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -4,7 +4,10 @@ #include "battle_ai_main.h" #include "battle_ai_field_statuses.h" -#define FOE(battler) ((BATTLE_OPPOSITE(battler)) & BIT_SIDE) +// Left and right are determined by how they're referred to in tests and everywhere else. +// Left is battlers 0 and 1, right 2 and 3; if you assume the battler referencing them is south, left is to the northeast and right to the northwest. +#define LEFT_FOE(battler) ((BATTLE_OPPOSITE(battler)) & BIT_SIDE) +#define RIGHT_FOE(battler) (((BATTLE_OPPOSITE(battler)) & BIT_SIDE) | BIT_FLANK) // Roll boundaries used by AI when scoring. Doesn't affect actual damage dealt. #define MAX_ROLL_PERCENTAGE DMG_ROLL_PERCENT_HI @@ -182,7 +185,7 @@ bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect); bool32 HasMoveWithCriticalHitChance(u32 battlerId); bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, enum BattleMoveEffects exception); bool32 HasMoveThatLowersOwnStats(u32 battlerId); -bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); +bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus); bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect); bool32 IsNonVolatileStatusMove(u32 moveEffect); @@ -299,7 +302,6 @@ bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); -bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index bd7bdd8e17..968bd31628 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -44,6 +44,7 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler); static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler); static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler); static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler); +static enum FieldEffectOutcome BenefitsFromGravity(u32 battler); static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler); bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredResult) @@ -108,6 +109,8 @@ bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome result = BenefitsFromPsychicTerrain(battler); // other field statuses + if (fieldStatus & STATUS_FIELD_GRAVITY) + result = BenefitsFromGravity(battler); if (fieldStatus & STATUS_FIELD_TRICK_ROOM) result = BenefitsFromTrickRoom(battler); @@ -248,9 +251,9 @@ static enum FieldEffectOutcome BenefitsFromSandstorm(u32 battler) if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) { - if (!(IS_BATTLER_ANY_TYPE(FOE(battler), TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) - || gAiLogicData->holdEffects[FOE(battler)] == HOLD_EFFECT_SAFETY_GOGGLES - || DoesAbilityBenefitFromWeather(gAiLogicData->abilities[FOE(battler)], B_WEATHER_SANDSTORM)) + if (!(IS_BATTLER_ANY_TYPE(LEFT_FOE(battler), TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)) + || gAiLogicData->holdEffects[LEFT_FOE(battler)] == HOLD_EFFECT_SAFETY_GOGGLES + || DoesAbilityBenefitFromWeather(gAiLogicData->abilities[LEFT_FOE(battler)], B_WEATHER_SANDSTORM)) return FIELD_EFFECT_POSITIVE; else return FIELD_EFFECT_NEUTRAL; @@ -274,7 +277,7 @@ static enum FieldEffectOutcome BenefitsFromHailOrSnow(u32 battler, u32 weather) if (HasLightSensitiveMove(battler)) return FIELD_EFFECT_NEGATIVE; - if (HasMoveWithFlag(FOE(battler), MoveAlwaysHitsInHailSnow)) + if (HasMoveWithFlag(LEFT_FOE(battler), MoveAlwaysHitsInHailSnow)) return FIELD_EFFECT_NEGATIVE; return FIELD_EFFECT_NEUTRAL; @@ -294,7 +297,7 @@ static enum FieldEffectOutcome BenefitsFromRain(u32 battler) if (HasLightSensitiveMove(battler) || HasDamagingMoveOfType(battler, TYPE_FIRE)) return FIELD_EFFECT_NEGATIVE; - if (HasMoveWithFlag(FOE(battler), MoveAlwaysHitsInRain)) + if (HasMoveWithFlag(LEFT_FOE(battler), MoveAlwaysHitsInRain)) return FIELD_EFFECT_NEGATIVE; return FIELD_EFFECT_NEUTRAL; @@ -309,11 +312,12 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) if (HasMoveWithEffect(battler, EFFECT_RISING_VOLTAGE)) return FIELD_EFFECT_POSITIVE; - if (HasMoveWithEffect(FOE(battler), EFFECT_REST) && IsBattlerGrounded(FOE(battler))) + if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(LEFT_FOE(battler))) + || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(RIGHT_FOE(battler)))) return FIELD_EFFECT_POSITIVE; bool32 grounded = IsBattlerGrounded(battler); - if (grounded && HasBattlerSideMoveWithAdditionalEffect(FOE(battler), MOVE_EFFECT_SLEEP)) + if (grounded && HasBattlerSideMoveWithAdditionalEffect(LEFT_FOE(battler), MOVE_EFFECT_SLEEP)) return FIELD_EFFECT_POSITIVE; if (grounded && ((gBattleMons[battler].status1 & STATUS1_SLEEP) @@ -321,7 +325,7 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) || HasDamagingMoveOfType(battler, TYPE_ELECTRIC))) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_RISING_VOLTAGE)) + if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_RISING_VOLTAGE)) return FIELD_EFFECT_NEGATIVE; @@ -334,7 +338,7 @@ static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler) if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_GRASSY_TERRAIN)) return FIELD_EFFECT_POSITIVE; - if (HasMoveWithEffect(battler, EFFECT_GRASSY_GLIDE)) + if (HasBattlerSideMoveWithEffect(battler, EFFECT_GRASSY_GLIDE)) return FIELD_EFFECT_POSITIVE; if (HasMoveWithAdditionalEffect(battler, MOVE_EFFECT_FLORAL_HEALING)) return FIELD_EFFECT_POSITIVE; @@ -342,14 +346,14 @@ static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler) bool32 grounded = IsBattlerGrounded(battler); // Weaken spamming Earthquake, Magnitude, and Bulldoze. - if (grounded && (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_EARTHQUAKE) - || HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_MAGNITUDE))) + if (grounded && (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_EARTHQUAKE) + || HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_MAGNITUDE))) return FIELD_EFFECT_POSITIVE; if (grounded && HasDamagingMoveOfType(battler, TYPE_GRASS)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_GRASSY_GLIDE)) + if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_GRASSY_GLIDE)) return FIELD_EFFECT_NEGATIVE; @@ -370,16 +374,17 @@ static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) if (HasPartner(battler)) allyGrounded = IsBattlerGrounded(BATTLE_PARTNER(battler)); - if (HasMoveWithEffect(FOE(battler), EFFECT_REST) && IsBattlerGrounded(FOE(battler))) + if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(LEFT_FOE(battler))) + || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(RIGHT_FOE(battler)))) return FIELD_EFFECT_POSITIVE; // harass dragons if ((grounded || allyGrounded) - && (HasDamagingMoveOfType(FOE(battler), TYPE_DRAGON) || HasDamagingMoveOfType(BATTLE_PARTNER(FOE(battler)), TYPE_DRAGON))) + && (HasDamagingMoveOfType(LEFT_FOE(battler), TYPE_DRAGON) || HasDamagingMoveOfType(RIGHT_FOE(battler), TYPE_DRAGON))) return FIELD_EFFECT_POSITIVE; if ((grounded || allyGrounded) - && (HasNonVolatileMoveEffect(FOE(battler), MOVE_EFFECT_SLEEP) || HasNonVolatileMoveEffect(BATTLE_PARTNER(FOE(battler)), MOVE_EFFECT_SLEEP))) + && (HasNonVolatileMoveEffect(LEFT_FOE(battler), MOVE_EFFECT_SLEEP) || HasNonVolatileMoveEffect(RIGHT_FOE(battler), MOVE_EFFECT_SLEEP))) return FIELD_EFFECT_POSITIVE; if (grounded && (gBattleMons[battler].status1 & STATUS1_SLEEP || gBattleMons[battler].volatiles.yawn)) @@ -406,16 +411,16 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (grounded || allyGrounded) { // harass priority - if (HasBattlerSideAbility(FOE(battler), ABILITY_GALE_WINGS, gAiLogicData) - || HasBattlerSideAbility(FOE(battler), ABILITY_TRIAGE, gAiLogicData) - || HasBattlerSideAbility(FOE(battler), ABILITY_PRANKSTER, gAiLogicData)) + if (HasBattlerSideAbility(LEFT_FOE(battler), ABILITY_GALE_WINGS, gAiLogicData) + || HasBattlerSideAbility(LEFT_FOE(battler), ABILITY_TRIAGE, gAiLogicData) + || HasBattlerSideAbility(LEFT_FOE(battler), ABILITY_PRANKSTER, gAiLogicData)) return FIELD_EFFECT_POSITIVE; } - if (grounded && (HasDamagingMoveOfType(battler, TYPE_PSYCHIC))) + if (grounded && HasDamagingMoveOfType(battler, TYPE_PSYCHIC)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(FOE(battler), EFFECT_EXPANDING_FORCE)) + if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_EXPANDING_FORCE)) return FIELD_EFFECT_NEGATIVE; if (HasBattlerSideAbility(battler, ABILITY_GALE_WINGS, gAiLogicData) @@ -426,15 +431,44 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) return FIELD_EFFECT_NEUTRAL; } +static enum FieldEffectOutcome BenefitsFromGravity(u32 battler) +{ + if (!IsBattlerGrounded(battler)) + return FIELD_EFFECT_NEGATIVE; + + if (HasBattlerSideAbility(battler, ABILITY_HUSTLE, gAiLogicData)) + return FIELD_EFFECT_POSITIVE; + + if (HasMoveWithFlag(battler, IsMoveGravityBanned)) + return FIELD_EFFECT_NEGATIVE; + + if (IsBattlerAlive(LEFT_FOE(battler))) + { + if (HasMoveWithLowAccuracy(battler, LEFT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) + || (!IsBattlerGrounded(LEFT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) + return FIELD_EFFECT_POSITIVE; + } + + if (IsBattlerAlive(RIGHT_FOE(battler))) + { + if (HasMoveWithLowAccuracy(battler, RIGHT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) + || (!IsBattlerGrounded(RIGHT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) + return FIELD_EFFECT_POSITIVE; + } + + return FIELD_EFFECT_NEUTRAL; +} + + static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) { // If we're in singles, we literally only care about speed. if (IsBattle1v1()) { - if (gAiLogicData->speedStats[battler] < gAiLogicData->speedStats[FOE(battler)]) + if (gAiLogicData->speedStats[battler] < gAiLogicData->speedStats[LEFT_FOE(battler)]) return FIELD_EFFECT_POSITIVE; // If we tie, we shouldn't change trick room state. - else if (gAiLogicData->speedStats[battler] == gAiLogicData->speedStats[FOE(battler)]) + else if (gAiLogicData->speedStats[battler] == gAiLogicData->speedStats[LEFT_FOE(battler)]) return FIELD_EFFECT_NEUTRAL; else return FIELD_EFFECT_NEGATIVE; @@ -455,7 +489,7 @@ static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) } // If we are faster or tie, we don't want trick room. - if ((gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[FOE(battler)]) || (gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[BATTLE_PARTNER(FOE(battler))])) + if ((gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[LEFT_FOE(battler)]) || (gAiLogicData->speedStats[battler] >= gAiLogicData->speedStats[RIGHT_FOE(battler)])) return FIELD_EFFECT_NEGATIVE; return FIELD_EFFECT_POSITIVE; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index cedb2db5e7..bd1ebe3a36 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1,5 +1,3 @@ -// Note that FOE specifically returns the left-side battler; BATTLE_OPPOSITE is the diagonal. - #include "global.h" #include "main.h" #include "malloc.h" @@ -1892,15 +1890,15 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { if (CountUsablePartyMons(battlerAtk) == 0 && aiData->abilities[battlerAtk] != ABILITY_SOUNDPROOF - && aiData->abilities[BATTLE_PARTNER(battlerAtk)] != ABILITY_SOUNDPROOF - && CountUsablePartyMons(FOE(battlerAtk)) >= 1) + && CountUsablePartyMons(battlerDef) >= 1 + && (aiData->abilities[BATTLE_PARTNER(battlerAtk)] != ABILITY_SOUNDPROOF || !IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))) { ADJUST_SCORE(-10); //Don't wipe your team if you're going to lose } - else if ((!IsBattlerAlive(FOE(battlerAtk)) || aiData->abilities[FOE(battlerAtk)] == ABILITY_SOUNDPROOF - || gBattleMons[FOE(battlerAtk)].volatiles.perishSong) - && (!IsBattlerAlive(BATTLE_PARTNER(FOE(battlerAtk))) || aiData->abilities[BATTLE_PARTNER(FOE(battlerAtk))] == ABILITY_SOUNDPROOF - || gBattleMons[BATTLE_PARTNER(FOE(battlerAtk))].volatiles.perishSong)) + else if ((!IsBattlerAlive(LEFT_FOE(battlerAtk)) || aiData->abilities[LEFT_FOE(battlerAtk)] == ABILITY_SOUNDPROOF + || gBattleMons[LEFT_FOE(battlerAtk)].volatiles.perishSong) + && (!IsBattlerAlive(RIGHT_FOE(battlerAtk)) || aiData->abilities[RIGHT_FOE(battlerAtk)] == ABILITY_SOUNDPROOF + || gBattleMons[RIGHT_FOE(battlerAtk)].volatiles.perishSong)) { ADJUST_SCORE(-10); //Both enemies are perish songed } @@ -1915,7 +1913,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && CountUsablePartyMons(battlerDef) >= 1) ADJUST_SCORE(-10); - if (gBattleMons[FOE(battlerAtk)].volatiles.perishSong || aiData->abilities[FOE(battlerAtk)] == ABILITY_SOUNDPROOF) + if (gBattleMons[battlerDef].volatiles.perishSong || aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF) ADJUST_SCORE(-10); } break; @@ -2345,11 +2343,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-9); break; case EFFECT_COURT_CHANGE: - if (gSideStatuses[GetBattlerSide(FOE(battlerAtk))] & SIDE_STATUS_BAD_COURT) + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_BAD_COURT) ADJUST_SCORE(BAD_EFFECT); if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_GOOD_COURT) ADJUST_SCORE(BAD_EFFECT); - if (AreAnyHazardsOnSide(GetBattlerSide(FOE(battlerAtk))) && CountUsablePartyMons(battlerAtk) != 0) + if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerAtk) != 0) ADJUST_SCORE(WORST_EFFECT); if (hasPartner) { @@ -3116,38 +3114,38 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - u32 ownHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtk, BATTLE_OPPOSITE(battlerAtk), AI_ATTACKING); - u32 partnerHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtk), AI_ATTACKING); - u32 ownHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), AI_ATTACKING); - u32 partnerHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtkPartner, BATTLE_OPPOSITE(battlerAtkPartner), AI_ATTACKING); + u32 ownHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtk, LEFT_FOE(battlerAtk), AI_ATTACKING); + u32 partnerHitsToKOFoe1 = GetBestNoOfHitsToKO(battlerAtkPartner, LEFT_FOE(battlerAtk), AI_ATTACKING); + u32 ownHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtk, RIGHT_FOE(battlerAtk), AI_ATTACKING); + u32 partnerHitsToKOFoe2 = GetBestNoOfHitsToKO(battlerAtkPartner, RIGHT_FOE(battlerAtk), AI_ATTACKING); if (hasTwoOpponents) { // Might be about to die - if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtk) && CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) - && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) - && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) + if (CanTargetFaintAi(LEFT_FOE(battlerAtk), battlerAtk) && CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, LEFT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) + && AI_IsSlower(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1 && ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) ADJUST_SCORE(GOOD_EFFECT); } - else if (IsBattlerAlive(BATTLE_OPPOSITE(battlerAtk))) + else if (IsBattlerAlive(LEFT_FOE(battlerAtk))) { // Might be about to die - if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtk) - && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) + if (CanTargetFaintAi(LEFT_FOE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, LEFT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe1 > partnerHitsToKOFoe1 && partnerHitsToKOFoe1 > 1) ADJUST_SCORE(GOOD_EFFECT); } - else if (IsBattlerAlive(BATTLE_OPPOSITE(battlerAtkPartner))) + else if (IsBattlerAlive(RIGHT_FOE(battlerAtk))) { // Might be about to die - if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) - && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) + if (CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) + && AI_IsSlower(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) @@ -3663,8 +3661,8 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && HasMoveWithEffect(battlerAtkPartner, EFFECT_TRICK_ROOM)) ADJUST_SCORE(DECENT_EFFECT); - if (AI_IsSlower(battlerAtkPartner, FOE(battlerAtkPartner), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Opponent mon 1 goes before partner - && AI_IsSlower(battlerAtkPartner, BATTLE_PARTNER(FOE(battlerAtkPartner)), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Opponent mon 2 goes before partner + if (AI_IsSlower(battlerAtkPartner, LEFT_FOE(battlerAtk), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Opponent mon 1 goes before partner + && AI_IsSlower(battlerAtkPartner, RIGHT_FOE(battlerAtk), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Opponent mon 2 goes before partner { if (partnerEffect == EFFECT_COUNTER || partnerEffect == EFFECT_MIRROR_COAT) break; // These moves need to go last @@ -3673,8 +3671,8 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_HEAL_PULSE: case EFFECT_HIT_ENEMY_HEAL_ALLY: - if (AI_IsFaster(battlerAtk, FOE(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) - && AI_IsFaster(battlerAtk, BATTLE_PARTNER(FOE(battlerAtk)), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) + if (AI_IsFaster(battlerAtk, LEFT_FOE(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) + && AI_IsFaster(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && gBattleMons[battlerAtkPartner].hp < gBattleMons[battlerAtkPartner].maxHP / 2) RETURN_SCORE_PLUS(WEAK_EFFECT); break; @@ -4260,16 +4258,16 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPATK)); } - if (IS_BATTLER_OF_TYPE(FOE(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(FOE(battlerAtk))) + if (IS_BATTLER_OF_TYPE(LEFT_FOE(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(LEFT_FOE(battlerAtk))) { - if (aiData->abilities[FOE(battlerAtk)] == ABILITY_CONTRARY) + if (aiData->abilities[LEFT_FOE(battlerAtk)] == ABILITY_CONTRARY) ADJUST_SCORE(WEAK_EFFECT); else ADJUST_SCORE(AWFUL_EFFECT); } - if (IS_BATTLER_OF_TYPE(BATTLE_PARTNER(FOE(battlerAtk)), TYPE_GRASS) && IsBattlerGrounded(BATTLE_PARTNER(FOE(battlerAtk)))) + if (IS_BATTLER_OF_TYPE(RIGHT_FOE(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(RIGHT_FOE(battlerAtk))) { - if (aiData->abilities[BATTLE_PARTNER(FOE(battlerAtk))] == ABILITY_CONTRARY) + if (aiData->abilities[RIGHT_FOE(battlerAtk)] == ABILITY_CONTRARY) ADJUST_SCORE(WEAK_EFFECT); else ADJUST_SCORE(AWFUL_EFFECT); @@ -4284,16 +4282,16 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_DEF)); } - if (IS_BATTLER_OF_TYPE(FOE(battlerAtk), TYPE_GRASS)) + if (IS_BATTLER_OF_TYPE(LEFT_FOE(battlerAtk), TYPE_GRASS)) { - if (aiData->abilities[FOE(battlerAtk)] == ABILITY_CONTRARY) + if (aiData->abilities[LEFT_FOE(battlerAtk)] == ABILITY_CONTRARY) ADJUST_SCORE(WEAK_EFFECT); else ADJUST_SCORE(AWFUL_EFFECT); } - if (IS_BATTLER_OF_TYPE(BATTLE_PARTNER(FOE(battlerAtk)), TYPE_GRASS)) + if (IS_BATTLER_OF_TYPE(RIGHT_FOE(battlerAtk), TYPE_GRASS)) { - if (aiData->abilities[BATTLE_PARTNER(FOE(battlerAtk))] == ABILITY_CONTRARY) + if (aiData->abilities[RIGHT_FOE(battlerAtk)] == ABILITY_CONTRARY) ADJUST_SCORE(WEAK_EFFECT); else ADJUST_SCORE(AWFUL_EFFECT); @@ -4529,7 +4527,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_LOCK_ON: if (HasMoveWithEffect(battlerAtk, EFFECT_OHKO) || HasMoveWithEffect(battlerAtk, EFFECT_SHEER_COLD)) ADJUST_SCORE(GOOD_EFFECT); - else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 85, TRUE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) + else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 85, TRUE)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_DESTINY_BOND: @@ -4818,7 +4816,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) //ADJUST_SCORE(8); break; case EFFECT_COURT_CHANGE: - if (gSideStatuses[GetBattlerSide(FOE(battlerAtk))] & SIDE_STATUS_GOOD_COURT) + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_GOOD_COURT) ADJUST_SCORE(WEAK_EFFECT); if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_BAD_COURT) ADJUST_SCORE(WEAK_EFFECT); @@ -5294,11 +5292,16 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_GRAVITY: - if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY || ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_GRAVITY))) { - if (HasSleepMoveWithLowAccuracy(battlerAtk, battlerDef)) // Has Gravity for a move like Hypnosis + // improve accuracy of Hypnosis + if (HasSleepMoveWithLowAccuracy(battlerAtk, battlerDef) + || HasSleepMoveWithLowAccuracy(BATTLE_PARTNER(battlerAtk), battlerDef)) IncreaseSleepScore(battlerAtk, battlerDef, move, &score); - if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) + if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, TRUE) + || HasMoveWithLowAccuracy(BATTLE_PARTNER(battlerAtk), battlerDef, 90, TRUE)) + ADJUST_SCORE(WEAK_EFFECT); + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRAVITY)) ADJUST_SCORE(DECENT_EFFECT); } break; @@ -5341,8 +5344,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TELEKINESIS: - if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]) - || !IsBattlerGrounded(battlerDef)) + if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE) || !IsBattlerGrounded(battlerDef)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_HEAL_BLOCK: @@ -5404,8 +5406,8 @@ case EFFECT_GUARD_SPLIT: u32 tailwindScore = 0; u32 speed = aiData->speedStats[battlerAtk]; u32 partnerSpeed = aiData->speedStats[BATTLE_PARTNER(battlerAtk)]; - u32 foe1Speed = aiData->speedStats[FOE(battlerAtk)]; - u32 foe2Speed = aiData->speedStats[BATTLE_PARTNER(FOE(battlerAtk))]; + u32 foe1Speed = aiData->speedStats[LEFT_FOE(battlerAtk)]; + u32 foe2Speed = aiData->speedStats[RIGHT_FOE(battlerAtk)]; if (speed <= foe1Speed && (speed * 2) > foe1Speed) tailwindScore += 1; @@ -5795,6 +5797,78 @@ case EFFECT_GUARD_SPLIT: if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_WATER) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL)) ADJUST_SCORE(DECENT_EFFECT); break; + case MOVE_EFFECT_SUN: + if (ShouldSetWeather(battlerAtk, B_WEATHER_SUN)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_SUN)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_RAIN: + if (ShouldSetWeather(battlerAtk, B_WEATHER_RAIN)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_RAIN)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_SANDSTORM: + if (ShouldSetWeather(battlerAtk, B_WEATHER_SANDSTORM)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_SANDSTORM)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_HAIL: + if (ShouldSetWeather(battlerAtk, B_WEATHER_HAIL)) + ADJUST_SCORE(DECENT_EFFECT); + if (ShouldClearWeather(battlerAtk, B_WEATHER_HAIL)) + ADJUST_SCORE(BAD_EFFECT); + break; + case MOVE_EFFECT_MISTY_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); + break; + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_GRASSY_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); + break; + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_ELECTRIC_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); + break; + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_PSYCHIC_TERRAIN: + if (ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) + { + ADJUST_SCORE(BAD_EFFECT); + break; + } + if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) + || ShouldClearFieldStatus(battlerAtk, gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_GRAVITY: + if (!(gFieldStatuses & STATUS_FIELD_GRAVITY) && ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_GRAVITY)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_AURORA_VEIL: + if (ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + ADJUST_SCORE(DECENT_EFFECT); + break; default: break; } @@ -6048,7 +6122,7 @@ static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING); if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY && hitsToKO > 0 && - (GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0 || GetNoOfHitsToKOBattler(battlerAtk, FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0)) + (GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0 || GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0)) ADJUST_SCORE(BEST_EFFECT); if (hitsToKO > 0) @@ -6128,8 +6202,8 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (gBattleMons[battlerDef].volatiles.healBlock) return 0; - if (CanTargetFaintAi(FOE(battlerAtk), BATTLE_PARTNER(battlerAtk)) - || (CanTargetFaintAi(BATTLE_PARTNER(FOE(battlerAtk)), BATTLE_PARTNER(battlerAtk)))) + if (CanTargetFaintAi(LEFT_FOE(battlerAtk), BATTLE_PARTNER(battlerAtk)) + || CanTargetFaintAi(RIGHT_FOE(battlerAtk), BATTLE_PARTNER(battlerAtk))) ADJUST_SCORE(-1); if (gAiLogicData->hpPercents[battlerDef] <= 50) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index a43b957a50..c350c21c8f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2558,7 +2558,7 @@ bool32 HasMoveThatRaisesOwnStats(u32 battlerId) return FALSE; } -bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) +bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus) { s32 i; u16 *moves = GetMovesArray(battlerAtk); @@ -3884,7 +3884,7 @@ bool32 IsBattle1v1() bool32 HasTwoOpponents(u32 battler) { if (IsDoubleBattle() - && IsBattlerAlive(FOE(battler)) && IsBattlerAlive(BATTLE_PARTNER(FOE(battler)))) + && IsBattlerAlive(LEFT_FOE(battler)) && IsBattlerAlive(RIGHT_FOE(battler))) return TRUE; return FALSE; } @@ -5262,7 +5262,7 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) case STAT_SPATK: return (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)); case STAT_ACC: - return (HasLowAccuracyMove(battlerAtk, battlerDef)); + return HasMoveWithLowAccuracy(battlerAtk, battlerDef, LOW_ACCURACY_THRESHOLD, FALSE); case STAT_EVASION: case STAT_SPEED: return TRUE; @@ -5330,7 +5330,7 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] == MAX_STAT_STAGE || partnerAbility == ABILITY_CONTRARY || partnerAbility == ABILITY_GOOD_AS_GOLD - || HasBattlerSideMoveWithEffect(FOE(battlerAtk), EFFECT_FOUL_PLAY)) + || HasBattlerSideMoveWithEffect(LEFT_FOE(battlerAtk), EFFECT_FOUL_PLAY)) return FALSE; preventsStatLoss = !CanLowerStat(battlerAtk, battlerAtkPartner, aiData, STAT_DEF); @@ -5393,17 +5393,6 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) return scoreIncrease; } -bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef) -{ - int i; - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] <= LOW_ACCURACY_THRESHOLD) - return TRUE; - } - return FALSE; -} - bool32 IsBattlerItemEnabled(u32 battler) { if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_NEGATE_UNAWARE) @@ -5768,7 +5757,8 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData return GOOD_EFFECT; // Conditional ability logic goes here. case ABILITY_COMPOUND_EYES: - if (HasMoveWithLowAccuracy(battler, FOE(battler), 90, TRUE, aiData->abilities[battler], aiData->abilities[FOE(battler)], aiData->holdEffects[battler], aiData->holdEffects[FOE(battler)])) + if (HasMoveWithLowAccuracy(battler, LEFT_FOE(battler), 90, FALSE) + || HasMoveWithLowAccuracy(battler, RIGHT_FOE(battler), 90, FALSE)) return GOOD_EFFECT; break; case ABILITY_CONTRARY: @@ -5800,7 +5790,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData break; case ABILITY_INTIMIDATE: { - u32 abilityDef = aiData->abilities[FOE(battler)]; + u32 abilityDef = aiData->abilities[LEFT_FOE(battler)]; if (DoesIntimidateRaiseStats(abilityDef)) { return AWFUL_EFFECT; @@ -5809,26 +5799,27 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData { if (HasTwoOpponents(battler)) { - abilityDef = aiData->abilities[BATTLE_PARTNER(FOE(battler))]; + abilityDef = aiData->abilities[RIGHT_FOE(battler)]; if (DoesIntimidateRaiseStats(abilityDef)) { return AWFUL_EFFECT; } else { - s32 score1 = IncreaseStatDownScore(battler, FOE(battler), STAT_ATK); - s32 score2 = IncreaseStatDownScore(battler, BATTLE_PARTNER(FOE(battler)), STAT_ATK); + s32 score1 = IncreaseStatDownScore(battler, LEFT_FOE(battler), STAT_ATK); + s32 score2 = IncreaseStatDownScore(battler, RIGHT_FOE(battler), STAT_ATK); if (score1 > score2) return score1; else return score2; } } - return IncreaseStatDownScore(battler, FOE(battler), STAT_ATK); + return IncreaseStatDownScore(battler, LEFT_FOE(battler), STAT_ATK); } } case ABILITY_NO_GUARD: - if (HasLowAccuracyMove(battler, FOE(battler))) + if (HasMoveWithLowAccuracy(battler, LEFT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) + || HasMoveWithLowAccuracy(battler, RIGHT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE)) return GOOD_EFFECT; break; // Toxic counter ticks upward while Poison Healed; losing Poison Heal while Toxiced can KO. diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c index f91658b3f7..8b6e985a93 100644 --- a/test/battle/ai/can_use_all_moves.c +++ b/test/battle/ai/can_use_all_moves.c @@ -313,7 +313,6 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") case EFFECT_COPYCAT: case EFFECT_LAST_RESORT: case EFFECT_AQUA_RING: - case EFFECT_GRAVITY: case EFFECT_HEALING_WISH: //TODO: AI TESTS @@ -327,6 +326,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") case EFFECT_MAGNET_RISE: // tests exist elsewhere + case EFFECT_GRAVITY: case EFFECT_HEAL_BELL: case EFFECT_ATTACK_UP_USER_ALLY: diff --git a/test/battle/move_effect/gravity.c b/test/battle/move_effect/gravity.c index baac7a53ea..ec24917f6d 100644 --- a/test/battle/move_effect/gravity.c +++ b/test/battle/move_effect/gravity.c @@ -45,3 +45,36 @@ DOUBLE_BATTLE_TEST("Gravity cancels fly and sky drop if they are in the air") EXPECT_EQ(gLastMoves[0], MOVE_GRAVITY); } } + +AI_DOUBLE_BATTLE_TEST("AI uses Gravity") +{ + u32 move, friendItem, foeItem; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { move = MOVE_THUNDER; friendItem = ITEM_NONE; foeItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } + PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_THUNDER; friendItem = ITEM_NONE; foeItem = ITEM_NONE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET) { Item(foeItem); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GRAVITY, MOVE_HEADBUTT, MOVE_TAUNT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_EARTH_POWER); Item(friendItem); } + } WHEN { + if (move == MOVE_THUNDER || (foeItem == ITEM_AIR_BALLOON && friendItem != ITEM_AIR_BALLOON)) + TURN { EXPECT_MOVE(opponentLeft, MOVE_GRAVITY); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_GRAVITY); } + } +} + From abc0e1055858b3caa440aac0e7fccb503e2e36ef Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 13 Sep 2025 04:58:16 -0400 Subject: [PATCH 034/183] Moving additional effects out of AI_CalcMoveEffectScore and into AI_CalcMoveAdditionalEffectScore (#7727) --- src/battle_ai_main.c | 51 +++++++++++++++++++++++-------- test/battle/ability/sheer_force.c | 16 ++++++++++ 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index bd1ebe3a36..fb0e40bfd3 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3990,9 +3990,8 @@ static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef) } } -static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) +static s32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { - struct AiLogicData *aiData = gAiLogicData; enum ItemHoldEffect holdEffect = aiData->holdEffects[battlerAtk]; s32 score = 0; @@ -4020,17 +4019,16 @@ static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) return score; } -static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) +static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { // move data enum BattleMoveEffects moveEffect = GetMoveEffect(move); - struct AiLogicData *aiData = gAiLogicData; u32 movesetIndex = gAiThinkingStruct->movesetIndex; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; s32 score = 0; - u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); u32 predictedType = GetMoveType(predictedMove); u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); bool32 isBattle1v1 = IsBattle1v1(); @@ -4052,7 +4050,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(10); // check burn / frostbite - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && gAiLogicData->abilities[battlerAtk] == ABILITY_NATURAL_CURE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && aiData->abilities[battlerAtk] == ABILITY_NATURAL_CURE) { if ((gBattleMons[battlerAtk].status1 & STATUS1_BURN && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL, TRUE)) || (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL, TRUE))) @@ -4478,7 +4476,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_BATON_PASS: - if ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].volatiles.substitute + if ((aiData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].volatiles.substitute || gBattleMons[battlerAtk].volatiles.powerTrick || gBattleMons[battlerAtk].volatiles.magnetRise || gBattleMons[battlerAtk].volatiles.aquaRing @@ -5482,9 +5480,9 @@ case EFFECT_GUARD_SPLIT: if (GetFirstFaintedPartyIndex(battlerAtk) != PARTY_SIZE) { ADJUST_SCORE(DECENT_EFFECT); - if (gAiLogicData->shouldSwitch & (1u << battlerAtk)) // Bad matchup + if (aiData->shouldSwitch & (1u << battlerAtk)) // Bad matchup ADJUST_SCORE(WEAK_EFFECT); - if (gAiLogicData->mostSuitableMonId[battlerAtk] != PARTY_SIZE) // Good mon to send in after + if (aiData->mostSuitableMonId[battlerAtk] != PARTY_SIZE) // Good mon to send in after ADJUST_SCORE(WEAK_EFFECT); } break; @@ -5590,11 +5588,30 @@ case EFFECT_GUARD_SPLIT: break; } // move effect checks + return score; +} + +static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +{ + // move data + s32 score = 0; + + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); + bool32 hasPartner = HasPartner(battlerAtk); + u32 i; u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + // check move additional effects that are likely to happen for (i = 0; i < additionalEffectCount; i++) { const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + + if (aiData->abilities[battlerAtk] == ABILITY_SHEER_FORCE) + { + if ((additionalEffect->chance > 0) != additionalEffect->sheerForceOverride) + continue; + } + // Only consider effects with a guaranteed chance to happen if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], additionalEffect)) continue; @@ -5753,8 +5770,12 @@ case EFFECT_GUARD_SPLIT: IncreasePoisonScore(battlerAtk, battlerDef, move, &score); break; case MOVE_EFFECT_CLEAR_SMOG: + { + bool32 moveTargetsBothOpponents = HasTwoOpponents(battlerAtk) && (gMovesInfo[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_ALL_BATTLERS)); + score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; + } case MOVE_EFFECT_BUG_BITE: // And pluck if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) break; @@ -5783,6 +5804,8 @@ case EFFECT_GUARD_SPLIT: case MOVE_EFFECT_THROAT_CHOP: if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) { + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); else @@ -5874,13 +5897,14 @@ case EFFECT_GUARD_SPLIT: } } } - return score; } // AI_FLAG_CHECK_VIABILITY - Chooses best possible move to hit player static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { + struct AiLogicData *aiData = gAiLogicData; + // Targeting partner, check benefits of doing that instead if (IsTargetingPartner(battlerAtk, battlerDef)) return score; @@ -5897,8 +5921,9 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score } } - ADJUST_SCORE(AI_CalcMoveEffectScore(battlerAtk, battlerDef, move)); - ADJUST_SCORE(AI_CalcHoldEffectMoveScore(battlerAtk, battlerDef, move)); + ADJUST_SCORE(AI_CalcMoveEffectScore(battlerAtk, battlerDef, move, aiData)); + ADJUST_SCORE(AI_CalcAdditionalEffectScore(battlerAtk, battlerDef, move, aiData)); + ADJUST_SCORE(AI_CalcHoldEffectMoveScore(battlerAtk, battlerDef, move, aiData)); return score; } diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index d14d53571d..c6e84694ba 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -1358,3 +1358,19 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to EXPECT_EQ(damage2, damage1); } } + +AI_SINGLE_BATTLE_TEST("AI sees Sheer Force skips additional effects") +{ + u16 ability, expectedMove; + + PARAMETRIZE { ability = ABILITY_NONE; expectedMove = MOVE_POWER_UP_PUNCH; } + PARAMETRIZE { ability = ABILITY_SHEER_FORCE; expectedMove = MOVE_KARATE_CHOP; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Ability(ability); Moves(MOVE_POWER_UP_PUNCH, MOVE_KARATE_CHOP); } + } WHEN { + TURN { EXPECT_MOVE(opponent, expectedMove); } + } +} From 78a05c97acab8a79fc742c5dce06cf9e621551c4 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 14 Sep 2025 15:41:10 +0200 Subject: [PATCH 035/183] Refactors ruin ability checks into a field effect (#7711) --- data/battle_scripts_1.s | 2 +- include/battle_util.h | 1 + include/constants/battle.h | 8 ++- src/battle_ai_util.c | 28 ++++++++++- src/battle_script_commands.c | 8 ++- src/battle_util.c | 58 +++++++++++++++++++--- src/trade.c | 2 +- test/battle/ability/vessel_of_ruin.c | 73 ++++++++++++++++++++++++++++ 8 files changed, 167 insertions(+), 13 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index af5f7aa49d..1a7e91193f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2042,7 +2042,7 @@ BattleScript_EffectEntrainment:: tryentrainment BattleScript_ButItFailed attackanimation waitanimation - setlastusedability + switchinabilities BS_TARGET printstring STRINGID_PKMNACQUIREDABILITY waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd diff --git a/include/battle_util.h b/include/battle_util.h index 745ad9a7f8..a1eea3b770 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -413,5 +413,6 @@ bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCom bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); u32 GetNaturePowerMove(u32 battler); u32 GetNaturePowerMove(u32 battler); +void RemoveAbilityFlags(u32 battler); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 503caf406e..47fff193a6 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -195,7 +195,11 @@ enum VolatileFlags F(VOLATILE_HEAL_BLOCK, healBlock, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_AQUA_RING, aquaRing, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_LASER_FOCUS, laserFocus, (u32, 1)) \ - F(VOLATILE_POWER_TRICK, powerTrick, (u32, 1), V_BATON_PASSABLE) + F(VOLATILE_POWER_TRICK, powerTrick, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_VESSEL_OF_RUIN, vesselOfRuin, (u32, 1)) \ + F(VOLATILE_SWORD_OF_RUIN, swordOfRuin, (u32, 1)) \ + F(VOLATILE_TABLETS_OF_RUIN, tabletsOfRuin, (u32, 1)) \ + F(VOLATILE_BEADS_OF_RUIN, beadsOfRuin, (u32, 1)) /* Use within a macro to get the maximum allowed value for a volatile. Requires _typeMaxValue as input. */ @@ -363,7 +367,7 @@ enum BattleWeather #define B_WEATHER_LOW_LIGHT (B_WEATHER_FOG | B_WEATHER_ICY_ANY | B_WEATHER_RAIN | B_WEATHER_SANDSTORM) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) -// Explicit numbers until frostbite because those shouldn't be shifted +// Explicit numbers until frostbite because those shouldn't be shifted enum __attribute__((packed)) MoveEffect { MOVE_EFFECT_NONE = 0, diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c350c21c8f..eac7e728b1 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2160,7 +2160,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) case STAT_SPEED: { u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - if (AI_IsSlower(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) + if (AI_IsSlower(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) || AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) tempScore += DECENT_EFFECT; break; @@ -4251,6 +4251,28 @@ void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons) Free(savedBattleMons); } +// Set potential field effect from ability for switch in +static void SetBattlerFieldStatusForSwitchin(u32 battler) +{ + switch (gAiLogicData->abilities[battler]) + { + case ABILITY_VESSEL_OF_RUIN: + gBattleMons[battler].volatiles.vesselOfRuin = TRUE; + break; + case ABILITY_SWORD_OF_RUIN: + gBattleMons[battler].volatiles.swordOfRuin = TRUE; + break; + case ABILITY_TABLETS_OF_RUIN: + gBattleMons[battler].volatiles.tabletsOfRuin = TRUE; + break; + case ABILITY_BEADS_OF_RUIN: + gBattleMons[battler].volatiles.beadsOfRuin = TRUE; + break; + default: + break; + } +} + // party logic s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, enum DamageCalcContext calcContext) { @@ -4263,6 +4285,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl gBattleMons[battlerAtk] = switchinCandidate; gAiThinkingStruct->saved[battlerDef].saved = TRUE; SetBattlerAiData(battlerAtk, gAiLogicData); // set known opposing battler data + SetBattlerFieldStatusForSwitchin(battlerAtk); gAiThinkingStruct->saved[battlerDef].saved = FALSE; } else if (calcContext == AI_DEFENDING) @@ -4270,6 +4293,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl gBattleMons[battlerDef] = switchinCandidate; gAiThinkingStruct->saved[battlerAtk].saved = TRUE; SetBattlerAiData(battlerDef, gAiLogicData); // set known opposing battler data + SetBattlerFieldStatusForSwitchin(battlerDef); gAiThinkingStruct->saved[battlerAtk].saved = FALSE; } @@ -4947,7 +4971,9 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return ShouldRaiseAnyStat(battlerAtk, battlerDef); } else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) + { return FALSE; + } uq4_12_t effectiveness; struct SimulatedDamage dmg; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 616b64dce6..d39642dd21 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6150,7 +6150,7 @@ static void Cmd_moveend(void) if (!IsOnPlayerSide(gBattlerAttacker)) UpdateStallMons(); if ((gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) - || (gBattleMons[gBattlerAttacker].volatiles.flinched) + || gBattleMons[gBattlerAttacker].volatiles.flinched || gBattleStruct->pledgeMove == TRUE // Is the battler that uses the first Pledge move in the combo || gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility) gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; @@ -12681,6 +12681,7 @@ static void Cmd_trycopyability(void) } else { + RemoveAbilityFlags(battler); gBattleScripting.abilityPopupOverwrite = gBattleMons[battler].ability; gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = defAbility; gLastUsedAbility = defAbility; @@ -12856,6 +12857,8 @@ static void Cmd_tryswapabilities(void) if (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerAttacker].ability; gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RemoveAbilityFlags(gBattlerTarget); + RemoveAbilityFlags(gBattlerAttacker); gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gLastUsedAbility; @@ -14266,6 +14269,7 @@ static void Cmd_tryworryseed(void) if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; + RemoveAbilityFlags(gBattlerTarget); gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_INSOMNIA; gBattlescriptCurrInstr = cmd->nextInstr; @@ -17063,6 +17067,7 @@ void BS_SetSimpleBeam(void) if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; + RemoveAbilityFlags(gBattlerTarget); gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = ABILITY_SIMPLE; gBattlescriptCurrInstr = cmd->nextInstr; @@ -17092,6 +17097,7 @@ void BS_TryEntrainment(void) } else { + RemoveAbilityFlags(gBattlerTarget); gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index 6a1eba7136..a75c8397dd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4173,6 +4173,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_VESSEL_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.vesselOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); @@ -4182,6 +4183,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_SWORD_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.swordOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); @@ -4191,6 +4193,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_TABLETS_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.tabletsOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); @@ -4200,6 +4203,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_BEADS_OF_RUIN: if (!gSpecialStatuses[battler].switchInAbilityDone) { + gBattleMons[battler].volatiles.beadsOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); @@ -4694,7 +4698,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; } - + + RemoveAbilityFlags(gBattlerAttacker); gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; BattleScriptCall(BattleScript_MummyActivates); @@ -4720,6 +4725,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; } + RemoveAbilityFlags(gBattlerAttacker); gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gLastUsedAbility; @@ -8696,6 +8702,20 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) return uq4_12_multiply_by_int_half_down(modifier, basePower); } +static bool32 IsRuinStatusActive(u32 fieldEffect) +{ + if (IsNeutralizingGasOnField()) // Neutralizing Gas still blocks Ruin field statuses + return FALSE; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (GetBattlerVolatile(battler, fieldEffect)) + return TRUE; + } + + return FALSE; +} + static inline u32 CalcAttackStat(struct DamageContext *ctx) { u8 atkStage; @@ -8927,11 +8947,11 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) } } - // field abilities - if (IsAbilityOnField(ABILITY_VESSEL_OF_RUIN) && ctx->abilityAtk != ABILITY_VESSEL_OF_RUIN && IsBattleMoveSpecial(move)) + // Ruin field effects + if (IsBattleMoveSpecial(move) && !gBattleMons[ctx->battlerAtk].volatiles.vesselOfRuin && IsRuinStatusActive(VOLATILE_VESSEL_OF_RUIN)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); - if (IsAbilityOnField(ABILITY_TABLETS_OF_RUIN) && ctx->abilityAtk != ABILITY_TABLETS_OF_RUIN && IsBattleMovePhysical(move)) + if (IsBattleMovePhysical(move) && !gBattleMons[ctx->battlerAtk].volatiles.tabletsOfRuin && IsRuinStatusActive(VOLATILE_TABLETS_OF_RUIN)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); // attacker's hold effect @@ -9095,11 +9115,11 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) } } - // field abilities - if (IsAbilityOnField(ABILITY_SWORD_OF_RUIN) && ctx->abilityDef != ABILITY_SWORD_OF_RUIN && usesDefStat) + // Ruin field effects + if (usesDefStat && !gBattleMons[ctx->battlerDef].volatiles.swordOfRuin && IsRuinStatusActive(VOLATILE_SWORD_OF_RUIN)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); - if (IsAbilityOnField(ABILITY_BEADS_OF_RUIN) && ctx->abilityDef != ABILITY_BEADS_OF_RUIN && !usesDefStat) + if (!usesDefStat && !gBattleMons[ctx->battlerDef].volatiles.beadsOfRuin && IsRuinStatusActive(VOLATILE_BEADS_OF_RUIN)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.75)); // target's hold effects @@ -12141,3 +12161,27 @@ static u32 GetMeFirstMove(void) return move; } + +void RemoveAbilityFlags(u32 battler) +{ + switch (GetBattlerAbility(battler)) + { + case ABILITY_FLASH_FIRE: + gDisableStructs[battler].flashFireBoosted = FALSE; + break; + case ABILITY_VESSEL_OF_RUIN: + gBattleMons[battler].volatiles.vesselOfRuin = FALSE; + break; + case ABILITY_TABLETS_OF_RUIN: + gBattleMons[battler].volatiles.tabletsOfRuin = FALSE; + break; + case ABILITY_SWORD_OF_RUIN: + gBattleMons[battler].volatiles.swordOfRuin = FALSE; + break; + case ABILITY_BEADS_OF_RUIN: + gBattleMons[battler].volatiles.beadsOfRuin = FALSE; + break; + default: + break; + } +} diff --git a/src/trade.c b/src/trade.c index 5fd04e1f82..9a76c9aec5 100644 --- a/src/trade.c +++ b/src/trade.c @@ -138,7 +138,7 @@ enum { #define NUM_CHOOSE_PKMN_SPRITES (1 + GFXTAG_CHOOSE_PKMN_EMPTY_3 - GFXTAG_CHOOSE_PKMN_L) // Values for signaling to/from the link partner -enum { +enum SignalStatus { STATUS_NONE, STATUS_READY, STATUS_CANCEL, diff --git a/test/battle/ability/vessel_of_ruin.c b/test/battle/ability/vessel_of_ruin.c index 30c7520c36..1a075db8cf 100644 --- a/test/battle/ability/vessel_of_ruin.c +++ b/test/battle/ability/vessel_of_ruin.c @@ -73,3 +73,76 @@ SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battle MESSAGE("The opposing Ting-Lu's Vessel of Ruin weakened the Sp. Atk of all surrounding Pokémon!"); } } + +DOUBLE_BATTLE_TEST("Vessel of Ruin does not reduce Sp. Atk if Neutralizing Gas is on the field") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_TING_LU) { Ability(ABILITY_VESSEL_OF_RUIN); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_WATER_GUN, target: opponentLeft); + } + TURN { + SWITCH(opponentRight, 2); + MOVE(playerLeft, MOVE_WATER_GUN, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[0], Q_4_12(1.33), damage[1]); + } +} + +SINGLE_BATTLE_TEST("Vessel of Ruin is still active if removed by Mold Breaker + Entrainment") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_TING_LU) { Ability(ABILITY_VESSEL_OF_RUIN); } + OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + } WHEN { + TURN { MOVE(opponent, MOVE_WATER_GUN); } + TURN { MOVE(opponent, MOVE_ENTRAINMENT); } + TURN { MOVE(opponent, MOVE_WATER_GUN); } + } SCENE { + ABILITY_POPUP(player, ABILITY_VESSEL_OF_RUIN); + MESSAGE("Ting-Lu's Vessel of Ruin weakened the Sp. Atk of all surrounding Pokémon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + HP_BAR(player, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENTRAINMENT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); + HP_BAR(player, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +DOUBLE_BATTLE_TEST("Vessel of Ruin is active if removed by Mold Breaker Entrainment and Sword of Ruin is active after obtaining it") +{ + GIVEN { + PLAYER(SPECIES_TING_LU) { Ability(ABILITY_VESSEL_OF_RUIN); } + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ENTRAINMENT, target: playerLeft); + MOVE(opponentRight, MOVE_SKILL_SWAP, target: playerLeft); + MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); + } + } THEN { + bool32 isVesselOfRuinActive = gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.vesselOfRuin; + bool32 isSwordOfRuinActive = gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.swordOfRuin; + EXPECT_EQ(isVesselOfRuinActive, TRUE); + EXPECT_EQ(isSwordOfRuinActive, TRUE); + } +} From 5ce49f3cb708acf6e7fef4b66427df8a968770a9 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Sun, 14 Sep 2025 20:44:31 +0200 Subject: [PATCH 036/183] Config for capture to appear critical if the pokemon is already caught (#7730) Co-authored-by: Bassoonian --- include/config/battle.h | 1 + src/battle_script_commands.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index 82dd059754..6f48f0fc19 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -289,6 +289,7 @@ #define B_CATCHING_CHARM_BOOST 20 // % boost in Critical Capture odds if player has the Catching Charm. #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. #define B_CRITICAL_CAPTURE_LOCAL_DEX TRUE // If set to FALSE, Critical Capture % is based off of the National Pokedex estimated by enabled generations. +#define B_CRITICAL_CAPTURE_IF_OWNED GEN_LATEST // In Gen9, a capture appear critical if the pokemon you are trying to catch already has a dex entry (has already been caught) #define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented #define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d39642dd21..3b2eeeb942 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -13674,9 +13674,13 @@ static void Cmd_handleballthrow(void) if (shakes == maxShakes) // mon caught, copy of the code above { - if (IsCriticalCapture()) + enum NationalDexOrder natDexNo = SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species); + if ((B_CRITICAL_CAPTURE_IF_OWNED >= GEN_9 && GetSetPokedexFlag(natDexNo, FLAG_GET_CAUGHT)) + || IsCriticalCapture()) + { + gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE; - + } TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); From 59a214828ec354005b1ff01cc42a1216daf4544c Mon Sep 17 00:00:00 2001 From: mudskipper13 <105766191+mudskipper13@users.noreply.github.com> Date: Mon, 15 Sep 2025 01:45:18 +0700 Subject: [PATCH 037/183] Implement `field_name_box` (#7697) Co-authored-by: Bassoonian --- asm/macros/event.inc | 8 + charmap.txt | 7 + data/event_scripts.s | 1 + docs/tutorials/how_to_namebox.md | 100 ++++++++++ docs/tutorials/img/namebox/msgbox.gif | Bin 0 -> 552593 bytes docs/tutorials/img/namebox/npc_trainers.gif | Bin 0 -> 88348 bytes docs/tutorials/img/namebox/pokenav.gif | Bin 0 -> 802936 bytes graphics/pokenav/name_box.png | Bin 0 -> 205 bytes graphics/text_window/name_box.png | Bin 0 -> 213 bytes include/config/overworld.h | 12 ++ include/constants/characters.h | 1 + include/constants/speaker_names.h | 11 ++ include/field_name_box.h | 17 ++ include/match_call.h | 1 + include/menu.h | 1 + src/battle_setup.c | 11 ++ src/data/speaker_names.h | 5 + src/field_message_box.c | 12 +- src/field_name_box.c | 194 ++++++++++++++++++++ src/match_call.c | 34 +++- src/menu.c | 48 +++++ src/string_util.c | 1 + src/text.c | 12 ++ 23 files changed, 470 insertions(+), 6 deletions(-) create mode 100644 docs/tutorials/how_to_namebox.md create mode 100644 docs/tutorials/img/namebox/msgbox.gif create mode 100644 docs/tutorials/img/namebox/npc_trainers.gif create mode 100644 docs/tutorials/img/namebox/pokenav.gif create mode 100644 graphics/pokenav/name_box.png create mode 100644 graphics/text_window/name_box.png create mode 100644 include/constants/speaker_names.h create mode 100644 include/field_name_box.h create mode 100644 src/data/speaker_names.h create mode 100644 src/field_name_box.c diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 49e0109451..d2329a6922 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2654,3 +2654,11 @@ callnative ScriptChangeFollowerNPCBattlePartner .2byte \battlePartner .endm + + @ Manually buffer a string as the speaker's name for namebox. + @ The next shown message/msgbox will include a namebox, if the provided string is not NULL. + @ An SP_NAME_* constant can also be used, it'll take the name from gSpeakerNamesTable instead. + .macro setspeaker name:req + callnative SetSpeaker + .4byte \name + .endm diff --git a/charmap.txt b/charmap.txt index 83f2cf602b..dd2123f8f9 100644 --- a/charmap.txt +++ b/charmap.txt @@ -459,6 +459,13 @@ JPN = FC 15 ENG = FC 16 PAUSE_MUSIC = FC 17 RESUME_MUSIC = FC 18 +SPEAKER = FC 19 + +@ Speaker names, the order must be matching with include/constants/speaker_names.h +NAME_NONE = 00 +NAME_MOM = 01 +NAME_PLAYER = 02 +NAME_COUNT = 03 @ fonts diff --git a/data/event_scripts.s b/data/event_scripts.s index 9cedbb04d7..2fd8a0a151 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -62,6 +62,7 @@ #include "constants/union_room.h" #include "constants/vars.h" #include "constants/weather.h" +#include "constants/speaker_names.h" .include "asm/macros.inc" .include "asm/macros/event.inc" .include "constants/constants.inc" diff --git a/docs/tutorials/how_to_namebox.md b/docs/tutorials/how_to_namebox.md new file mode 100644 index 0000000000..db059af61d --- /dev/null +++ b/docs/tutorials/how_to_namebox.md @@ -0,0 +1,100 @@ +# How to Use Namebox + +_New implementation made by mudskipper13, originally made by Tustin2121._ + +## Overview + +![Npc Trainers](/docs/tutorials/img/namebox/npc_trainers.gif) +![Pokenav](/docs/tutorials/img/namebox/pokenav.gif) +![Messagebox](/docs/tutorials/img/namebox/msgbox.gif) + +This is a broad and self-contained implementation of Tustin2121's namebox feature branch [here](https://github.com/tustin2121/pokeemerald/tree/feature/namebox), which includes the following: +- Cleaner implementation of namebox onto both the field message box _and_ the field PokéNav textbox. +- New configs: + - `OW_NAME_BOX_USE_DYNAMIC_WIDTH` lets the namebox use dynamic window width depending on the speaker's string length. + - When disabled and/or the speaker name is too long, `OW_NAME_BOX_DEFAULT_WIDTH` will be used as the maximum width. + - `OW_NAME_BOX_NPC_TRAINER` lets any approaching NPC trainers shows a namebox in their dialogue automagically. + - `OW_NAME_BOX_DEFAULT_WIDTH` and `OW_NAME_BOX_DEFAULT_HEIGHT` sets the default width and height. + - `OW_NAME_BOX_FOREGROUND_COLOR` and `OW_NAME_BOX_SHADOW_COLOR` sets the default text colors, the background color is handled by the engine. + - `OW_FLAG_SUPPRESS_NAME_BOX` lets you enable/disable the namebox globally, assign a flag from [`include/constants/flags.h`](/include/constants/flags.h) onto this config to be able to use it. +- Added a Speaker Name table, frequently-used names can be stored into `gSpeakerNamesTable` in [`src/data/speaker_names.h`](/src/data/speaker_names.h) and they can accessed by using a `SP_NAME_*` constant defined in [`include/constants/speaker_names.h`](/include/constants/speaker_names.h). +- Added a new scripting macro `setspeaker ([textPointer]/[SP_NAME_*])`. + - Besides a text pointer, it is possible to use the Speaker Name table to set the textPointer with the `gSpeakerNamesTable` array instead. + - Feed it either `NULL` or `SP_NAME_NONE` will remove the namebox instead. + - `release`, `releaseall`, and `closemessage` will automatically remove the namebox, together with the messagebox. +- Added a new text control code/inline text `{SPEAKER NAME_*}`. + - Unlike the `setspeaker` macro, you can only use the `SP_NAME_*` constants for this. It is partly due to the text engine's limitation itself. + - You'll need to add the constants into `charmap.txt` to be able to use them for the same reason as above. + - Feed it `SP_NAME_NONE` to remove the namebox manually. + - Similarly, `release`, `releaseall`, and `closemessage` will automatically remove the namebox, together with the message box. + +## Usage + +### `setspeaker` +#### Using a text pointer +First, define your speaker's string. +``` +Speaker_Jeremy: + .string "Jeremy$" +``` + +And then in your script, add the `setspeaker` with the speaker's name earlier. +``` +... + setspeaker Speaker_Jeremy +... +``` + +If you are using poryscript, you can also include the string right there with the `setspeaker` aka inline. +``` +... + setspeaker("Jeremy") +... +``` +#### Using a `SP_NAME_*` constant +Add the `setspeaker` with your constant. +``` + setspeaker SP_NAME_JEREMY +``` +For instruction on how to add a new Speaker Name, continue [here](#adding-a-new-speaker-name). + +### `SPEAKER` inline +The usage is identical to using `setspeaker` with `SP_NAME_*` constant, but instead it's within your _text_ script and uses the constant you added to `charmap.txt`. +``` + "{SPEAKER NAME_JEREMY}Yo wassup!" +``` +For instruction on how to add a new Speaker Name, continue [here](#adding-a-new-speaker-name). + +### Adding a new Speaker Name +1. Add a new constant to [`include/constants/speaker_names.h`](/include/constants/speaker_names.h) just after `SP_NAME_NONE` _and_ before `SP_NAME_COUNT`. +```diff + enum SpeakerNames { + SP_NAME_NONE = 0, + SP_NAME_MOM, + SP_NAME_PLAYER, ++ SP_NAME_JEREMY, + SP_NAME_COUNT + }; + +``` + +2. Add an entry to `gSpeakerNamesTable` in [`src/data/speaker_names.h`](/src/data/speaker_names.h) with your newly added constant as the array index. +```diff + const u8 *const gSpeakerNamesTable[SP_NAME_COUNT] = + { + [SP_NAME_MOM] = COMPOUND_STRING("MOM"), + [SP_NAME_PLAYER] = COMPOUND_STRING("{PLAYER}"), ++ [SP_NAME_JEREMY] = COMPOUND_STRING("JEREMY"), + }; +``` + +3. In order for this constant to be usable for `{SPEAKER}` inline, you'll need to add your constant onto [`charmap.txt`](/charmap.txt). **Do note that the order here MUST match with the one in [`include/constants/speaker_names.h`](/include/constants/speaker_names.h)!** +```diff + @ Speaker names, the order must be matching with include/constants/speaker_names.h + NAME_NONE = 00 + NAME_MOM = 01 + NAME_PLAYER = 02 +-NAME_COUNT = 03 ++NAME_JEREMY = 03 ++NAME_COUNT = 04 +``` diff --git a/docs/tutorials/img/namebox/msgbox.gif b/docs/tutorials/img/namebox/msgbox.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5d9455725cdf2258761d92ff096a21c0509711f GIT binary patch literal 552593 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 z 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𲅣hAIZ=_R_hqmctl-}l}-=?eZzWy2E&14bC z+mqlvpWiy1+0bHfO_<1e7dbc#2Mjgo3$_)$KtX1V$dW$Hs^9iG1N&aQ%Ps&UTUc3_ zSQf67WsePKe?ixGSjyhK#n3y{sd%Z2*;fQmXE*TDHEh#;sE^WZP1PU9eNh^~U|n!g zRsht_Eq2a5T1s68Q9q`WgY8e9SJfg@D@zC^L_jGs*iQP7DFegG$8_!CXqo$TW59M|vd~sV;UQ1qK8N?kp z%XvJ{Er`NX-&WCn#C7l%P~*kbwp`J#TgiP{(M)bM*j72_h4?#8&vNCAbtRO%YSya? zqFV*VNAAVCa?J=So2%A=E|$)CZp!= zu6o6q?*lo;X}a4M`J2rfgE5Iuz^9aBAPR6RTJMaOJCw@tz7Z`laij9#xb2TmX)?mlP(sKjt#D16kZ;H z(1aVxv_tMTp8 z&FyY3?I+#s;d||UEA57m2Fh*xoYWRGp;S?_)*=f!=R52XUyGZ zW&_p;5)IO0ySwiSQ~~Q{>Xe8X(?nxXQ#QZS@AZ-IePi4E9vjSTi}_C9qJGwnbrlZA z#C|QbLXVH#*@>Ti#~@fr+;;-ClangSKfI9+Zd4cXn(6P_?mu}p(BDA5`Ds9N ztY0oPIW1YL4Ae(r|G)0Zv%$jII=4}9HaH`fkQl* zLwrIFpY(Iv9Sk@v~=^y3e#7BqxqH$kHMyWVKKdqQ)L7G97U?b45 z6QoylWjO1hDPLjavrv;xR>lvYQ{&QmE1{8v3!l=>=1o|m-m!6t9=PQM95_1qJ9RV! zYpkOk+_%~aQ5Xx)?2G-=B19Pzn@*S|-xBzjM5j$VjSW7u^-v`3$h57t!y)U~kj?h- zG_;9b<_RuF$QrY6v%FRdQ+kc%1ex&=!bEoqL5@W`7xcbP>9tSlbv|HE&8&nPj&`C_ zP2G(6E$3G?qcG@TKn>g8eXlgXNs zSnZLmoKqT~+i#f*FYH$}m{*CJ(-!HMH=Wg0o$b}~j;Ivi-s^K5?BhY|7ku5X9uq(_ zDg(-&7s>C}5F1d_huKy(nKXBGk<=5K0mxB}5UPCEXf#R`Pbw~`;q7?bl`fDcoto*wWo-yLh1gJ=ni^Az~%nSFICIYvdOW>@Rns;MeKL+*_85a8f&LEV zi7QDKzhumg^!Nh9!<-@ujFwqySK1OYki~$4-UYYW?F`4Y`jvO%s@wHT|Hj>Zr)u;ulY_o` z26u91eM457RTED+OdcSwc(c}|<25zm^eYCbr5}kdSDxfmc(Tyib#^PP{hYRV6EkPy z3Fq<&C+x6J;2#ow$yeEdAknPUzrVcRbVZQp`kxG6elZYCB7bnYfDYJv4?$7kxpT*HXD-~nsw;g5|7e%uoRP~YnkZ5^Sqd!k$+Z5w( zV3pfiYK{y3ABN+E$B7;l))vcHPg|8A>*is}XM-I&ORH>$ zIQgd@w#VNMPQldB{hBAv`=!&5%kP91qL-EltC%lOXTdQ~$I8&gnA2rc01`4%AQAyV zNC-9(ZZs}(P#`jHObh~L2gfI;r6s2)W~HXY1!oile@`e$DFYP;mgW={CskqNW79*h zJKEYi{(7W=!J)x^D13Bme1I^jytX;JJR!3xJ{>tMlpts|Xdz>+FohsF`5?Az{}A^$ z>*W0B#a{Hm;nnHQpYIR9e?MlXDgXG0hN_Uvo**6~@sg1!yz6A?~$5da;FD;x~IyO@`=+A?Kq00kv_Yyk6t&0%UaA?Q@r>#KgbjtbMm^^m2M{gGce9z} zv&39Kl&=N3_PS!vQLs6o=SG_Nmh(~W=~fFVQeVg#5vXv=lvv8~U8cDv0ez6ULgliJeWi8U3G3_@3ty8X^Z;%06Z zHia*{o$5bOzY~|KkhsQoYDGIi%fwTF_{Do9L0`RYT2jn(EZ||#btQHxd1JdgOr7I% zbjy(I&?dVNSLf*8=)sEa+z=}uHe5&#)mPnk!8L_izL59L+WK8yk_Y2nz1nLpbpiIouN99$!8+XvC(v3tA;0^a3aviaG*ruD7Tguy-ritaF zx8|5L1Lof5JtoTRP*FlqDrku_pjGg3OP zboZv~2fi&DOON?KUvE8LD`aiwC^jAKV|gtdUfy>&r?1A#5mGl`zh}BINCQ+Lg3`iv zu)5w|$``SZH%CYJP{zGn)DtP%#nHoK+Koy#S0l^#@_qR2;$+AR5f=mTKJ&&I8FVx~ zHvAp&UHBY;5rSQ$Z~P;rh}3_f(bB^Q$Hlf3@lM$0Af-yT%@QM&&sd1ltw#DiW7W%!w)GAV&g6Cj2D@@s|7;_>#LD7TatQd*@Tl-Xm@!`c+B@Z+Zn9%@R)YT=ud2fILGy3gF- zUEvj4NH$uOCn@NzpJVW)n6zdSUt&7EW&UaR+w-2Jz{LQ0kp)pwh zKusHhhTI?A`pHll`zt}rO|_4Pq8n>vxP`qIV;@VOks@7zP%?-dvq0AAo0E3N*dB3A zM6`J-ba7z9axka=gqh36gnT`mgG4RHY}1)+Ongu3L-Dk^O#tZ(w>16yVK95;vw$}w z!%!)~UkULprqlhrvfcitZ1p{=(Rl|QBSdGUn5I(iGJAMxbewGE3kR(h-FO?S2<$2x z-);c%q2!CdQd`D~Slx%^4c`9}XvorYBqt%cwf*JVAoNP=Yj`(m;67QbkP^FVQqCy6 zX(%vN4{z_CrQrRXQyLY!D1RU0gi~t6`yGXSew=Q3$&6Cxazd)(uLC*6&&?@@i1d+? zB3`eU*(DR-;{O!Cp0H+kQb6H5hO^sua;{5gC9_rBcYMW}h)5DB`|CL$vn`r8q)VeQ<{DYe`uoaZ8A@)x zE(uSUvrlhI0e1Ov&xn$OKjf#5Dcgq^E$92Az`+{T)bBOY)z@ilgT!_stb%gG>DX9w zQJUNSRM|C^>Te#6$}In>_86})ydHsd-uKPE9Hl8UL7g}+jH_*GMiU6rkc{L1q3 zRddUDmA(7u%Gw<-nCo5D8`^x`{`xEM-`MSayW^&g`RZkiFP z6nbv-1J4ND^s>|+X+|&L=Rb!c9i01Ymc^2<+v^Q#y#F!Uu%_PU0m^4KdXG=n-2kO? zZyfa6q@_5yY#TLGSl>h%}xWz|2oT(^_ zIL~WH8~k3-cR&3DGxGbNgd0|MwQLJMy;|Xkd#s;9&Z6R4_1LevUIUJ1a|4)`vU%5o zN$hVn1@1c>I-`uxG-@Z=XZa0dl|Pv55=)=a?SP!mvUjURHwYB+3(5YCqwO_a^c)cGC%imXCObjE8euDcEV!4&qo-(2>*l$CfHW6xfrnDd+zvYj*{S! z?-RY!RD?W{za5}3bKqSlUoATo%V1jDe4SDNZ?xKr%!6#WD89S6_nT+3APF3)pFv}N z#uuEgvqy;nV`FPggx)YqH;sLJZLXxjy+a9N0p)%%I!eE;0V(!B99#5&n?^E1X6l6w$ zTs@*_^m#})3a?N|LBptcA`I+funF8q^~Cc}I&Uu)hsK8`^RCrRr1L!{BYFSi-u5#b zsEB^XgNmYR!(Rqq3yXdxB4y`%VFvreX8oxw@>4o^+mcECRt{D=SMpktQDog(+`hW8 z#FdIs00X3+jk}%jG38ixy|t5?KvVaGHcVZhOrwFGr##B%L_MKAk(n63z%aS=xVL5Q z?(L;1Vy{S-HXsB13+w9>IcXoY)H@XBv8Hl6yFL{?6yM#Z?;Zo_swg_)9V1gUejWJ+ zn}Vx{RJ=I~%lRrObQlo=?q3@JhFgjs`~UY&%LY!3$6HNSGytvzs(j6YWhzg9E8h@T{nsen1d=}q{XQBe)B~!3m+*uE`p#`yxf2{Rt-wK6DaWWwzz5{> zm!ThcsaQEjp$lX>q{dXC7pePMq+oNcLK#+pqs1L^u!KjnsN(5+PF&_Ro6(>HPEb>O zJ5yXMj}h8>2^9heBsSfXkw3eJjOTwAteG-`@qYtz`XLXN%EXKYl`wQ1w$L z{usL1W=&wJ8y3BA*!a6d_B2=S(IT;p+7;B`7;}WAEI(*ST^|N_KPjVwP)wLN*B4TC zn0IY29p4P`fBzAaw$bWe3EIqc-n7s~&zRzk<_5zyqa~QPWl5Q?+Gu^YiS|{8I1C+A zoP|w*xh?BLPwpKk_9moyo--)!PT3(uHYfz?ubSy)5)Jm1gCL|MnZxD=%)Sm1@`B@E zeYv4jkB)*#52N(g{39!sPP}-K-EiO5G=rS?LO++X?o^5MCp)6Vz-Rniah`lcc4c|o zLFVZIBQ{4@@B zi+ZGV^JGf6wwCXWdpPbG;NH1$f9BDP7wa&CBD~Iq>qCPRakENUKZHZ$wCpYjG*ZZ# zda32(aG7$!xUYKcXxKWoF6{K3b+^y%I{3vZsJzi6<~MzQi@(|A9xig@?@Yv>a5!Y< z_#~NvCA$)21WII}Y7)|WGC2I$Hfg?}wR}HZ*f_y_+lxIHiUZt-0(@b9t9fL^Vt%i0 zuxSB-3SR?PL<1Rb?3uJ>J~vWu@)KgpQ0}35?u5b#59uBJrES$x^$#}#V7y)rQo#k+ zo{|Y1HNRyGh^!SrR7G>au=8N$MJo-`kcu7GhyeMP9dTSOU@X`l_g$!9iOd^yFOnf3 zQh}pJs0o$3?*xgj<2xr8v=@!M`+^Y4NQQb55PVXntouDS1AO<>lQ31NjTR>h>I-&-);2CYjM zBTdl>&9D8t@ExtCEjz`Y;nX5kfB=L2ZrLraMEtU17lio-?!wxh;`|<&41ncOv7tS? zm4%=gz~6E0z6=qn2sQBsH9#ptsA&>VE{p9c=^ z{if&ILV#<}T=U@Gq`0Kh72W`0EItAeI4o_VTr${Wl5EuK(+t_Hm;MMj)>J#{d22XPyp04#vKB-1l16}I z8sM?S?;2)zaN|A#iaz5{wX{m5C{1;De=UW9^36(J>6YM!hbbdjsC$Hx)l%#Nu{-Mx z;aWi8&%MC)T3Q+YIMfn{>r&8fC>#_K0V;*X`^;fdZy+(MAivQ;W>iV9eg$l_jDH>w z-x?2$!bnFCbF?`CB4*V;gI=(;CO9v8_eqDX`wayM_o!kzic0=Mrn7dFF0*MJNGx4ho^L^MSAYiH|J=rG%Qfs8q^svVHlVe zyBp@YlOKz{92#SlA?X21#PBN8$&Zcjs%0=mwaRfL%UBBohB79UxM$#%#rk^`?2=&C zEEPDlWHqN}vPUM=l9>}C!}FGgocSyXSunI&%d^I1qodJ8IR(CVdt^sHGni}ou0YQ5 zDlcg%B4xc*=;yWH14I0_K$L1k8aOmcdL-v~Df<+|efT-(j4?O2JGDeoue^xeE|UHE zc5&^W;>H2Cv6fWtrPPyGflT3reDCvwM#9nV1OaWizOAu`n|bL8o+bPGGdy}I+w2&Z zx>{U%u5yN?@AJFDaI_XRA%yXDuzbCv7%2j>2<`$B-2y9qvob5cQj7$kF`v7{J1%yV z*MkO4a>i}sM!uJPFI2yX2YrDER`$RDVv2$s_^k4($q*&!%b0HE6nPaFm(eh$v1K9G zy(`b;GSXdB)y!QLmK3~-#iXhMvwF{~TA0gdCa>}U5pI`}wnnOd3f8QX*X%?Z{m!Tv zu&zNbu6e?&Izl8~&M!^6wP?UvKxQo_q!xRn7WcjupQ4UHsE$alju=wAW3894k?RG^ z^^DA=smK*Mhz6Dih8&i7p_Q(dB%(%Uy|b|hyUR;#$ctLe59Za@^6zx!~ z_C5$?iZ^EpDA@hB;EPVXdoW8BJxdnYr5(~z`ROIl1@||8=lUql&WhFEz4X>7?tZ4# z;c>@7CRlTn1NXxEJ64MeSxTi1P)fXXQl<0P3O4R$%8P02^W#pWEb?%CiciCCg@fI> zf)x0bikR))_PgDc96fWl-Hp@T1gkx{x?N<!zAkbHm8 z4SUEsYsl^d-&J1(i==}Qn^E{>v$yxqmlGQPV_c`KA(&`0|5&56USlG5Q!;at(tT4r zrPxyQu=(+D3igPaO~^QES=%He}N)d9fUf`=x1dT^-FXf#Dw<7$i4SaXZ_ zsMqLd7dF^leyA;?i(f0NO1!1hmg+o=Jc7y3(gw_i28kCMPhV+;>3^HUZd-{SPd$c@ zx7duY3%6-_>y+CJY~7>_I6`uT(kEUK1(C6AQBI7Ec8Kf5bpaX*H~K71CN>ZFJrnP(%s1V-Sh#|hfzIP*u6v#I6^)>G}v>zW3v>(z2c{{ z#QM0BkF#=B;(sTvU%P#G?)?ht4I1l(Z1hT1&2e}GxR{m2#^;5x2NZ<|O-~2-6$Z_+ z7c64p%&7#-#umPHESQME3>73*t6r*z_$)||6snu*Fk5Qr6Y5nG8k{UJmckoSg2`Ne z5Sl5xbXXmX_ko7o4<*_`{S<~0e1?*;mw+crNaxhiJugEzd}0Eoy7H$&R-s<2G^We; z*&;)iX~WqHD{{w8O))Frj*-^!6^KD|im(hPAV{6Nsi?A-Ic6lcY^0l|sY;l z57-V@Xh#{}q^RB`Jl%YayM<;42qp1hZloxo>Ol5Vx_A6adxo<_0iXUuxy`{cLoL!t zt~ev~6!wa07I?E=oX>Ddu@fTdZulOy{#VxSrK7Nz zm2x1Lwdg0X>2SJeMzs?Auv8y2l;=Z5&ksVZUL!tU(ED)Q(%I5Bf$br(`l|+tH!KY+}aK=)N)8!9xA*9HN+3VdW z*KklT3yY;>fy|i5X{EQxSFF)y#rk=wwQIxC+qLGEZp}PXx!vQR@Xpi6r=KV^=V*B6 zb&Vm7rt$`*q{YIak%-xA6@>wpa*NDS{Z!9zNL?hw_+4k~L-zV6_U3$a4;kT(WcDxV zN1PJ6J)5FmA<&T4oe)g>tY+|;2yBBCUxD)cveyME>89<8WwViKl3v+_$8d`-XH!0R zGXO;WJ&C%p7f*w2;Ez0Yb^MM#{3Xko7T4x$Vz%F+es8dUY^tk8etqatc4&WHwe2w3 zDH6NA-)nuP_UBr@>o*0VTaBW}$1Zn=u3gH!J3V5-pK!sw+1Krh7_`0EgP)!`=1yzb z&oaN6{LFgoqcoSk{!8yi_nU`VApDk?@(zY{_nGak#re(;i|}0*jd{Slaqu18DyFew zvVmeRcl&Ly??JfYk>lyTna^(f&y?Qvg?@Oyn+OD7^+5XzRvp@67|l^0^*yxasJD+S z3g;G5Zc9_aBX;v}oq z2VUiC+=hb~*T%+13JgWG+wkz<=)lOhppdZmsFb9{1W+s}6DcM+FEuf^xEM7UAHU>p zq^+xOXe4h0*Avy&K^h6O3nS8cy2Eqxk#R%exCFzeaZBBd+!S5I>ek1Z^1E8bty6iNG4ev`A z@adLg3iOd1Bq|Z`92Yvrl&q+Uuc5{f-oti?1T_r#Jumq}W=S7elM9y!nL_`g7{LqW z*+bL?X~rDrSIPHB+s1ELGv?k{ajumr#kz`UlKwMg9Um)pPWl>eg232$;>S!B3(-tC zZ6rHl{@Z@Bb_bhVDDs_*-pjXK0HH{B6t(nQP#Jy3d6g%9m|ZF(Lss>8nR$j=z0Q87 zd!RTe4mIlgcX=i3@jGzSa9-#Xr{|0;eXdvFu0q(j%5O!Db|u><|NC z6zq7##xkp5TIp;3D6?jvuUHAqOuj3p&0DDwXG$AKTmUA-$hCMiTMLj5WkhV(rl5hn zak_Oon&PaONT(4XWm?50iVR>77PaPgHOrLM?J!MMo)|Bx((mzAj zM8(Hdu?Y&C9ZEl#MiYCecjz=}B-<~Bxa>$$i>YFDm7mRBr7ie*4-};ux!@SQ*OPN_ z%eMT+6XOE6Rhc!59MP^=#q89d6gHgKpfPaaNv*VOu3S;=FJqi3GpDed8`rd3wY#L} zv#&VZb94P>GK9wzLY$EmET@E4DLyr?2wrouD0%H3XM--Vvu5Ry8}es3Y&|5+;$YqT z*eurg;38%%cMmi~((=9nCUoK)F4ZEReD4|Cwol=^y;-01q43_m-Q9dQnnTTME18YD ztMEdNHP`!co&C#0R0Uz;$a={tR)hG8(Cx3_bVUb~6lmPf=+wn;o>r-p#drm+qvA*J z3V-QIcV%7;#eK~AbJ^vW^?0fN2koG~`Zcb1+}(N((YrEvPboE=Rh1$-GiJ@#qk%c$ zFU#~(;1Sr=qd}zDXy_I09iMHh{6nImYXNCBIM%g+Woio(882gMY^_7}%dtf0)L7Ze zY{J&W)4F_HYW)6S`F>K+lD^^S7H^GxkH#I|nG9v2bNgh6OgNZEPg)%19mb3^OFHrD=DUtIj%aRW5a4 z#v&*bS|B@~5M%oNO98QL3wNEXDz}jtHKT0p>jJJ6Cqtc)tMnE2Six5^MentSM>N}h zrBvx>xn8+}k9P)r?UvE6GWc8QsLr$^OBQh36Pxl3fn zt>L2kxm~7ledR+sVY)^rsrl z(XneMeSTf$!Zo5lqAx3>=yRoLy~({Cb62MJJQOsZd5f_P5(!?t(CQkaP449rrjlgy zJQ*dxad+vwiXrm7N%DVRqoWc)?w@;KDW+gyJ>@$%mr?#ZH``@|!OoISUiA6eTdlBO z1uqBHyA{S~WF8+d%I$nQfJWT$O>(v~8pRLM=3;dt^8w^UCFLi1fG-|mUqSS`v$`Mw zO)YV!4+%i2kmt`MKWnN4u!r)QYT`~O!B_;MsB7EzBpf0nN`Bgbblh%?KHs;sp}mlxWunrdVIk8sNZ_<*%M=F9l3 zZ08gkH3PItp4Qa=zr*c+w2insTD#)z>%jY^P2FqA-Mz?3P-Kf0mzW->O#kRZCs#gzK8#@I2 z9FZNhUkNHU(Eq-(t#$~8$#3pillD=ab^EJRBF43E24<)@0GO&@_i}E!`xVb4jmHq- zwgrVV=iD9wSw$w%=8)c!a!U03dl6B4FtoHTsYGG-y#!f{gquSOc+89jJ-tKc$suh> zVGnPVltPWQAp<77{>ntB#TF562kv*dCvPV_?5m@#DEBb;ZzuiT8nTfT4}>IIyL?z1 z3og9P&~LQHqGGwzX;<}z1CSd)6OF}u67J!m)CCz3z`r&A%oaR70ho(EzsKfE+LrX(NqWkLL>J- z@nUPcNgY0D&^#7>lba`naTZz`4BZLF_B(skN9fT09x5;Ta5jMex|gF^KihvzbA1%K zD&tl5xniaNcnd$rE9>-PYJnQ6oG$o%Wcta}SEF#h%J&<1n2WM5@bujz=Oer?gYp>< zUw7E5y?>)<_N_Um&|+B}^9dvuPMmt!KHu1zf zItb(@!$wDgU0BrtB7%W&r!84@&jfJAl*Ea2xD|*A$#Th$q)Fm*({LG`2j8^eho|Ci z(TBeq+T}@rJLf*+l4~Vpqtf{c?Y`Q5rVt@#SDKizC2M9a=Q*Nny)D83-Nn$ILN>^G z#X*Npi$=*WE0=hHOt;k?_JNxdDYiba^jjgu5qA_P2HbIFRP=eU283 z+aC^oY>4|D&iuWn5;ft{3R?t-Z@=Ctad^-`<|5lI<5{TbOi>tP#m8FWd3+sdXg0q( zoU{;#bUH@cJxE`^5Uu4E<~;s(p(8tSHr&g9%nl+E**|FEfsltd57$XE-M3IdO;D}f zv=SVHTlGz;gVSe)_YMNm$E##7GYesRoE2mf7C8-|?UOy{>A;uIJmce8cknX!1sbb` zT-ZL0V&!WFPk1*w)5c=vS+0`Jc%lvE)Nz<=WeD(Q4+dw5QCTR*W$@jDG)>Kk;daQF#wP-l>aj@>xzMXCg%TyBgMRt_LweEDxUViat2d)L>S2E>Z zP{U!B)vM8)IEe+0m=0!BYB^BX`Ay0rGo1lf?J(*skJxtwp}-Fh zgF0(te8;~W{XcrmIvH{mtNU6dU$^dB`rZzk*zc#q(wBJSxF;sPFEt+1r%vYL>dA3_ z8nAo04Q;kgKsc=ApAXCkOg1)*KDW_Q7nxUQ;A!~Ga{SdIdr=R5SKq*LRc?~-!BSa> z-3mu){z7n#EDWd;RF(8O^9RFFGgu_W?#dIGxw5h64rY@*g?Cv9ori+eTCkKo#4Hn- zB6qg5rtEg=iFv0ThaRRFHm(P+_cL#=l=l4=eEi!8Geg<;Sc_>i9A$yggy*~ z?iVLWHS;I!QfsWC1Z~G$-JFDEvL!g*#`VFt#@%BrQl)>~%1v^Q0TJIa!i4V_!HTpJ zQ<72(=ljVPc~i8KzcVRCIAtB4Ml-3~fI~0teOQGSZa?@zCYQ$o*+bsc_6YOre}s=M z_(|sbA%XCp!Z7Y(_z`nHIz$qNzbWGAT;hY7g;33sO#}Kw-GA-7p6wGto87OpYzwdL zXaOE?Jv`9P6x9fqgwzFbaRl^V*r&tn`CmKSr+SPx zn@yxpGXU%>wZ18~c$Fetuey9uuw1!j$Woo0rU#C8cu4U=h%TwTMH*@6jy$)EW2d_( zkw<_Hze_wFXEnOh0Ld#_n3om6>y5OA>Pg{OpX9Vj_j2Ql|u$&Y&Ht3tO?aQ$$;=*E8GMtXxq&gUNUFV-s>716EWY7uD)3rI(>-u%cgt>7GRaI~~n zAiF&^s@=Yny;Mug62IMAi^qN{ob@Bv-pL}OLptKvSqi^9CK!e{cjKp=7JRoCyYLR^ z?%_2Y7KaX#{+t>IA#^MavsMllMi%haE*6v{mg-9mJt?;A-WSx+j7K61ljIGPk#V}` z_mS7~87=Xi8%mhD_U4q1q?Yxmno@aRoA{UYZm53@iGBGl0?pAk);#geuv1>kr@iE) z3-p*eH`g-Kz!I5cQ}krb5?5)f$ObxNc#!-`W{*!3c1>Y3j#Z&gvIc<8=+drk?7ZBA z5UiIY+=1@~jw3`6^04>~1wB4#DK3REJ%J2JEFkl5*IS#2aJ@N)m=IVLo(}$tbgW+K z^mGiz*V17_Lm|coA!Gqbbi-i_L*726nKYh>REJ4sgU?JtkaGl(2N^Y?vYMg1E=Mhn zdg;C$!HX2tA(*b79>KRUPfNLx3?6nEX~-EkqFSE5vH^jfv65lF@K%ps2fq2z z)R)@%ZkFjahr#i!>1F#F)L!XzX+Zgf_@B3F<(|Gh*B}ZEU~NRgB`BQz$T#0VleY~X zHg}uZn_l=jJ=2=^HO6~iN%UY|3v4(TnOH%?cYoU?{6_&mvmd7>tULdAXu-vuAbf{ zd-VX@yi8h%RoY2yAUElE(YCx#x)FG~LNDa%zdx@E+IjS)JHdD4vt?rR^Mhv2@7z!+r+ zt}0Mi1xrh5v{9R>Nf-EH%(=-B>-%xCeRI4Zjd~LQMO258kP(n*zaPiNgGD_P=d(~` zV88SjjIi3&#HJYRac}N>Oy^l)9f;Kuj71b=gBuR1Uw(A-7EKcHj;bD6|`QB zk-u5Zeyu=3snE;#5Ehu%Q~D?JVG8bMai3RBj*ZKW|E0Cp#mpAreS7uTSjT#M2>Vzy zTS{HYW!qciA6n(2F;q_a)mHmU^ae8I2a4GTv?yQbKUi{OzcyQ;7p&~=tj!=I73#ej zK(lf%-7C(h8_;~P#NrU?llb7}G&B)3bdonT+dzK4GvseO1Qd4i(TDnF4TX;l;fg_5 zBpf%Q`r_Yce1kwkPX?bH8_)2e;odmT6n%O&O&SyQITPF9B*qgQWlN-YBySiVALLH5un%F+urKMKbE!94+M@4X0?o-jQOpAgM_ot zDP1O(-Y2b$EhPAr2DIM0!@(g@CSCWfTL=njGl9!DQByIouitj+-M)J=Q7<%@odPjy zk1b6n96WBzLU`XE&@{p1c~-|UB>Cx}9nGK14aC7~le_!Q+xu?%s+k91c(_duYsbvnaX{=%xP>JIlhL=!XwYJ; z`{01W1m9SfI)P>i{g-zH_Xl!mZlDK{sHqChly;$ zY$@X{uID2!;M89peHyX^l|l!j%m;b$2L)9ZOG6xFA+n$gSWpa1V{^#+VJTIiHI{NY z6ZIGmLQeVi`78e9$>^D7-2>C0}ilV2UO zTWyP89j#h*kspa@3=#lIew7~;XrBc~XS6=78jp@jjA<8*{phJ2o7NwT%pB8s7z+ii zjg75MQBLett<_RVv>jjCpLL8+Y(?r4ukZS_{lacLu-$mhI`xn>fnL4Q zeY~+l`6HNPQwU0dW-HNB(LgaYYYi#5f7pn5m~_-{NBuBG#L}^FJT=QS%~ZX`$U4J< zyUk_@pAJ3uSZ0ub7_V$V@=hCR*y*>|{5xMMPKn~qar~J1l{v#zwG)0bBdQp#gz&z- zT`GnE9K;FaX&>XAl$I#S3qbbX{%n@Tjw~yVgh&s;2|zlgNBgnYv1;C-x*QH^?`@(* zrRsKz-E#e~zeKOkOTEx+u|hyvq3>C6X60Mg*Qb}=E9wmp$A(EV!%|}g{5xP-R0EE` z{c;d3*r~;M<}mX9aBbrdvtH&8j^~#PnP4T#_;D;t;iUrCLtW;ebe1hogTqjq)$Ehy z9v^6p4;35qZwu}dIVmHnoHg~*x$xwFHd@kh`!>e582_57OV%*GbU+vDT zFFo7A2<|KXOBMc`p?;eA!`o`oA>5Nc^H{U8XV>?mJJPask*7I znXC1qs#m_M`_fzcvxVKU55avceWbuYg-mJorB@eXpB6499jfiZ`Tv7lzdC*8{9_VK6Uj+N+>$-?aSzkWi0 z+g`LpJN}eV3pm2wiDQO3>B zJki`p%GXCjlZGnNkpN;G50_H4B8d=s5kS-7T&`4zU=gOq@n@NTlVF{fjQyc>+^@61 z$)wzt5{Ic2&$SGS2&#@!EMLprAp<#6NElUnk+no(WIuC!9*l5ciTyoSC#se5R()Vq z`_gPAJ8kdl#y@FT?VmJ^p770Nv=i=@=4?70@<~tW&v}wjNch`RsUr4uaewwW^-qTS zdydt3FVGsjyvx7O$U9>29Ho%Uxk1|6lBgV6D*IzqU&)`CKe-!_g#wd-E5 zpe!`9$3$m6YF(r;e+c(X}nZGLwz=q;33q$9UQYw5%#lU?jdPoLh2t!32AjlE?~5zb_Ek z>j*oQJsR1;dAHw^VJ&h|BWn{2Z}mPMnVjqau2Y{amQ-iV-F-|(p!`9l?N$g*MuGb< zF`*Gf)$$x>@VsC_CCDlWPsPhFb8cYLPwrw+nUJbxnC^984>C=Tl2*+?%S#6cT&r3Y zr;(_|bee0_D%*(qT>(m?!~NUp2-wh3ecLJ~#NSZcSZNxqIpud;^(NCnRQ1+6gF{_o zMjIqi-KOwaISX0=UQWV?&uDKreB}>L4dE_61w87-~8cuUdQ%i>Bk>%SY?w0D$ zdIrMmT!uo34F$v+I_@qdp)MR=SRyvZ?O0CA?6D+kUX@|M| z^rOtxEHgQ3QX7_a;u9J_qOXqM5|j3qCxs5{ycZT8)mr{k;E?>CE~QDAOXcZTLzZ_w;g~5jyuvj;=L<%|@R+sxWyU7@KDU{4?jpv76Eoj_ zbPi%H;x%?K^-aL$y07+Ti=RopQ*93`aIimYmr@(G z6-vxSWHA-7sG7+Zy~^Q7Fkz$*rTO-O<#lO`Wa;Tk8Tn6fi6;p;uu*hH*;g|GkCA4G zDtImCOCK_Yc8f(C@06<3>vOU2%o%;eMW4oE{B^h#m`p01)t_;8>WL((#Uil89h?LV zas!x23u17Ou~i~Q!%V$tGejK!*w@KYftq;9?)2h+?{yg&DY*#zXD{H39$}D;Spw3- zFYBxDOc+1@KYHEk#x9Hs+YmJW*%Ifv`1}Gpldj2G^qb}etN(S$;(u={bGNdyFfq#K zuFkUEv>wP;x-X2bUqAJ_s~9%sgQLC|->%!%$IK8m|L3Oib%m!gy)x|L4g9T@H3FT! zFTz=4&U5Qu0ktceF#ox!%p!*5sUt_i(>-0zB1+A_g`Kk4houk|%K7i6GEc`31d#(F z%Qd|3sk!Jv=TXFvZG_I-L1D}qa~`=-smZ1mE@%U5Aby)6_6^UVXmm{?tDF%b(&o^# zQ&oUk?H4AOrBR`4JET5=UABzocD3wh$rF&LUe|4ib==r)>|u{@#cf0_`#kf^V_)c@ zxnFI)FC8j(All14p|Q^Hk1=*2QOP~=Ta6?1mHeTMM&pP?a$Ug_`|gpuPiA30{bI1x zmyfug&5L#r#%wcHZM`2S5n|fkVOZ8$xu0(uudi?!JJ#lV?m798EkjN8&LFSOy?gwC z?lO?tF#4?G?EP!$T2?EL`cS_~uCmMvlg_*TIt3C-+9r8Q>&Ickk|;X!mKao8v|y>tP74^AW}NMMte( zGlOOevDcaB4vya6Hj@rNx^}}ck^7NAGI6A-#h-Cag}>@E#6!?0?l~}K4d23G(3gz3 zep(IDkVl4ThOn(w=hf5W77Vy+bla2 z@2A9j9joKchjYCh&x@SyV%aR@zM+SiqP(?+gN8YK>f(xUkHEIraV|*2;X$OTcvLig@8x6tao;3l)j+0oc+4ug>T8B$F_(e6Bx35O980Vpim5O>&JYZuF`J0QHVXRf z+GXI$PQH-xwX_InjibGRDa@hk2S&uJJPoM)fiOY|AFk^hJR6purZ^e=b5}eBtVoE& z(%e+6Xk00IuJJE9_fd_#X-*FDBbhHp6Ky?{nVf=0dfG<{NSH}Qy+cMH?uceQ=g&f; zlae2Y{M1xF;8m!snSWu=P%ADmihMpxL&O{2%BlX_XGY*7i9FqcR1Q_;AOF-&#DS_1 zD=P!UuAg&6R4YWkEUK9C7=$ughD33bLqg>(v0zIz_MDk(9*jOK@(W`(ru8qV-(l+ps`jF()QX1KrpFfM(-Skn<1-(4^d}!~>U*>byWF%Bd{lADXf;uU>y0d1ejo`3Lq#!`lv zht97PIUnCRTEjBWhkl?o!Ta8NtU}_=C;LCx5GiYARayD`Ukhs+1ap5XSKPMto2Feybo+FbyZCR6zd`C7!(MNbjld2KH2T4(_r z4UymcRZh3Esb$^AWZUSmVpb6owKKxG^1`tad29=n&h)v0WcD%#!DH_#%ohy`Um5bt zdY$G1rw1{Ys`sI3<{vkf-zD8EQfF9M@R@8AZKz}?*L-TX;#OQy*>dLYdHiXe;Nh|9 z9n!RL9%Gl-O3eK63jX7inDjpR^kCstfuGcoOJy%%h~_{7OR$wsg4VDAsZm1M$!8As zr6H6B*1jwTyFe9zVKIf;Vn$Nq_h?~@SZ!<~@$y(q+nBk8&o5HB*~eS*b+*!&IKLh< z9HoV5?S*tSXF8BxX2G}Y`!sM(ax-4>APK64Idcg7&MT8W_P|f>ShI^%xUzO!{vZPT zdr~s$r~M((g6>zRg-=#iT9@}rpIw}nW^{kr)jl5U@T?bpC2sQ6*-#FlEY{Bq8m3QYq-_{k_DX%*nMC~t|!zdC(tiN>N&)s&h z+!ZLVdu;DT>>86AU84NF{D!u?r#&b%Cs}@(H$$@jZsRY+3TGHA5Ide%u4Vtt(3KSL zBb9OtWVZ6_WoZi2rV}nScZ12f_vZDlc0?0@ebjJYj7c#Qcpl$*XJ2shrP8ZXET>QrJiHjo+Q0w+WqhP|q7iCI>#T>a^`uhS;CEcAD zy}h2em@Ry4M{b=xbl%t}Ex?D~FI>mf*<#fRtK7H=gCac8aAFt;e-2OXSEVo`q9w~&(~9ZKXL~>3yIkr^6(?@n4ylv#+TCL zitVhmtD&~|I3$3+68-waWR>y7-h`sp)f>jpH##I1~Z3}+xJHti4WhST3d`Gf@4wYMIST;Ce1n!Kk&(m`DtuLp4LFu z1R=WFVSJCxa*O>soR-n-LFV>16O4pWbvcf8WH|HA7tXqMS;=48_x zev}v*Pb2#_FWGo7QBgWdRyyhDaPrxb^Erx(^S*-N$K)E`j6@Ot4{6z_ORucmqOy#l zWP?zB2;HL7qLJNm5(iyfic`?jF=TGsLJ$2S31bwgeNeRA{)GCJN|HX_=K3P1H-`nK ze@w3p$)F)hZ{_w>bB?=9ORXdH8BIx}EQWft(8fRVgz<&@3K69 zx!&N6cq@Jnx*ah zbwDaPqS$h@r~rES^%qJ`0QIK?!W@Kq6dywEc5!V~_@XB+_DlcA#WnrR8wV*dD5)n( z0YXjrGFrI`_hE$T{KQ8&afdO7*x%B+-CJBft@Qtgi}SQY%!``mv=`LAX=%oG90pmq zCgDnZvK$qjKXEauG*`(to{Cs7uHZrKEg|SUrfeVpYXB1M6&+LjqNFNpWOHpakO45 zra`NKzO07sXuT{FvKH}Z&53BZ2^N^C5zqUOak4Dp)vN;V^PWZmVNeC;k}jyVuu=HkLnD8=2qiY3!PdR`zWr)BX-!NmM0D*$s#5O?!|giJ?t0y;})@Bxh^!DTQ@u)YK zIT3wqYu5hLq7{jvf6{Nb+TW->P$D}}$TDC;f^C^;_8$F>(+ZVLS$Bt02B{`LM!0ic)$3@g_En({7n=YYF5TD_iN0@EDuVY+gBmj>W7rC9G!R zw>d5@(dDg-&9nLz`L!UpHYL#;O+2(*M7FkBOb~ESbe2xs=(Ik1w*Nkv=;0sCO=@$} ziK$7$nLlnVd~#!hw5b=9Fj*ZB+DXWV?Jqxd5|(!mf0}A7oO(Srr7_$=VCDPEL-WES zV+MJe5O(y*jqg`FjyJopGL2CGbfWy}<|>~-Ckacn=n-n4;T%IwO%1a%ZNnXYa^pc4 zNcSI!8R`?ywc~<8PG3EvT%yE*;f6SWKkp7Pw zE4x&D?sE$5`_|UiI@$O6vCkjBKeJa+=dn*GbHFOHKTv+i-xIp%Wx1H4vKX+o7&^8n zxV7ln7HfAiAAU}1ljYsJ%BLATm}ET2nLEg*yi`VM`|;t)jTaN57FD-~BL6HG%C%&Z ztQ4FKC!nt+Gpsa~54XR9Nw@NTa^t-P0_sO%TKSQ(%;877?=XWa@s_?#kkOf}1~1vQ z1*^4@$hDR7wLsa?DAho*MR9vsh;-ZRAVbFRpEbKthzk10ddT`z+1QrOSbD~o*`Kjw zkBwEx#wN+cb@@iuC$Xm7CpRAFcN>q5AOG7vKJFi3^m6mJS1TMw>#gM$9@7+h)&zdV z*5vWl70G%a>ksiE;+JJ&L#1_;gR}11d1#MYS$`(|bfE3HLQ@os9ec-9+w{}?72CW_ zGlG~q?{uewW8HR4p4@o#mv-)X-D^Ioops+%7WpY9%sG*@8Mw?DvGU#c+Zm;wp}POv zxJzFb8UM+R?YzGPCJ#ll5f^3s+Mg{n+5O0bp(5BreuAtK)noeD>sLPSqfq+1t$m>W zE$*xC;OOljp@VH>9SPEfE|XP~rcz_Vyjv8X`rbZ^tX?Hg1w^#h(PK{@n_84Q_M-o z+QrY)s*{E|Q_||bCpSK8F*F zIl;Osj7>bnG5m?96@878XR^;A=dYgs+JLzr_35JMl-cc)?RX|8bv+GZtOQJc6*fHbyUuE z`Ml~;yy@2K?K*2_vFm$sW7l?xL1qER*9RJ_3)z1cZp0olS&s(SmkY-qorQ)VVhV-w ze}6EyV=4c2jF|mub>DeWUJajOgst^oZo9uvY)B z=)ma4aM-qQ1L)AfR@guYBx5psVjz5ae*DEu;_BSk;@HO2=+gGW?vItFqKs!5SXhNP z1SK^UL^tKQ*T1Xk4^y*_jjdlbNhFZM5+~DS3I|NV$&KtBXi$YkP*K%TnHoxj5i`2? zN!d+RL?lSvvn^rg$$X}kG!Jw`r+n*1WuHD`_6@h)`^NW(xTR!XHi7etf0=997g58( zY>bE!Q!2>}GD?{dRT_(Vk+ddr2#+1TW+ly-bNj8@&&39Vi5hugmvSmNDw$NN+;5fP zxNaWS>60-VN*H(kH7{Di{W)3;e#XyfxmXrOry@wPAbzw|AE*85_GLt!Lwh>6F-muD z&QZp!T&*?;`bq2BV!obQ<$vth|G#$p^?d?;rG`x7v3OMGiuIm_=3aabzMzTv1^#F= zeTKK<(kD;38kRIF@d-A;+pE*z5RHxa#(!1u=7P}%b46m9?lWu z`h%)}_a7mjG<}W^xT{UIk6a5#jjf-({ShiNt{G-bT<$PxjL9&wW`-|rvcUKytg%4l z1K(#gE#2s)FXDRfVTEa0NzJ&a45SOh|LKae21IOEsl+Snjr9bY5 zQYvA-^;k*7AB&My@KAb&q`#4g;;^M!E=LqnduxS$Pm3lpFUGfD4r9x36%IhE8n{2A z^ zX>%{D+k?a`P}ReIPUVlh)xmO}jhQdgUX5=P)07lkU z{94__epoUMVw$A(ah%%&QFnq<5%J|Xel80fD$NzuY2(0~D93>yyAx_?OD#I>!Dl`k ztIJ6t3pPq)_`FO*n1}V$tcJX-_E+YVM+02T--`va+?op*vsMat${S}c9ZzoNh~{72 ztmR2xF{Ff^T~n||r+&)`I2N?l-PxVGS@++Uwr=+P#aiU%nb*zw1z!p-{;(mB(1={a(- zZ&1SiDz`4bh-Jz~x!)GIos6UzVBqESmvtNpgwM-?_5+nZ;cio#h+a|GBTBT&~5??kb<-VJG^F7d; zPsw0$x7P(0Tl)fT1J2JNB2Wt3AHxl$`@L~hEN@wa!rjnN8;t~uA%c;?EO}o#cTYzW zR@lfLLGMtJL_8}K-Ad}n$tf~}l^p69js!VK3l&G>uSg3KVk2^R-r6$kcv$hBjRWM` z)Wb*Sm$J_?$q|N!%5(-adzuCogn9W*k(nrMv@=#$8)RDhgOdV@SD*G#52#G`22wf7 zZGM0s{g^#q>)kdkQ-V`=?N{i)3hT#~G7K^1yG)yOEIi(WZ<&XFsSqG2nfSY`$v5x} z>vf~y+HqkR1byt(xiMps*Up6bXWIKT&d~1y`_dEc%a_@|Rrk&k8x>vtp4w@Wi}O>s z^?6~L@k-X{o;TpX#bb30RwmcGC8sO9XlFM1RcG>)5Kl$fU*)~Vif$P(kj&vCA)+G~R!4l*+7pze`v7n2 zn8)c`qAI_vT(sE#Vvu&F`mX{d)uwJF`jLBf0>*9lAW-p(X=CB?6Xw^4ip} ziDHSQymN-bPd9uY5_Fx?rrf2l5Jsatc4c9{Sjg~`A4=?cCO~OQa$tlv#W6>|y$#T*PT5lsEjpXTj=eH1uDnlJET1y8HekD7cYU!lH)`Q(s4#AU83x;{{_U0=yV^Pdm< z95WbeuV^lGVRE@^N0}QC^Dn0CRaM4}SsLhRk-zG2s{P(>PUyhx;?hyx&^Y$f+T&qm z6Vrvg@^nh4m_Avq!xeb8`g*rA7t?cpv$LOCwjl6|qOscZZ1g>b2wfVY)O5M?0BK$L+f15pN|3`7}-G7x1T%0QHXC<9Rjq6|bCh%yjmAj&|L zfhYq}2BHi^8Hh3vWgyBxlz}LJ;w?C5Ae~b`GgB!Y)O5M?0BK$L+f15pN|3`7}-G7x1T z%0QH*RpJCED@&SDh3@TuNxns&_DF$JOwL>Y)O5M?0BK$L+f15pN|3`7}-G7x1T z%0QHXC<9Rjq6|bCh%yjmAj&|LfhYq}2BHi^8Hh3vWgyBxlz}Msbdb$%o^}2un)HK( z!x6B>K*ZPS?FOO@L>Y)O5M?0BK$L+f15pN|3`7}-G7x1T%0QHXC<9Rjq6|bCh%yjm zAj&|LfhYq}2BHi^8Hh3vWgyBxlz}J*lK7mG4Zf{xql3u${yCdwR(!mgAO@lgL>Y)O z5M?0BK$L+f15pN|3`7}-G7x1T%0QHXC<9Rjq6|bCh%yjmAj&|LfhYq}2BHi^8Hh3v zWgyBxlz}L3v+Pj3pAzqNtd2V$&h>UYFLJtzWdouNL>Y)O5M?0BK$L+f15pN|3`7}- zG7x1T%0QHXC<9Rjq6|bCh%yjmAj&|LfhYq}2BHi^8Hh3vWgyBxlz}L3qoCieT?U@) zY)O5M?0BK$L+f15pN|3`7}-G7x1T%0QGEFrGY)O5M?0BK$L+f15pN| z3`7}-G7x1T%0QHp*~=URkG-ofUoY)O5M?0BK$L+f15pN| z3`7}-G7x1T%0QHXC<9Rjq6|bCh%yjmAj&|LfhYq}2BHi^8Hh3vWgyBxlz}KK$mu0a zISs7e4E@%f{c@Z?Z+jzM2Ma_Qh%yjmAj&|LfhYq}2BHi^8Hh3vWgyBxlz}J%Q3j$6 zL>Y)O5M?0BK$L+f15pN|3`7}-G7x1T%0QHXC<9TxwJcAuW-M}LCUCY)O5M?0BK$L+f15pN|3`7}-G7x1T%0QHXC<9Rjq6|bCh%yjmAj&|LfhYq} z2BHi^8Hh3vWgyBxlz}K`;o`m%iHN%iEYb){-goz(v?kAoS^-f8q6|bCh%yjmAj&|L zfhYq}2BHi^8Hh3vWgyBxlz}J%Q3j$6L>Y)O5M?0BK$L+f15pN|3`7}-G7x1T%0QHp zSXfep@sgQgW3&bm9E(yf`k*N=X+V^LC<9Rjq6|bCh%yjmAj&|LfhYq}2BHi^8Hh3v zWgyBxlz}J%Q3j$6L>Y)O5M?0BK$L+f15pN|3`7}-G7x2MPc`SbyR_6gLZ8u;G|FPA zM+Y)O5M?0BK$L+f15pN|3`BV`yY)O5M?0BK$L+f z15w8KvJxKrOlp1sr{)>d$f>X?G{YqN7>F_uWgyBxlz}J%Q3j$6L>Y)O5M?0BK$L+f z15pN|3`7}-G7x1T%0QHXC<9Rjq6|bCh%yjmAj&|LfhYq}2BLiF(y-UFlh{KS3DsbM z5V3h?v&s=O08s{_3`7}-G7x1T%0QHXC<9Rjq6|bCh%yjmAj&|Lfhhm~U6fypo=-S6mlDXS=!sXzIvty9dYe_&V5C8HTfRu8PLu4CUPT=y7J_e z^KtGCM}fQ++HPO6LIi8sE1y=UhELQX6+tX_h?%zN6lH8d^0o2}qt(TxHWg!Y4@%{n z@NKn~g2$1l8$87Rj+!#m=;$*>8JVsDiW$_L>{!}@syld+m%m$6LNe|~>7pNVT7p|k zZucD~WUSo`b*$;Yy>APWnx9wr`S7xpBo%iiQLTAVA zMW>JVLqlaH`rimgAD8ngTNEZy$=LmBX0N+iJ$5dGdim9G@6!ymt2!6{C0<(R=~8_} z7fBIJIK_ZhoD) zvA;fCKx*%sQ!Ky7%UrC4(3l%sWA2OG2@QqY=ddrTdB<^}Q- zbo>e?eZL*a)ii*WjqOYpm}`Zcm(foX%uV%d6DDa;pqH09!l;gnWbmz+>g=TR8{9nX zvyeX07j_YQqk)c0D#+4&{_#I!vnW`2G3ABIpjZwZ5E3!Mue3*!_%T`wc+ZiBDEVq4 z^euCgaEJStmThCLIJOy`Ou}u9s9{ky6?oMzNA<%^Qj2K|S?Wa~urLm3!LAc1g>L>Y z>wMFxrO;8Xi+Y4AF7R8(rVyn1{GNM-8iaCut{*WOns19ssq>_K>*xC3T{J&bu5INn z5#c+pA2V@(19xu!y7X+-8~SdLAd=mn^tCp}M@)x)=_esj4DGmdF>gD#o(>zhOsdY4 zTF#L~C~j3x&3Q({DT4aJb~>@dKZE}2Ga4-6G$vwvl-lS0->c1|A5ef91d54su1Pjt>|>RL|p|=$9Eei><75E;R*G z-4j0fw-;;c(N`VS*YXFgnu#$T&rQfU$0f=$*_|5<%j;GJ!pxTG@n(olh&ngxb6T0f zQ%wEbi)gf(qjcRuT{$n|V(D-!Wc~EH4QIJQjZ@@{(aS>ZbMM)z4m@iG>Q@jl_T+P`uXFRZIU4WG)=1~hvuUbY{e;DG$-PfYqqx<%)9e6yymL3bR(=I zPQC4;;j(*9W*MPHGx{Mr8g8B2$E#bH(1$nL(Zti?Iif zZ&va@f6yk^YwQwzS>pR$XZ}#lwRScta^xF27KUD0ZwObN3wFEdzWR=MhT|1g&$NKqypWAN9Q_(NYt*L5`u5-^TH5zN=b+Pd> z$sNgS?06N?>WL3@3rakD@cK#P+#CoML^fo9SnRdFuGQ{6F;diCnn&cSkHc8=gxPVZ z)9-J5o{pyZoyBc$z2B;|^~D#l)+NZSwGzXP#b+Cj#f2(vF8?t(!@=NF9mPeG&D~<8lkW>92cyi|y-&a#}4XNfn%hy?=kpOt&no9&-gQLXIfe zKMi;DT(StbUn@Fo43PP6R-WsGTs}%j>lgC zUn72S`@kFw;VCbl(@QEkO@GxpZKYm1#G!e2uTf#a@LdurIB4db;%rN8?$zjQ#O(_g z>Wj4KgwZ6OzvJDkEK?}qlE2_t7UW z+oc5$l%Y@eF!^$28mcqA1AB|Gh8q^b0(=IzG6`!QbG z@v(YgrUVKZ*e^nJqIBPYe9^d8x5^*XQ% zKd9+@2pzTEFpKRogjn1`BKTr+gk}_c{8)0ASOO#*B1xabH*vjWA&-+V#Idnqwh9hI z9`z<6>dy9mksb4zeAe+p4^85sERHm0jtqp}Oei8u_zB7jSU=`D?tGPGT%vK791lXV zM5z-v7M^FPVl3c?y?YbRY!(kObuO0jHQaYbF=a>MP6}5_q6|&??rKqN?ALW0?Aquj z+GJE~oMg9<`01JJqolv$N4M!v*UN+CG-@{+!YBvYlnTid2eS{9IdI;D@PRMjHIvkY zilVvR1R@5e&=I6a7D3&mU1KsNgWe9?b}qz_(t7*}O-pF@NGeWCS<)oUp;8uyHzrr3 zQlhe~@kHf}s6mP^{DPusnrOI)fubA_dywIUoaxh)*eRXaZI;5>_3j2 zf?=NG)||r@8Z&X5gVC))L-zG;Y_3Ort`~y4!hQmRU#bpX3M+wCl$%J*UDVQ$9C~e9 zhh#<~ZCqVmV2xzm})+?%FJ5asc?=PRV9@ymEM5Bm_>1qqoO2`_&y=gl9+ z$@s2SQooe{W>~nPIp0vK;DdW+pG@KKaF#|%{E1R%^iaXYenBN-;UP`o$CffdlfsQO ze(9$20O}$qb7=VHNa0WE?>nfNC|VJ&_lE8=gcUL3Yag7B}!ZSRowJB<{N5B{zyp)Y7omv zY57rg4J{0k1P2vAha`Kcs%mM4SsWdja35l+wq`y@dcH#V7ddk;9{#cszQRTGGC_}W zAz}{9V0a#34v7eTdc^W9>T-ko1UZkYvE|U6!`kJN!kw)w%~6XZ!tZHO60#Ww3Otx}sfP!}U zdTD2wBeX37{>?;0p&4rXDxcDNdhgCu#<7yv(j=RtNT0ucpBO|%oS|>Yw{Od#PcE}h zfdN^mtWQy(-(CZa2-4rD!jl$`gAYNQeA|z2r?}enY2ibE7-i`6JPyRsY#ebgaVN*| zgu;1M*45I=1s&JT64M(p=uR>uLfwLIXr!;x9a~deC^Gadl<4aux{bh)y?~iiprtXj zB55c3Jx=$nu)t_S4nyQ=9#2q6ddYmF$ zo5FcDMe+D`eZyk}+f{0evV5GHa)k>*cv3mbKz@vf^*K(jq_HTTY#MGjc-Ye$q44Hx{@c zVizZe(f(;Ljbx<2b2L@QY>{!Kuxw<(YOM%;eeUP*hWz@>_Qa4^7#qWAk>G&!@#wms zpk2f0)VH-CjN{A>kkv8>`VHj%mD$?r#x}#|T{{GxiRWPrvMAuARsR}he1p(#Y5E)C z?W;|DzlrOU$;E@g8^}0G#nutY1Syj_!QZV9*gv+VqB}H~Kec=>T0>*jjZ;K|{GAGahHQFZr7ue-&J5R5)&}I2I?7 zN#Y4}m~~@_7G-|5EzrzVmepS&Xl{;9*_7Q^kFn~oy4o%Ob4Fopj%l^C9Qt#qWAOOq zebbb8RNQ)@S23+vU~81k1jeuu-CFw2&m7D3?Z?q;`Li4AvtLo8ccdG?PtT4uWCB@# zB@GcD$cy(x6dOvng?t{pd9^6|Ci{2$*^>Mig2LuY(lPuq2vWs4q0Ra0ubYz)Z%$~)ltF|o)p&wVPQM`Ipg3zXS6PJPC;u(KeOIjU zFecu~jlbrc^m#RH^Vs{|^NlTB@YdsC%Fx5g6_LNpsQ1!X_P`g$70B5@6XV$o#_7iC zP{%X5>(_E8Wx6*$kH3AOx6hGbVd3EXVc}82!r_DADCp^_WEdk^WXRl_zy)B|20`TjGtOUTl7AOU|F#sq=y!w``kHD?rmY zi5E?WQF}>shJJ`5;-HghElYxd$bz2enlwCZPvKI1PvDfKt+%xgv? zurv~|xL2UnY&!kX9&@Jl2jBFwQZ$+bv#V|5m+el3&cE_D3+%C7S(LqktIoU?{Th)p`(C-rZbb)DRh zvXOd8%CfxfH!_+8jP%?~{X$JR&OnyRqPnEtf)_yJ3GW?D*%Zlo)AvBR>{25IyA>+)J_880C zH~Gy{_cXytd@bZY$<{>0h1A~Z>-=$CCOySGS>|xrD6E`DabGnN>59`%B@fxSFycS3 zw7g)aEgV(tllLIEa=?)2Aw8b<=p`R5tFeljJ*k5HPjQe726r>fe7Ev<4U8EHXklc7=iO)B122-Vb9pO)B`&OmTB= zhJ`WOh16|x_u3V!#T0t*#4-EFmtk-k*4(vLz_fMTj@AnHoN8cZyTavJ%vkZ~J zpAd;vozsi44JDoy@Mse9!$o_$ANH6WC^KIX!J}!KoWHiFgL#zbKbfVI=dZlCwdi_DFeLUg!3=2b5C>*CS zES#;vAO0NZ(QFGrUl%-c=q8%LX4lGYF|C?~Qj5$v^t%Y9tH|~CnB=BT` z{OX4E`okw0mxrpCJP0M!Q&mB%Wn1OCuEhjggYe{7e$Vu<`c{7T+J2YPi!%!9CGLq; zX%^KTaYw*>PeYDE^;33Eg`GFKXwib0(J)3GtTP) z?(4Uo4!1v@-CwaftI_M4J~N7HGpuAvvI>e>Nl{lIukl$c`vPl0(Mga-EGbbFpP-sA zXZm4KVIG@WR{86ou*5JUpGElc(x@UFmiLb$fs%2J_l0C&0b{F&^64Dly{pOYI_{KZyCocV1f+s z*({H{>~Y}A1=2r1C+ej+rK9L&Ibn9?L}yQ~hJG?}EUW!XBQe}T9~l?KP>skwMHV+I znqq;N@Hz ztGqHn)fc~YkMh5cBo6W$W6S$_3T`IudUrultQC>vRs)A*hTa9&D6&#?=EidreGn~y zLuvW~uT?*)kD;H6ty!2ACKmKDlEx$iWdu&|sxm7_7^$~KwdAi&8AZOG_hk5X{>blg zX9Ny|W4?pd@ySW9NL9SbP;vK@xmxRB%rX)j6OA&?Njp3S+dw-_g|qh>5#p9o9Q+?= zl8I`+bN>Fa&~(I+El+xsilUBp`Ei6ns^3mQiryKcW;d5>u4o|C{CsfPKn%ZnaPFs# zo5f1P7FWX9wUxbMFitLm&MzcORI5pQ_*}Js< zG;U;Edu4NlxQY03w6TNUIRGc4sggj66-ryRcLrz1IR7jAW@*!d=#Gtq^Wu~3Hbr#f zLvq58YmEJVMuiyStIcg*pQUk1sDUv}G?%LV z8^$+|Rs!1zT#AF@R5jPZ47;QYjw9yp1~9xg?MSY=PGvh=hYzEz!h4o>y&7Lv%iCX{ z_CN2rDy>m2N2g@bm>ZW5`lCYmT8;Hx_PAMk>!8;rJegzmrSRgzumhWgFLiaPZ~IZ$ zSf(g!nUYW9yW`wG1+=AOopL^i#i;}Ic3w?q3P=NWlMGae^= zv>K3agjxM-V%6Lqj4XffzA{(T=F;l6<|ON^l+Z|ku2XIJ-7if1-JMwGb-gO(_jvr9 zO=3^_f3$bs|5PyUAIFVS%Bo~U-3Uhs4KoxfBr6Rn$;ymuhr+?Zu}AjE%-*sRrDTt? zjvY}*yM$Zvy}$p(=ZE(X*Z*)`kH_1xuujHV zIL1}&M7xb>Aj2sWaOJ)989`wcp#ZaULqU(#46JJ1E)HL^=X5{C;BKd;$U!mH{Ozt! zrN{^o$+4#e1BmJYx7E(+Md({5%6Oz3c$j|(j#mrGZdb~2H|<@q&}t^AzEHkn74+({ z=aoUvvY>tURqx%CzUS#?9Uy!^m?2DF@J#c%DU zd%;JF%DFQjY`3*Na+5+D6!v}j$gWf%IL6AZ`Jz2<-EpP@`~4z!hg|&xM=GTD78o(g zL{AB6e#`fyAvo-l^8Ydt@pCD&Q~nltOw*qb6QN`ydNkHG!8CZ=4b5;F=ySNSek z8gsRn@*j%*s;+5nsdrGw%tFr1M9s{HXy$7`6tAXO6B5Yzlt6XGSc>^8U%SZd!5sO) zVR=NE1fpHiZG8)~Kt>^78XEq!E!(%!(9j(DZ)m>JWY8#W+a%G^vXE*2+wK3`@&iKx zf`a`cBf_F$!(-wo33RC`Nr|C>=~-zR@p(*zTMA2xO4v$@OUnu?{{LKPc-q+X?0It& zdr4kS02>`kT2LCfr;F)f^do;i+Q1QNVA$};==8)$*IVj%=j{C0`^mYbnT4sZ^PfL{ z3#%+&d(2eDR8eiXxLdV6qnVLu&NrJ=DVgR9>p#6A?d_8)ZlfCeizLG@wO#t>LO`l{ z*uL}O!lFWFJs6EodrR0IdoJ}lqbH>$C+=5W@g;%VUAxcmTsxmB7pD3)_=2Yd6bBRs z6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs6bBRs z6bBRs6bBRs6bBRsD?h#I9yWngO+&7+*ILw?xOR^HPJ!_&W6L8+2dil48C*K2D5J}t z#<#hwh;M&N^JVUt?P-ZA`I(lWyKOoXi5B12Zy&l`>YX&&XQ|@IkZ9T0VX^m2dgjkW zGuryONYTHt+b@xsTG_8Ena#MT-(`{{(a`bSF{Y*CjHM_Y+uHib@T@%)2NVYs2NVYs z2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs z2NVYs2NcKWZ6fK38!L0V9|L3##A{z0eUw+`aVRf8-H-cl{;FjAbavE%$Ni~!$ssyv zU6YH?L+rHX-lZ!rNL!Z?XuB?E=v|dHH!m3zEGQ?2XK_9_C09RM`o@N1x+tgh?1tii;&83GNeC(pIJ(A=>cAved^|v_N~@-;qQL5IY0uEQZiy8A)2cGXrLY}u zWqJHu3^WK#OataAsYHLB6oS+Vwi}9<=k}`oTy97RN?GeV9I=t{B(R}yb>6w}!mb|I zZ0)j->=*sGb(>Go%T1R_#QYSP8jaBZ{CIw9{ZnKeo$rOCj5<&pP#jPkP#jPkP#jPk zP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#h@? zP#jPk9WS5%NT%+jw}>Q9twk;i_%`k``lk9ll<&{#isJhIa_<5^V>#M&8Opk_i>;0dN&aLmpr%n*ZsvzwJGT> zF9Y8SV@pGQOlUvl_A6d49ZJ(rcblgRzx#t*f5ug0tB+--G~SEQ70n{(ve`0hPe-n7?VdsiqF2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs z2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NcJftxz0L9D7T8zT7YpH)Aj1 zW2vHy7qzj|anv3cu8OwqX5~3^BCvP5OrCZ9hQO`b=PDe9q&&mn#Vf?B!SJxoEG9PQ zTS+g2q#wKQYP6caI(II`<(F{n#Cb<{zy6q}UqUCC7d1}3do%UTMMz1@nr1ht=au~O zcZV4*VbRf{$;$>^Q!>N4wH8nuP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPk zP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#jPkP#l-Upg5p7D!!g2^9;SZp?`m8rDJD{ zd->l}vdz9X3O317b9;ko`F>2E`euD7NIZQ<_uG{p@dJh*q`xxs4siZ-?>3xg_I)nv z6cL^fHa<9zcIZh(oy+apyLeCE3Od135k`pK_VH}czxjmEOC`1^`_n(19BG_d)V%)W zQ(UQ3?#sW+8vReG6HC%i98erk98erk98erk98erk98erk98erk98erk98erk98erk z98erk98erk98erk98erk98erk98erk98etRC!si?I3{N=Fvxv!{hA)5ljd8mCOhom z?VN7uHD6XNx8mEh@y$Oy^qq_k%|iR$i(}tK)pT6@({FugAdD{V5jp*@eyQz|Jhe^5 zHf!$$HwS`^SFM}542h0H+BV|KTz5Wa&b$7iMy{%R4)uO9+4p&dyI6}mx%PZr4LAK2 zPSyqMJT;G!ASezf4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N z4k!*N4k!*N4k!*N4k!*N4k!*Nj&FQW98er{ZBDbbESK7ulTCIRt5f=nDgNz(!F9|* z?UXC?liH~oe-Tl$aWJIB zz@dCW^Tn@_$L%39!Zg}str5XfZ~ASfZ~ASfZ~ASfZ~ASfZ~ASfZ~ASfZ~ASfZ~ASfZ~ASfZ~ASfZ~ASfZ~AS zfZ~ASfZ~ASfZ~ASfZ_-kh2ntXh}k^qB4X`wgxg!3QCXbx!9^e~5&2Ot+O=fjY@_-i^`f#5S3@5ZyQ-N?ab%w!p&o`D!4s z)>oy@yvicZks5n*3voluPv@FPKZW>nAwG%VahE&X`A|ZsT7t8+o=^szH#a>L2NVYs z2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs2NVYs$N#+IV4$I)Ir87oe51*r zQQEdiqN8OY)6(tU?MG$_3<(Gd_K%DRi;4}8iK8UYrKTh$h6bi*rDeqDF%@npEGa5s zD=985E3DYV#m?36w6W>g^X4Y@lDwP%HaeEHpfqw%7Ze8+2NVYs2NVYs2NVYs2NVYs zM_UjS2NXxgeT6muHA3oDy$644Ju};xLJeG_SDEGY{Isu;=DFh*N8Of!-K>J+OQvZL zMA3N_&>;UyimdLMc%+wkH7#h+ zl;-SPrMvQC{H}vT`4?W=hex-}yb8Q)3&jD&0mT8u0mT8u0mT8u0mT8uv1kd!0mX4( zA@^HS7(-z=`APgeldKS%%-z>B**|7P?#PUwdVJrOwIGtUML8?CEuXOC?x7v>kx8D1 zZ6g1*N>bgIebO^WJ26RK!>hi-hubmWl#RL4SYC--PRE{cpg5p7pg5p7pg5p7pg5p7pg5p7d;*|2pg4+3t)ma` zRBB-;x?zwbnVh2?a$D2JOIE(P^JMObO|jy=l2bgAEP?d0N|LIf#-a=*X@nA!e;;Vx zEAJVj%q>=p73R*(q#1PCe&o*kVDr$(Hg9%EjjD6yIeN*Z!t~F{1!j!-gq+Ilo}m>Y zoW?gYC}St<-O7SH3;t+S{C$#m-!>D91BwHR1BwHR1BwHR1BwHR1BwHR1BwHR1BwHR z1BwHR1BwHR1BwHR1BwHR1BwHR1BwHR1BwHR1BwHR1BxR_0g3~P!=}-AXL@m0>8;TR zFL`WZmCqH)^GkBnwo29#i^Bd`)_U3o_>PxFuh-Ho)qcNM#}QL!eC?@+zGqnIQ`H3V z39g7svh@j~D)9}Tk|~AB4Tb6B&kwE_mUpFOu4i+vHrj937GIAV=PIrhZK!FeI-pQ* z@~TG8Y4JZyM4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N z4k!*N4k!*N4k!*N4k!*N4k!*N4k!*N4k!*Nj?0&!IG{K@dE1opa!rSs{+*mVq~t$}8610Vc6XNC z)724W^6`8!-Qr$gXjfHvI$&f^^y`kiKc4n#JaMrOlWaUMQ}4by()}>0JFezlH?MU| zs?+PR?tX>t!23NUC=MtNC=MtNC=MtNC=MtNC=MtNC=MtNC=MtNC=MtNC=MtNC=MtN zC=MtNC=MtNC=MtNC=MtNC=MtNC=Mu&vUw;DC=U1Rl}7JQ1$urj-X0@qdCMn;5?pC- zq`me<*0ec)7+Cp_xrBEpg)^#Z4XSSpXxQyI&)j)IaZq>vE}acq`g;E>gTfw!*T=lv zyXl>-?03IJxFc_?tRg0VNo((9)$qY~mOGO=o0sbN%j8B z!csx?NjnV10mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u z0mT8u0mT8u0mT8u0mT8u0maeX2E_rzVQ4)f)|p$}Nwu5IXPO%N-0@axYGAgn-7EO` zk*<8jR{N!{DMdxcnyxollkdcOC7in_io2Osy8qp8Jvs4q_Q>>FV>i9H?D}N)h=R}c z>VIf@-*P*S_GfXg?w@w@?fd=d^~gfoN_Q`B>C8voz60VmTz_ZucDh%%}v1jodVJul}DYbFb&uS@MalBT0 zsiAb~9Ir;4Y_Rj7$B_sXiT$$*_2R{8uSykdY?y@V9=237PdHCZG;4hx(4HKE;(+3S z;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S;(+3S z;(+3S;(+4lN`&Ho;)n`0>g8jdi721_^>jw?)Vp63;c~ai6*ucn_x%hr4m8S~e_5K& zx-%t*r#0ll>l5DZq#nMO=@nSknq4b?uk?5JeChIm$(h%mER9Zg8{d6xs&n>>?r&!0 z9~Z@aA2kL3d^9E>{3YnnKvDSencnwNCoULD$U1oshOx{C{atYrA09d04#fe*0mT8u z0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u0mT8u z0mT8uu{H$70mX6lKEDH9;LJu_Li_souYGX+OtF}qhMHn%`=Kyg5EKyg5EKyg5EKyg5E zKyg5EKyg5EKyg5EKyg5EKyg5EKyg5EKyg5EKyg5EKyg5EKyg5EKyg5EKyhrmgyMkW z2tCmkM(kA;%B@SL98MOYs0y~qni?LBu*#O=9vTsdQ0~YV2=6`=IBkB`v!9VH@~`Z^ z>oTpxZm|wx+Z%Cvq0zZx^B;T~~5Wa6x*s(X& zn(j8AR^Pb~mql}{=-Q9ybBv^2QyX)ZY?(XjHgy0T=;0a_l|Gn6%z4&UY z_F^x#zV527u0A*Yy!}31Z=Lfyvhp$lf@ZgX0>Cpl;6H7?7XZz{6aX*^NN@rOI3q0t z1qcMy0fO&^1(#Y4On^?BpFw=D1%SZ9%)-LV z&BDyrqHNcJgVR9($wA-1VO_$l58yUl>MJhctFPhfBH>q<8X6uOI&Kjwu8}IhnDtd8 z$4nt7uQ#V{w;)oj)J~&xeXK0oqPfOO%$KD+ z-Tt>*gX41+x?lH5rk9OHL0keHuLguvHx|CH?YMS!LRa zA3iw8Hb0~Y_4UZYKiF-U$$j8`Df~*w#cLi$l^$9Yr9HTk|83|lJjG&$(3VX+S@W}EQi>(FVmY~8LmHb@7l8FNGCn9=m@7<{b)DD z>aLMMscJ27I3DtFcGSyly|KMW_qFXZ3<`JdKG~Xf?s?%F$xw#EK9iTTX8P2&A`M;E z^@>%|RM&8e%#il~WO^gDjWA&OJa+8t=P>^68e2cU8%OeMoR0mB{hPeUQNuLv=!RVd z@Yh3`IX}jP9;RSwP0iE_EwE$(L-s{$iXdXzvEZX55z8_`Z3gp7H`{mHWu1QA#}!@K zYaSh~3`PPe(+_BnnZI#Fr)Cb+86=j&)@V+Nczw~Ci3cvVty2UeiJ9eZ(y+t`{({5aR2ZI*J1;}E(TDRv-+=$18z-p-jC zsh)L$2}m9URw>5%I>*<{(9Z6gUbxS`*S3p)h3-1nMTKw1w$c6WB*`$opK_q2iN~b*(N#t={*YT&-t{+UoWk`gn;+UAJCHbho4Z6H?5+) zGQAV*kktw?#L$#kuQ7hW?|QIKm5Mb>3*LL@Jh)Ds>~4p)2Q8~QMERfqLGon~OG43@ zLfEWB$twfj@{2q%%W|3J3vs#;hHR<1A^L}sV%(v`(7h<_7bsDv_>VgkScwXoJ0zLf?G`1{AH7eIMAC#_8+~jsn=3ZzyhKAy{FbX%{UpLmq0Ug=Z2m zHkFL&+|uVdq*J^zKQPczPpNE4vy>f`7zpe4XhpjQa#@rFxgwOeJzC1v^?a~OW)N4D z2~Trt%5cu1QMyrL1P=>ab8eO@Ez@vYOiQ8h+HM>G+Yw~dp zNH!^?a6@%yBt^HVrIKhCsf{a&XuB997mC%fUEC!J-p?XWXf%=*fKEJ_Nh;VIa$2n6 zLChBnnxPL}RGXtk6una!7bQx}cQ{$1*C5UidxioXdBsU8CXH9El@c;sJ{~DMg-src z^yDc4S92zf;mGn|YD<+CSxZ&+xT*%~7kL@3sil2oYx1>KHFmYBhTGt^=DJh%yo1yV zua4oWu7?6^|I3Mih|G$bH0={Xoz1aQJ!`^g{n0F9OG2SdYdhv9Wy$oq8rMy$G)^(r z-Zg6CZq{6%>1q?S3~T?^`moHh)>og}(L@GAAL!(z3C{Amf0yaOxgXQ*j+(Ox)FR;NoHy`7DV;VKDFG7R$u%q zsMG7yhAvHRJH}~Fy!B^H>F%*o=zBTa38Ac#WMW@pgl%XQnPvEm>gEW%PPnoY!_)@}HPZ^ilX8(hm&t$_@0?b_ufd)Sv zXN8+-$vsbRccISGUH4Rj9>WlM)t9xlGCdRz(~n|->?j{IcyStI+L zCH1s=kztR9TIxYz-mpl~96r4Bicz|{#h9JGB9cxdXIEdL9VpHru86DJGfAF?Lzm#Hplt(EUztBdFJevi-#pX=v)DXc&VC3?zeZ7b8x}?b#oc# zj}3YFlOz^rysK>aiKgti>S7AiJnf=g0R}=)W~&~CTu{PjU|+J=Xj{`2Ncuo!S_yS+N^FygG7XoWZP;O0*iEC) zD7^oxEP*gZsLcd{y_dhbHLK7vw>E@FL!9TYHjgKeOKjL2>x9=;(u@^B;6U6HWso)J zQH_o>veuG0;)Tq(Fp>b;LQ8@9^{&iqIQ^S_M>ses3Rvnt^JMAo5l*`nkr!gcd}8lI zz$b2PWmFbjNnqi&q<1su-|#|RFTmDv#@+Xenh5DL3DPH_;;0{~{t}+l8eb`@2`sqN z$bZ2Fj0*_)w^@gt*w{T;)1;~3yD~rWU{NJut#wdtY{XFoeG}CEW`zg~VThHM1N-4w zF9}4HGT0hE#m-yUCWhNW`0U;+?C@8N{Kq-o3og%q^ z4D#PA`Pz)A`Ap#8gd<)zrj8r+aq~%d;3TQ9%qa(+$fT4bPA+-BoPr)%d~J=5Ig_4s zlJ&47(aqY(;ULNny6UL5_HCHJiM_je&Z=Xznr+k{5en#MA1{$`_A<}2k7cX;0gJO7>6n7`peZ|03d6xEn ziK&?J>VN$!!*i1i|1i@JISYj-{`mZaDw_H6MR1mmv`Ld!<>^W|Z$qxcC4JHn`9pB7`26kv^^#f|MVX=Hq@-2DD%hDU(1TBkJ0~Eyh5NWrEYDF$vgeZH zN!6vRiDgD3ZGdfnO9yH4Q?{qqvn>+iE9EjM^_MK=l_@eMh`L_Q-F?l4j(=^I$_6hM ze@q10|1P!zmkde;e1#3*c-2<_od<`cdr$xEXFC^rR}tG{IrV*c;$e9y(-3n_044#KhxD!kBR)2Yy!Bo1a2D^rlF zV1lr5hBw%!2vrdjV#7)pRLb8LhaU#k@DlC8u`vj+tv(v@5g4*<1X}``CV0hQ(p++y zYGC0wfWfyuQ(j0GIG z(jEKVZvhUFHmgN_z6ITV7x-bz%x@6VvI&9{!l{IXr3?fr?bj+%7Fto6iXFy7wd-Uo zOuQldxMLBZvPQxWoEF2pup?%cZr%fTjYxP+bcTEk9~yY>%p5$m_X*Pr^yrX0%R&-W#v;J55hQroq>VyeU+=6Y}jHdMQy};FkkaM-Q@e#*op>|Jek#(X#M`r6j z{q~7_ksySQhT^u9=A?`=`=`hbSI&qCYrYNjg!t-?1nSNyyicZr+3+!~LQ(eUlAR50 zwl&sHpb^1nW`~bC^C3tIE_JSNgNDa_tAHjqddAZW-popfzY#`_mKG zP7L1sw$tyiW*45`g>7H-=fa;cvP6SlXmI;cu|SDY{Vv}9k1^O0I2_SH4m76pgq8l} zRGh?38CfDxb@fc#MfcLwOxBESETzFL#zBbPAgD*a9;dbuCl7Rd+?z%cKeL|SXjq0G$|D7q z84tdXPf>*LFXkeQtHO4<@xkU2@0sx*e*kEh6BvOo1b~U)w;<-U&LZfeMn}o`O3=8j zyk;PtLSm1%>V>~Yw4WM^pK{vd%=%xg)?WEdYY@Eiby>%LUkjWxJiD5?jP}nuiaW7j_9f zhz^-hr~|Bpo@Ir|BQ;({^V~!)jX%^G$(bTohDU(Sjy-BcSbtHhQcPd&2fDKb>9O%H5QC%10MBqVNV<*D2vas++0%vs@2 zEU*FqV3_iTSRmZbo~b^eYCD{*oOi36m+F)rqRkFjC4;V4xXxFIU6OUj@bz}SZ%3S= zz|+;7K;l;I^%me3mVmSmD~h|UO{_9~r@uBK60b`U8bJoFU;%FSwCi*qzjw{W^qf2G z_B=UI+NE-j?98Hlhav8nqno8XNjdZ1?NoF^6p%vWN@m&oyyMz;FxGeGuy_9Cv^brL z(wDlTCZ%%B2*rf_^>0G>JElOKq}C^W(DfOYPGf~+HTQm~A0uYYogSZPvOMS;#}NHyM7 zQS=a800#&>6hH^)#xGhKWef8R@zT3##1Ewv4pB#B`Py-9-+8c+44=QA%+d@S;-5N+ zda$bR6D$DAb^ruw`!Gu+&uG)Y?XOK&Bd*Z85$eIb9Jt~Y!Q7clZ(sWJd+)+jvV4b{ zF%7@-KUg5XfI|Zn061WN(QhoL?p#YL)tSZfiLe05I8JUqPE325hp*o3eA%j^-d=av zBmvWh4iKZbC_)DU_AYT69HVmL+hkoSx-PjqN>WgdX)f})wurvi`(+zVE0#`=WccM> zP2!jW`q^Ol)b{z*=EnlA_$yP^-ly`;zV5_d?|M#a5K=b66&w4^4mr*a)|B_{{2cL{ z`Q1l;ZnA%1vcG?Gxsa2Rh!VImGYhQ?*m#r4?wVy^4!drwrhZ{ABAP25y*ohtMb5rZ z{QHhI>4xFk)pN~aBTF#pPhR4Awti@qL9kDi^j#=z+&x+C0$T1pM(@JN*8QnOZI93z z(d^;`(*r7Xy^>em;qb$WLEQt)^7`=-Cu^8g?vjlEqZZ`xcB+YsroqXJ`m^nl!RJSD ziwJ;>JofaHegB$z?&_C>Rr;qD*U!%$-%K@F`Ak1QSic<}P2LCwt?7z9GsxVDOoK~b z))LTKJV-aaXDxi4*1yfJr>VY14-+fvaO)_>#wjPIe|$~+W;JyNPIrGvB~56VwJv7e zYKv>TNBWazyjAzf*0cK;QD1z^r|mGh4wJO)zK@v)Zabs3-$(L0##DDEFm|?CcP=y~ zMNgkgb;`08lg4V_ejR=%w4>aDvWq^J?7q!*9ev;3;`>Wp*>&<0@6USoQ*X*p_K)-a zt{YM*iOJ7)`p}t}J;b^F>&tyWkeDefh}#-R*mgk*HV6(&RBNJvQalV7L&4qlu22e- zR3rd+o+OKzOskwHm8o$&nItG?sYKvrCJDr`k|B{(vk3+wc>gj&a<`c${OC!=kP#U`@zI#VL}Hp#wBE%#{_9B2X+GuDpX$4x z7N&0m!hJNH>GDvGmDG2GGwF{M{wyK7a1xkvQfmzqhNmx3>Kg$aQ4?JBsb93b4ANHKw`03 z>#|aRu`qm_`ZdLr`&&+w;I!zH@2`DLQhPe4+HlguBm^10HV;114p3zzS$n_om~rs(N?!7TJ{g*}n8zo?j1C9d{HRd#RAuIEgG zZfETl{ay1N0)kzjz7DueIS(~M>yx}|1Nnt5c>r?W6MEQJsH>sJ=J?YVG|6acC@A~}73sgrsvCTaHz2JM&n4G7m3&!sAzBl{s zbF-{}r%9=)Uy>;Avef-@ms0uU%dxL+0G0M)ZgZ8kF-8@yo-#y*l8&6qSyu`f-d*dF zIPT;7^JWG#AZ+WK?fW~FdQqqEpmUD%$_9}|v;E|`{CDSP{};)HF1+R(q$RuH#h{re z4a+`M139Rgsf$(w3akWLz%3)?4h6D^SH)Blv+8D9_&X!Ab3=p#$e=8g z1xKMM)dE7pDiyh4muC69z5hTU(O=n!s-U1kl+JuCN*h%l=RPeHGKxYiw7luCmX57* zd~DE}ls!UZg`B7S*Ops&w2MC-Rb4#fWBr%sDB0Ch>>Pf`=hq}xKPBtS8JD!&e@Y#cIKJacoD`I z^6QRqt#_KlLO>T+kOFH#0uh7fo0VFyxim%FRUj*6mg25>wHs#@hCGcR*rC%6a&c!P zj$5jRKv}_oVxARTv^?H?B^OFWg_SS>PlY$jQ^r239+_A=m<4_)Bn8;3&1N>74I)CU zLx~mL5A$=LaLNQP7OA2}a46+@xwJ&E(+(aKSQ<5|6?~R;b8*&KgB~HqkBX8MM2m$7 zY`OK6%W}>HGhB8pN@TRw`r|%2{O8FkK3P+_p<3kwR4nSH*k@+ykE)}v9}43Qp7sJxjKVE5731txRLvP)hVx_e#wI4~S)7f(l9a!@qr7Y&&)A~ZB z>+QkE)h^dMM$-!E&T-T#&8%{<6p85%G@Yz*zhhfmrU!+JFNqU?&u!ettY4|-qF-ArQTiE%1R?V2&Fv0W9qASS>MoG*yISpEK1mE-6 zAxn#Fd*4KNgojImj_K+Wb#++r!usXgGV$`?^mg{@c-45J?-wY19o(98Gq{Fs;VUei zeC5tCJOgfdk2R-sZgW#kFr;pidR?6!d4*a3rKg44XMPlTzsH6Q35A+Z5(jcx#-7e7q zLkCl4b7L$`JDk9Bn4!m-duM*ZPW*Db(d?Kpg}-kd#*Rn$R&3Y&;E8y*tD9xPl1a%S z%f!qhYD#uwxsTSQmrxx8d*{sGK*GQG)V;JWFCkP50Z-DlFB`1i)EQ!+@x`>F&S}RnNi#NI z#T#^$Mf2}(dMRv5XMpG8_~4}n)QZAo49q9VXti)A_q*87tv90+o1HoG$sm4tyKyL0 zl#*7Fqkrt9d{qj9M>`X(F{45@)3WJz9%9ZH_4^9)o%J0Yi5Fl7PqQE+Zf(=P2_6WN`8QKhl99AxVSj3jT`wZRlCFvNg_pEvv}4=n)GXpkDaT*7H%&Mi>P9d1do64gBB(#+$~5-ybkow{q*S&?1DW-ZAQUTVbnF(Efk zC?6)y)1b!FyV)(5lABi3V!TbJ5hJgB$P0Pn$;z2@Ms3ygjqB*Fp4_guDCFHcoc!I@ zS~=NT?A`Lou+P*&VOXrqW}4hWv(0umzrv`!QmM_ZdCEc)5<^v+fHQ4xG@=VPLCnL? zx}Q`Rn2ToD{vnzlb*eq#vcngyqm!f%^qaB^wF75KF<@G;0Mr+cG#&3w@SxZq?b|&? ztTcEo-RlAGw+KlQsT{J*>Cq@j`ANrU&i#(= z-f*Q+3(i%|no)^P?o*7>{UuZ{(KGaCZdj7;Cy6SDxH3+P@QI)FnC1Ly;4Fs^%uF}! zEO+^Lce-}e-uYqGB}I|tOVt%O5h$t}06u>G&-?;pcB};NWJf&xMdZ{{>6_(P40ic} zLp8j5->F5ck3pY*bl>G4wJ?;$3%JDVWzlouMOgihi3}e(ak^HOMo2?PBT^Px3l<_Y z0Bx@Qp@siS*!(}2i*LguXd{eN@BQ!08W~^>>Q$_)EitEu93($=?Cb#@VMP_<@(;kO z52VS}D1#Ue8q|V=eMHMtEX%kogS}u)D6f?`2o*#U%gkLVQ+gquSfSn$ny`l@!NY?> zDZ!qhXwt2I2zq$QOr!9t=X^PMG7Yj&;W!-$enH+C8_yd1k<+#Vr4j}+NP zvLs)uq<-e`RaNay)v$~1UV-~0~ zuDKkh!n%0eGVW;vN#gV4)JhJsXrLHjFZglS)JESlbQeb=|Jud?crw4%#t+*>9xNMQ zh4q4Ki9?Jxh?lvHs~0(ok`SDTp#d!&k&jIrhs0cx6LIg^@vP0U@HrgCauI&bF~a&h zhH|N_`l+oX5n#dDs08Ns9F7*PMVG|~>XyvM98-tsi=38x-V9lgfxMeMP1B^(@?=)( zWVX>(PD^gqNUNVWnV}&h!BXY1g{;UirpSKsc0c*-%aj>tyOhRokRiWWn%u(zT$`#; z<7n8?tI#$|UZJK)J4tBxf#2I>wmucj3r+;ZzJ0)$(JYL=gU0Chup+vF(YI#BKF6K@ zhmL{JnE)5g@f^yi;tdk}g{_4`0)_HPRKb}N>M0uI=^7qfo}$ILVK{NYrMDS+BISh| z!Hrzw&10&F2IU|?@$*rpoIU(hL8_L5Ym`YZmq6EyzB~B)%-o{(ZiU6}Q~~(k*VuZY zxvoR-(ai2yEUtl%%41J`)79o>3C|@<=P%Oe``WpO(e5i$r2oKO@bLd|E|#Bwd;rY9 z4nP6|V1U5?e(?WyND%%n&Kw57;sTHapaXFKWl0AB4hRreD-a8&Kn?a9z}z1SM-cI{ zy#>I9Bcjm|jSvKy1271Py+~dt0Fp_l%5*pc8idIqurz2C@B!FeNMhWy!?{8* zK+OH3ip3%-SR~v#F`#;}N_Ljx)=H&z6-FrRz#zv39EpKd^nf^CL}U&M%ozosfE56% zxPXqM5EwYnWur^vXc|H(39A%JG_t^dID!ZU61xj>TIhrzAn#QeX24ob@Hqk~%wC%Y z+w$Q4S7!fjV!Hl`@e=!w7z|X=+r7d;I8*{M9#e>#X$S%=p}`0PCU6LVkBAMV!~{$r zfRQec>@*5uLh&U4kg76wyqiHix80(9J<*lVK=Ohv~6uPpM3jYOfn$MYhY zQceWf$`hdiLIW*e#QEqo&ybdG_rTeAp^O1mVO|0kpV)A{eH|0lNz_{R;x z0U=m`AY>3SHi;C+e*`07G4Tv07Dz@Sg4i6r8coNda7p=ME0Un%uo&bf=}H-@dQ-@8~Nb+322j9j^Wog_2(!jdDT-x6lTWf2e40>zU~ zznD7q+kM|^z09b;ts5aEB9HHJxZ9igE~-l)B4}_iTgn`f_uWSmb1yp@3asZnQH!XG zDZ^t2zh6}F@#ztNu0HD%a2>d|wLSc-- zq-Pp}!z4=)f@qDjA4WU-5VE~$oHmX;rmbVQ@$3_1?S zL?TgPFgM_O3I$vveJe*VHMxRIhXmq?QqLTXoBZVU#g?js)ovW1jS7RnPh3F%`?T2G67lnS>N_2_t^(My2=VbZIH-Bv^n zB?|I98v*jKT?Km5$kpog@aQp)p9b)yFlU=GzVo#AD%5rW7ZEcMj zR1C7?bgUuSa$_n&6t&1OidX)hMw!=op2wKkyKg08KKK6tr`GrWL_xjnl@6N98|KgEz>56Ut~!{1be;IbxaRo7-_kPE!%$5d6bC zGS1e4Vc%P4O+9JbWG&}$FE>m|-}$y(GHRbTow9pD-p%mPTUf6Q7lq6pd1E7)OGUWa z2DWuaMf?Hqb(F)UDW~ZHvcrOZ{r@AhRL(sbi z>SN}fuXAr$TQtx=U$XjMGCn%BwM?t9ASKx&SL=$@DJR|8Y@Z%!&Fg|iY6=xU(mrn5 zbcsCms62`k?n^TIKW>Fg`YWL)KJ)K&;;Ymu(Pot!9CGjH_h-W#1@=517Dw(Ka1-BJ z(yE^eeY(8GE@afkP(TAN!x2JQkl8rcuxO@%oO+L0Skf^O-csdApU!Ao6qBZjVi zfW?|DMbA_(p=Lydn;ls|Z=R%ODsHR;maeiFk(a5Gpti@vAI5W0k5Oxx)#Dp$oN1Jb zHqnaLnMk8-JdRJmygMX=)4~*&NlHAz#x=mSn~(-GB-yYWQNI)9!-{a3fEUvxjVf^Q zJ*q{NUyp9n!&9BnT$2l%;tJb%3Yv185`42i%=zF!Zne;?S{|ZVr>$H6tZ2}+Us>(A zBP*GZjbx0Z(y}GJmY9;cK_D)4tZuCh8jsHA8#rVR(SnNBQ$S{lX(aJq7O>82pezw3 zd3lK?tc;w}T3!%L5raly}`Zk5>V&oKtb~y!P{VRp5#!M4ZmbySN zX#V?wUTNnE*Hxu7|FMM1%v6$``hAq2baqJ=_i%A2w1uArw^E)oWa)?S32z*u+z%GX zg`L))S)4hbL!1nr&+zr;g0^;Y4sdEaUmW@EH*J-UhjRZam4Do|vvQ!U${tYqzhRC6S|GQ{DUMV(81& zd%Zh+iU3kkYTHVNh_EEt1Je)GfYOimn^}4zGD23GGSUhx@jL=)VCx&zz(?jFE@B3@ zBpudI8cTNKHU{^N=}OhgP7pOAIu0mIbXzd?C%b<9X*{MmwZArpH`Tn;xdd| zxtQum9!;v`72RRGe>Me#ee$~V?4OFpYyNFm50z0&zBwpq^;>UQIs57P3Tg=A{Ypwx z`GNVC^h+bUPD3Krl{MTnWblI493ul_Lhu0+r5$UYCcH?%NabSEO`a2Mg( z!ujfT6%7{UoN8NZu2_wAkU1fY{9bmHI~)5+P_k()-smV&F5X6mjA%jQJdxxwHGD`p zO*5}7jZ*W~da7rO31j+*UN#BpmO8wB^nk#RxR~kuwQoE7zU&k{%^LM(EnA!hv8!Qp zsw`9y%ZhwlbD=<1cql97!3Qdex*R>QANV@ zVue+TFO$$=*fdl}M)Jj_3d^9{@Y#Bc?X&mjYfjZ*wIO`^PoE>Wg5Lw>ju!ley5E`k zS`tXb!a4S~Hs-#zeE|34TmuU+`gl8DPCweSXRE=znf(cnbG%p1_7+6lM~JW$r?gfJ zy)A1;y#6lkC)x1hzVCTQRO~hwBy7fsryZ4wcT#F~AO4ExStaJN*NiKKXI`h&1e&tC; z4|iu2x>qOzJ?Ic?{$Sm%do=zE%00n35ld!N{(SPD>HE2i(~a?^8*%sMRJccSXf6=o zE&_<&2*9MtI0Ak@c72w)gRz0_9=Po{DI* zC&FO9Z5gRXFZeZC6&6&D*{^qsk!2lj_M4cpI9$bRKz$0Ev??k5MU{%b5uBB;ysqZ| zeXRYtl!;Mrm-rJ5eIYdUwP!Rq=l7UDAiK`Y3)a|Ci9&hWmsr{MOJ{k>|M=xBi?r%% zM787NHyzwSed$0CtHAelZCE`Lu4kA-dT*`_x;qPy^&{2QGnKs+r$$=f3Q+eo=$jj^ zP5_ocsC00&ww^Do9)U)1)~GJCS1?_NJ~}5LhTc1#pKN!`DWKVQz``3XO`n}1MCd?Y z)ZB&DmU5PsL4Lzv9Nw^w*0BB2psh7jWh1nWHzZCrgkLV83sEuvWO2%=fNmo>Vx^yK z7FJ~?;n$?_O(IMe$?2NU_8i+LorR?8B0YxD``HfJ&2{Vb^LiG_W=Xg;4Bbb z&vz#rw1rJ3o&Im61=-fGEiq`# z#%nFnm(K?0)t^T%fOs-Y8s_8AX6NiXE3CDEc!Y0U4+4LS?SicZpXgOGb&^u)?1yFS z>(cG{p_z;=_i`ge#F#@VnZI-*S5hR9Q}M%M*Vkg>GgA2o96H>DOxmJfG#$PsJMc|9 zAe9J%U>xV}?Rrl{PQyh_&mEB;oW0DXVp1J#&MCr5(xXD929rcS%S*d-rWT)h1qwvZ zPVoPAOZeNI+=jrm@jxe~?mRyxa-NQR$)|R5;s`C1B&TtCL&!8`lpfKlkvemTN8NzX%)f?<(YBSYF(d(aUVWP$|YFJ zy`Ykrq7rB^Xa7No5>Y7%6=+f}`T)^;UOsun&SIdwV5l7j)5=dmLH#R`rB%F)r0^Tl zsQMDW23wf$$})8{6|pM{v%3$QBDkDTz1%mt+`p<^Q9fWxrou=d*=jw6PChvb+FapY zRPk%vUvgF7%SY>#zB0a%Uud_`rh4<)b@Qxv(%y^B(9tK7bgqMWFz%)oc@rAodt zBVnsz$StTfI$30ckZ9uD-#eWbvr5Vh9ViwRhgWDMZYVjIto=WFG!b*Ai$Y49V&kM-UM(SVLL>fGq^j$24JK1L$I!*t(mh&zqP&H1k5Io6;Ye7@3>1 z1YxB2o5LfkE0c2tWLsio8X>X;&GyE}DW4J|?UG&^sivbc`T zbIrvr8pSqcK^@Q4L97$YZXGuSF{d6D+wE$dS7@_R?6f5oPq}Q(G!)P7ZXy8E0r}fq zgxV1i<31S_pGSMc{3A^FF#Q#I2PZ57mN*HA;^HqYVJhRhr{itbQVNAS2Nksj4Lco~ zJBNt7Mu@w{glJJszqnntA*_3uw6!QCb(NH~pYC_bFZ6yR2FOGA+Rrw+?bfLE54%q% zl5r*zxxJGx?AQjgB_aErQ-6%yaQfA!Ko89Q6t_JH&;83Wb*Sl@%~b(65e2M6aDJCv zs53Ah_j)0Nec61p8O23e#eI3y61;>$#74rzN@P<^b(W>krPPU>OVA$JwP@*o`b%8^Z(1em0LBQYI_+ zIICWXvfzAF^aE-4_-0E{S!o;bfgwj@Aj*Muxj>-k-ay?nOtxlvBqP&>wU~q7$WBPM zl+^fRx=ZRSh!H4dvBK}uBjGnALEkd&do?Z~J`uRX{|U+vv^(|%>(7@%ELb^Ab{i6Q zKOy3;SK?w4E&;zJkzKOAaHfBzg-VJoL6&Tn^O6t8|9pWic{ zA&4b!!pff?=UtYAfZs9UoV?m8=~K(=sUE#DmnRf_kMXm!qHxeyQN4T#^z{Dfg6Y1DQYR)~SZ$ zR9OIM<$+UEhE*pmX@#qG<%`cs8s*2%oPfBo3IxAo-Z#VA!Ih?cfTO{;v?}tRpvvI= zN<`Z=lE}5cFgn__nvSf2&aC8LoXTCllXE?ig3f%ojFK;-9nSn3JxEDCdxLuIIV2E+ zkv6KIi9*=qYO)_on!U0yfAPn9P^X}6o^j=*is+`-QY2c9UUTci`srZw67dXeCSPyH zI#E6hQ6B&eo}(Loql7ip_M03S-F6vfW!77C)*s#h26{&Z-T}v0;e)iC%_z#W8koF;gbCfm@}?@HASd+)~UR#;s7Fk}>%1c5NHLA&DH z>%vwoHNiM9hu=LQsz-6(Ki##oW4BUP|M;ujn#Zu$F1ObbY+5FRcXYt^8n!oaut#+V zi?IN}Ap_hf@1xxU{G8g&ZG(t+_dew973y`Extm2*e`=cUNVqg-?z4C+I)K6+vZHs# z33Uqy?BIy*K!Uok9lTGB;`l_(d3Lu%th=`-usez4`>T)6WBM*%;#AQSHBOFtKOA=( zfLe{m z>wLWVyf9rTFHeDO4>mw_XMhw?x@*PB(ttNumG^?3P2-_1e>F9WM z>56(K&vJFcH{M&9J{Zs7&jwq4gIUT38|?fsTxIKuXiVDisz2V@xd!qjCru+Y9j4qR z^XfAVP4*$#O``WrQl$$lB`gNuy0q`&2L1X2|8hdCGA4eu2g#IF%Vdk4i&&@`WHK|$ zdurG2mhRaNvHli$eum}rmJBfm9cJeq{ThY>_CD{T%P&`z@(11KG%EDAmr!=%E$AyS zo7+L+m~mEZ{FjbyAuGl`J2YW_F4kkA2IP+p5D>e&`3n$8ywBC*^!~$hp3__AK7S{C zFaJZonx>EeFF%Ao#2SnB%+k8{&Uq4)| z$Tc_c^Tv1yVNYaOUbcYQls71qR9=%GTBSWM+k9U6+@(?c`M2vGKY#)jC-(wA!2)~eE~s%rn5`0pFxt@@YbloM6K*Q(H; z`85;(fZ;9x@8%R>1}6y!W*0j`8VcEy2>%em6H1^?B~C^GOCx3)Oc4y=wg&DI3;=_H z1iZmlFPujcKq_Q9i270}G6dPyfF(*jC^%V2J{>g>1S1b5i%LdiO07_jl@n(eop86E zF8>D}d_6;M+pM2M5Apqc{NCCN}2cWIFz z)mr5t^LTiZi&9Eiq)v1Lo0ts4>8Y~LjwFlL6R~NO&SO{lzpN57Kc?KUV7c2ZrVD1% z$x-sbYyqKPFe3@1J_81@akn0s)!TP>y>!dhVu|>~vq%VsS0);1#&bz=FttqI!AoI0 z<6Eg`{!A~C2jB8SZB49S&QCYL$^K9ic@3k%(~Ud)b*15s_%JPlSN=;$aGMgltbe36J zW|vXZ=x7fKw^GK~1GW;@;+sY>Z@1F2GX5sZy)xIT(L_*zi5DenFpK%wMA&bl+wtCD zYFDV5*nDWSGWU1K7L`}gtjV%5tt~ml{FVo9Y7TM|Zkid<(iTN^Md~!gC7D$uElt8- zEvp*3(%L%Os&TxfhJ;no6e536#pVkz6?ixzG0|>5h6h?s$cedmr0Lk&9HUkuvX)jV zP6XS_E2{KgI5QM;p{VZEOt8-H6drJ^8@n&NWqkkA?W5c0MeJj*-s8oxpw|PNBR3HC zpd4%Bo!RYKI9Jv3P^5r0;kh_TF^%8Zgts+w(8xh1Z_#3MvC$GIZnEB-M9M~Zn4tay z5lX!`s!)vyC56;khaI8W>|UTyAYvNu30kJ;?xHSKi3QFC{regB{;VV;K!+N6TapQC z$z16?c~M!;rgwqbc=Ox7uJy0amB;8`aAR;_SOrs7jMdlr4n)-Wo!VtOU*R6gI^+dN zqDG>KM`^a`tcDt z&*9WOLW`8WA3IpvZN?(s&rRK|3u%g>`JKeGKsXt>ECG*HVf{c=cSA5u>Kd2kIF}sq za+-jM@57XtvFmk}vL3KkMri(LUi=kBZL^<*E1yEr>1p}*aq;P2pP%eYZPaLt{*?iZ zkm8l1(YaI*r0Um4et0!%xRD=9MpR-@+J(SRlm&8RkzxS0+d#A$(`s~qf+eg_=qE5- z;kUB`ZZ@k1YJ3(m7*CF(XK9Vn>#!Ln-pAA$kHq=_~>Q_Cdr@LHeR^7GeY=1#yZ$ ztfCWhh{huF&rQN3k7w!x$CF?LBV2-$N1`(p#prP{VA4t-^9V>j;_*v_yow?JxW_~; za*+^fq#yMN$p8RLSVmiv(mpsoiX`h;gL)mnhGZn7C~}g4G$kS{^o6A#6JAG@d(6k~k{K6J700%sc6cseH~8 zCH3s*J>!|rw9t$pG&2aX26W93R>Ugs1Sm`ViBFa+DMBxNjQ{dC#G2g1FkYz&9|=Pi zksgMmR~hM7N($1CZY-oIHEH|4BCHOQZ)b875~0pVAn~o#r7cCv0Q>kD$9Pn2iy`WB z^mUx&aO^d$acXE(qa3J`OsdIw>Qu98#p*errViN+Lw^IifEkLRQDu!*uWF(@J_nGr zl#z2}86CK;Xgmi?(p}%9*97r3JqMzXd;p8r`LHW|X)#*ATvt9J{YP1a-K+n5FvcL^ zRjENaA*O>=QWF|ADMg)~(W74EBqoJcL`i~CX_a(Z&(a8dhiwRtd^EQZig8e71np{L z)LM%|NhU1>$+dhdr5SFHQFoG)is*zVJgsKxm$L{Ob9 z6m9v!$ssKYQq;9mcG*Qhnp8@PqGGS5pwzf&?Mh)~iWaW$OD$OK*S@UMRjB%#Dgob@ zz^{UzuPUkFVUe{V|3MZ{B|=+g0XV+{wpD@AaxE`G2QnLuWrww;ua1q2unB{g!OErL zbg?+aCZo^3bphG2{VGX@C>oSKJIW%%BY| zdHc!U>{d2Cdrfb5KHJ>@z2`qy?RLdOw9D2u&6$yRj5rhTMC#_}JP(@EU>gb2{zf>% z1+H+Lb`0PS#~|5#E_1b;o#aFZx>Ap>bBi-I?N+T{V(M~LUOg-(>DD^e@!GZyel_Jz zJ!_1`GM%#Qow03*?DiE;e#pyI_n_@Q=uO+%@3Z#wwioSZ`$>VvE1m-5tgl=<+M4M* zH(u6vm+W=BdDpJCpFC{8%0!TUm%5)wFsMQeLePOLq#(af=x_fMGBAY_1o*xY-tV7v z_?g%`l|*WaKLmVMm!qQ=cel|7G`u zViUKOcf91odHHc3+hKJ*XE|R#(Sb@-pb^b8MEPlZ-8cV^_xtpH?t#A&q~v5mJV}60 zF#BbQAaw4ldvFMg!!wojp7{Fw=kBYvQTZy>qPuIQQGFUzpdx1c=7%Xu%hHvfu0N%b zS&(G#)#ysX)@A~m2-2f(th(6jNaa7Nuu#9tK&ng0DE}EM1H1{>SgX<4s?&Ht2W&tF zOe?Hvz&omr>j;4C*a-+}noRntzzC~D@wME@8J^)8okA;%k-!RME4j)Rx~jLfnk$qL z4an*%$@(h=$w36!LBA3#9(;)mp%4qPjO|c#~>~$VI1sol=Mo(If<_7YD7hpl;%ROKVie;^OkK1y7nQM@9Gig zTNd$xLb?#egpk5LM8rs(F7=v}kaI77N+Hghuh%#*Y4NWDvoQWLuna@6Tl}wD2`~g( zno2C2UTL0RVX)^jLDm7UX6e6D%mE(AfoJ5zsF_9ms>V#w9fx_Ln*cFwj6tSB7$IvH zahw+zYcX?tF(6wpbWDn11d)=6n05>jio>RQ^pEl}vx7Jizu-iwLzo%Em~mvsh2gLy zYYu`8F@tQ1D+`*G8NxL~vnhMXhKxvuycqwIDS?dC$c^O45`dY4V7{6OGo2~3p2?(` z3CSS~9aH17iqy3^gR>9h77%zdrXjRSGqjt;v_RuCOS7|_yfm}XNwWz6CNRpQL`tNL zLq-c0M^hgVN|X?UADU?j=vkSe+#5|}n!@ok!vQs}95u^o|kUxZe~`<19{q8%-L>02Xl0=XA~ts7nrF z8+w#JZrY0udLr?tH7{Ya8UdBdB9Km|MB_R8RR#Bj$8Y z4UmBRlmHEgPST7sn8_lc<0A7hx=&J{rIV?q4A7)N7r^p4HEOyxQWY7wIysWM3KhGw zgQN@vJX8X^4duH>@=&t_(Z3VXJ7UfN$j`aVPtPPxxRXg=nL7jR#K73G+d2{$#mit> zyThv#xBHn8-8$}ICB(Zz`Z>H=N<7qyCe_Ql$6GzhgC=Ei($vE|D`f}?P*D}tQY{@2 z&=X10V@BUV(6(tFp8L_xn+*RZrBc`M!sl2~yQbD3q7Pncn7>mCc13(B$ zK;JSd0(_350>_te!4_me3XIkjY$~gIR%u<1K`qp|Jk%H^9oW*1Y|0I@+KV0aOO@F` z4#W=a@IY#Xs$p^~85|K9gbo{IDHSIdADXYScy4 zu$F}U#-F)dZ}cz{Los_H$8cmvfmFwHEZuZGn}x`L1;~KF&B)cwfar;s*+pF8P}rNA zA29tqcYH@-RU7{*p)rKiMr~Y3vlw0@tH|VKNG4leCu?3PQ?rItRG~}Mc07oqiN@=- zU7RV&#@*TlqrWRc$?#Q4#lgl*YqO_`$(K}Ln+(c6`^l`~$wHG~tn^7i1IqYSoBCtQ zOL~eUiAHEt2q{!IsBDOxovC0o)9o!T8UH^`3++H-rN>#fXpF?E+&D8{V>Bkte+$p-v_G-EyG9ib?8FNMh6wF+xL<-e@uVSjNYc;|jb*MQQCaR#TApQ&&`}vah&s+Y8r3QMgRnB%WydY%V(ih!_)!Ky z8pUj-#4|iua-~|DQfI2tCcRQ@Zai&fQ)|xVHk}CF9Xd}6nA^2cGVRCtvoSLzn9XZD ziE`69jZ>G9=Z6|Td$K-!zUP3-XMW!2-_z6UOUdbF)P=QUM;&Me1K;mGD3p{`t?Gg06htJzIHXkRW8oqg#&o@^^=!z{sTLL^$1 z7{sF$#3EYTsSWMtqT1^kZPQkjrY&vl+7qE$Yfd!9h;Z!jf^3A&M6*38i{P%VeU|^8 z^_KRD+qZ=;N`b}q^4q$tFI%)*Ts&^Qtz2t-Zd`>K9aSjBA}G}I!xPdeSp4o_S z8ww6J!x5aXl;9@c$|wJ{D7WA*EXxrF;k6Xu5YBS4Y&FnfryJg166UHi6{ClxK679* zPzRggxGT29WK72K9UYz_9;S0SH`+KK9wE+5Bd$y({`1;|OhE^f*o-!DW8&BBE+R>{ zwm#?8ERx(k*!cltGXB0XZre`9^xUlUOjqMHW@AuyV-y;7f)h9a+DXcv?-H}e zb_hJ4h?+7_@*Lz^7i93jbwk$mIzLaw2nYZn`2+<80096j00000@Bp9y00{p80|Y=I zaK;P-2n-4&C~#oGg9&FWZ0In6L4*n`PP7OyBg2gsBW?uQQKH6*Aw4#9@Ztr<03ZZ{ zh$)bzONumSzT6prM}QzfeDZAQ6R6OkLW8bsnIPqi1T$$i4UixK$EqfpnnYQ0Bh7&X z6(Ve?b75GCV`Y9FEB0equpHs4ZO9g_+qGxq!o(XlEzG}w1>PhJ_-lZ{GKo^;5u_o| zp*Ts3n||FI z_ukgKP286KyEgCGxq;KOG_ZrE}<#p(icNVd+syJN;VNJIZ`PPL#`(pe=M zOmJGc?dH-g4it{nL|BSw>9e;lzhVBY``zc?d;kh3U_k`dcc6R-=x1Pm2sT(Ce_JI+ zkpnPQ_myD*U+qGB#)gDX{3=nMyaT5j53ty zqL9kg=%kerc`198YAPwGnMS(fqn=I|Rd=W2B;sV#(Pwd1G%@t!Gt@ zj@D`^L7TbekXWR37VJdCwq|UD$f8wjRm=|Stg_Gw%h|KXN?VbA)i%5BXfcKPlDIB~ z%M-b2D)p*&-tiC<2+?-79z*uIBy6Dj1)9~Y@%Hs>Oj1T<oe3H}p_KH%N5OMk|eU(?FX!rpHn*CGt-vm;6#u>JAkIiCW`l zBh)u;l~q`P0$E-|Nk>f)fI{-R6WqoMJ2$j-4@EatdgK4iH&1)Z{Zim|3-;2x78;II zVLOGr7@dy4RI=8gjU~9CQC=igpl|yvIBBG5#%tli0{A!Sp=(z9+o_+=l9{Oz)XE~9WV8ZW(%Mcy|1^x0d# z9QM_t&VBf-k58QV;Ge%zhUF4=A^U-GSbR^zk9hKlaBlq-Z0TzsqiI>84}-2pJ@V0| zdJ2)zN9IGE1j=TC4Qili9!QZ0#%6*>`|(SB2rO`%DUp=O2|bHrOG;LYTU|NHAbGm>M#3?B3YCslKoJHJ`1#u77uuLFSh^B#wOpbsUztm0-SU=MY$Yvm zX%$-z6PWz@&r|6FNAcw`hpDVtJ%uLUgi2MOqRm;tQc@2w z;z+on&XX|2DeHV^SKOIS=RvTZDxnKLP4fQ{n`p&|P$`Q|4mTI;aP5ULG|F_6GCX;< z^CN%iAy&>ql7}X)E_!(jM*X5u&fJAA9#suU`|?q#9Wmbh6ySNWDxmsmydYVz)EGIg}84q%jdQ|u@^*u{{PE(_5RH*t!s#bN5 zc%~|!r47YnVGN#F8wZ}M9_Okr$_Rbb^OW`&hdEJ=P>vSVq5we%M-!rJg6vwMx<06{ zd;P1}B;=y4Oogy~MP*Do1iyD-@+H8t<~0}7kQ5cquR40$`Dk=6x#qP$PSO*Twxpyg z1+27QI&GIm8(J)}wos-e?P?E2kQe{t$+bt~lT5=z%9W&RO)@NF{!#|3l7XkShSHLs ze3%|V?FzZE?Nz9LH7Z}7t-8~_u5?MYDN>1QyPfK;b$P^6?*fTKIC;w@T?HBTwl{3x z!7g`!H9Lv!%37eBZy~MaFKT7$TK?@gGJ2fVBWC%7}9+|j&>)jmtE zPcZ31sN}}FP>4DBTg9}|Q}WeTaUvMRHQS8Ctb#F{X)MJ8n;48&%rF(-jKwp)agAeq zF;&{wW$9%sG-E|FYqpC`Z`w|dU#u+P$gIRI{_(_^wllBZ@n=^4BbJ|5WiD^IXJqqo zDhH(HRGOr>HR0XYGKmzDX?XuKVDnDfyn5XdtBq)L?wgc87bDMMk#KsB+n@a$=)3`r z(1(W0=R^im^llO}bMnsQ4!!5XVNPBL+1yh)SLwOYE_%j;UhRF?&fa=>`|5D9C>Lr_i&i3E; zkS%TgQJdN3)1HJZ80~E{R+;hZ-D2Kc*~wCtrfb??v%81H+5|8(30}7Wg{VUc9&m$1 zq_+b*n8SUC5a0IJ_XsN}LJZ(ayA6nYhr5z>U)kD`Un_3f$me>ERpK8blA) zyMt2<$)D8-IFdtgjwk;Yx!z1}MU}5{+gFt1yVMJru-Z_#5NEUG-ozm}x*W@GWKO=~ z$nr&s(&(#HWGIt9$feiuka=V})B`DXK>C<%{9%CBx6XC0zt3>yQdN@K^=KP*G60`M z`qM`_msvT|?O&GV+RMqyV(Rjj+%%>+dnwGl+nw&j4CXEaulKq)xgj4&yy6qT6W&QP zf0bpIxpzIE!6S2&fdZ#ESxU~n8@_4#jA!WS$q|d{v-I|?;OOs(`g~S2^@wMD0A#Ot zs}b}!26c1p6}s!Lu@m+zQr=b4wiSoMo~Rr}eo5h?Qrt7&rv-g}QAgVRj-J#)i64OW zv%mchxX&<*hCKgHZwfgY?o=|$|EZ-!bEBbBANo%{t8>f>*Q?SWsaTbNa^8yn`#UxN z^`}(=;e8Ac0NNJ-1?YX=0aj(FYhF`U?xBBw@f2#69#`R3N`+QHS9gV3dWBem zH6S9GS)Rp#B%M?s5rb8eQ08H=te&{mxB@)X*x$d zP^erY_D1+JC~24^n4(|cl_}ztU3DmjaTs2oVqV&nhjhpgw3menD0@TkMe8+&H+P0R zhZMc$ho%2=E3GtqZzNxOxL@8vFAa8y*m7c+*e%-9i3P@Bo(NzHris+j5CafS^NTQ3Vlxv^$fz+?7I#I{WnhMmK@(=_XpZGLX6NXR zsCa-{cz`o?CTf;7yXSk26KCC#XM@8dc6KCdb7k|asJkqLlkg=IdJz@n1AV)3si-vxP^~Nlpo_rko0zGB8D5bl$iMwG*odo z1eo@=FbeTQK=ql7nQ}+8awykwsmV4?)E9PxIZY-Ou?dNsQJb$xo38njS_h5JD3s~d zMO`#M+qg;Y#Yr>OM61b0qbYQ7ltjzvbXaF~ayOl7XPsvwPdo&5Y2guxf=AuSPv8H^ zM%tNi{85D$X@IGig}zxrpTw4*WN|qsl4N&wX(yd`)LU+MN}m~ZbLV-4cX!)#PJnlL zR0kJ+bf9CApsIwRNvEI$!JxCJkqC%@3aA>FnFDRvmh?kzI0#u{l}!M8dESId;lz2z zf_LZidan0-Eoyu(ieHWLmpd|}AylK7NN_k>EH43>y-9^Z<`Y7igG0Jdx@V-k*JeM_ zP^-r_K4f3%QG87r7#p>GRf)l5!X=~wrY7a3TbdSKYBxW5g)R7# z=(&Y|!5BlzCJPmkJTZRe2WjbNAwb1`Th$&Z1%Ck8e-Rjf`vAt7*6qtySiMEdb5 zKjf&38YPjcs4YdQjoOpZ*rU=&S@rXlN-1d&$bbKrRwl7l7wCU+C4?r(sv)R?G7&AF zQ!Fzft9wSP5vDwGgR8c>tKHO-TF0gs`Jb!<CiJQoaFI$VFp&1CE01E$56*g-uegZ8v zi?a%#vnIJ2J(~bI>lw-;v^Pt%KWnrD=$IP|r!B;f^BId{)k#2cwQmxN4;Er9QXl$a zVlYcB%qWcAcrjzkVg+fEEF-NsvowCfGH%PZY!kP!_n41Kh$C~2AX*}1M>1F&6hRRl zXImV3@?^R=xP}3c>!^ z8zmGm0Xu=ZlB17EDzypax-0XyavBu&YLJA~XJ`XN4uNOvNRbOkk`oEM73oTp+X2RF zyg$2l#e2MwJD@eoyvXak%X_@Zn{*R!y%T@}D1g1HyNxGer$ql|hGt|GLBIj#%K-tv z0d4X^EUC7clWAzdIek`=HaU~^Ta&)_l(bZ{#hbIv%fHB5y}Sg#mAk*VM8N*LFp0;# z+RMF+hm;>0s^cpnKkx$$alS2?lgR^>oYFkR=9D@qZ_l=uTv?ZVsYbo>BEmfyXITL zbj$%noCFqf#Y7~U%*Ao2q{oICa;=G)x>RzjxfcKomT*OIW!Gv5z%-P2q*C>Kq$Z^L=Q+IW&rz6Cq%}NPq-BV8<2A0sTpJYp0*4)J)Y3 z%SvZ?c_*NLCwMBFOYGxJ&ZJw)WX@F)N#(rGEEQ1b%oOf?&K+ZvAQOg>$G5>VJRlGP zNT3tzq{IIgr7>-Kd+K~w8htyBMl|bEWDFBO zy*WYs&Yba5LfukCjkX?19k(~Hc*=-2m8Y0w)IfcVftpbw25&-T8aX|v|EH?J6`r6Mj%OLp;UE5>`)svFhB8Rzy&Jwth`Snv3vY*;;%Ga|2PxyX z`;Ikk5&&ruIL?kbZo53w<7LK2XBIqb2HtI!q-Nxgkg?l2plR zH>v0Lo4=su9S|(ncltO@ndfuA};( zpo*+vh)@VV>6V`9l43bLiurG?PM9C(>ah;%gPEAK9z3wf#-HxSJTX}} zRKS3yJq-iOp`Rc66%E?|u(D`$L;d6uh7SPVh(r$9qj&kS)MwyI=#TnimshmG& z7}IXbXVaXm1V^?Bn}LL%N+-*)Y|Yr|?(Gim@6OFlC+|YTF5NwLl1AkA2}=0>%GH^l zZI{h(H#Fh7o#6a=3m>2bO`s$C%@5Ca-VE^-PtHR&jm1n&k{6-}bn$-|@#l2V=8@3y zD@zW#G%zaB4lQ~S?eY}OdNKbG(KCP3z{e7%f=x$?KS&;NzPIu)FVjvce7a)OKeMBU z_ti@Oe$$uL$;b3h@AOt0QY(cj;&pRv3?R`*1UnHVwxCsJ%3~! z)@x5yZ9mp&f2eLP_gNJm)-f1hDCn&+s(BrMhB|>1g{nYkshbk1(>j8O->QM#frZWZ zD46(!{rCfpMvp}io^JV;t%H{(+8@aID;PeUWh1#dtKCG}rjOjGjrvXK+NyPgsUO?P zO#u7Gl`3lS6Sy@%ta{C3Fvc$nP+k*sHX0NV z00zJl_m5!(Ugmm_-~f>Tfr$VC5CoVp!(c%Z2oeY+xG>?u01XpVESO-%LlY)6Ch!O% zz(auw6g)KP@L>Rv0v#eq_|hTEmIz+Pba@d(&6_i1>f|X9r%j+EiNf@mlcv$0KbPi2 z>QrRG02C+$Fi?;L393|i1PKrXY*(@YjFd$ifCmq+V+*VjOvn)urpo14L$_6!Gs$yxUKRrFX^y~A#4|W)HV*c$2j&}eMKm}}4E+Xc{ z`_4d;q)U*Y1r6*%ZSw8LlLdl3i>LC3Ol?I zqZbckFr$k$0%@cDCUVK9;gBP+z`Z)^Xa<5BG{HzBjg%3?B#C^oNsOLc^2iLSEYivf zv5XQ)C9`bO0hU5U550n1^lHV`Onh%eHN8Ub$S=FRa!w|{+p8jvI=YdfApILKNYD^t za-t_0i!A?2Lybg~P=XdcEYU(0I<%{SCLOZTOCP0_QA-u=G}5I;3xGT^SsL-px5{#J zMfJ!!F})n7+7zKsH3c=($Y$b^NZ$Zs>7qXg49(1jq8jKqn_^0Kx@CQ8_PS?n!gIN4 zqt)%&Y8ld&tewnUZA7%(dX+44VVe!yW0~EyqHd{@45^Vins>Kv(Hjh~Z*!}Qs>S$K zsy1pJ3wYjv{l!aQfD<-&VdWa;tYFLnIJH#JDh`dk_EKDxP`W@+nPplD>ao9zNM=eU0&k`^XPezkw&t3Frg`U~aTa=KqJ2J^u@KRst727S zeUJZY6juz|Xr+52hZn!D3 zTcN!f>zi)A-S!(%(#WF<<*Qp$l`OWzYMiyO)C8Px!7JArQH@5r5l4^S-h8EmIMPTV z^lY-#AVft|J$2NJg_k#lULUpf{Z>C+_SRwF)pgus_dRi!$MaTl7RfF5`1X=7h)s=i z51x11XJ0)dBX2B_QtSIliXloxN^(jonWQWHBgZGGeC_FdG=1>bM?Ww4F(Utc@#%Lz z&-3vgl(we>5SPaU2%8q!Z-4ER-~A9M5*_)CPYM~`qe{n+&)G^kv*Qy;^x`+PA%_1s z9pOz^F!;d@iqL}`DIrxxh{6!6@Pry{VFw37!Wf2zEMfuynOLH+val&dK3oq~j1UAg zA>@T1G@=V<$igHp=T4=Qj$^t6#fS(*AbU|#LVg1kEEb7LKRHN}viLb&`~3#H2$`$w^VJvXr#>mbZAwJk@jz zUF#uYD>aEqQ|^+LQXGi|8%eVYbxx8+i-_(RV-bk3Z9m)!PBL8w&1OnucGUlDmNKy^ z&1bqRn$EnYH!p^kioE~?sX`Gg2dI{sa5J3D%;q%3Sw+u9G9)r$jud@MYSj5S*U%<5wL}qS_;pj4 z)`vHL`C>3T^wiJ&MyeKyPP?!}AMkjmJ6ZiIcjV*Mv4WL&YTvvb?L>8$iPO}A*ms~3){q2c+a5JBC`&3g*RSI6YvaX~!rK{^!*HhiyZgw4& zI`P&DQjKDrnCghCqQ<9>EOOOF$2BYMlJ~pyJ@2kMSFfr91~0vO;61H{EUmsvS_D=W zf}N${1G9@T)^eS7fC8?xbn5IsiO)nKh?Wd3rO z@ys)@wJdFABiq^h@?=2Q&2oRsn`!YTH$_`2(RXt+qah8iM;Go>qQqpR4(C(W)tPZ^ z`n0Df7wNzuTGEzQr06_1!I3CL)ufvU^ltZN;LTcksIztLa7{g0_b%70+x6}SMX%SP zj$TtftMH0j(LdIit!p~V^J>lOTPw4At>#|#@OeFiXxjt^)D!>Ir$B_{&wSxtAh_9A z?gSo?-Q#vQ`DO?mOcSY5Y5AXpE4xnD5K-OngEzY0?U(RC{qL&udnkcv%wb-Yn4_zFHMQwY&C3&>?xe`)!5Mm;fqt2# zAN}baS(1|^ASEQRVUS7HW~>L7j{;QB;t^*0ZKnSon%hR29dP$N>jgQjwb8nx9=_yZ} zD*v6*bpH0QKU4F6#o-hu0LL*2HgXyC*fetyDo}$Qqf(8W!!> zj8LjTtC|eB3M=ub53>3|vkF168bJ@tng0k7;!v9HGmqZ7J!e}UbU8Aya1YmTz^)QO z93(-`5heYY9lYv6yZXV6$gCPEti|FG&SEUXND+5uMK}Ez$A|(%KOYl9T`CQZCwh!{ll$IGjT{#4R@rjVJ_^KLM8A zGC3CnAU(3Z=AkSa^um5yi$r{rHl)KlY(yv06AhX!NEEzD9IyNWFZ&V|^SYH!@vcq8 zuKT*gPNa$c;6r_p9`%~N+8Y;E@uTzzKSj&|9>{@N{H>Y!L|n;5{Yo7T>My6`6|@U5 zmI4|OYcOajFb|6m1N$&!OfX}l36@z9lDL;>Oc8yvCFbeA)#8^A0tSY(y_wfF?>83*m<%jYZ?D1tFo3cv!4O8Gt0A$Y#NXhvpe%ho)JkjV}g`a z$(3A5AKN}!lbRkHpf|BXiAuB9VVIN5vpy3WvQZne@iU(+w86<7QaiLoD>bA%N~0`F zN;@^dp@FEB%BhS>fdne6qYa|6z1L_jin&VZxiU7&G^K3HR^vg;`y9Us9m-3~{s}hP z0XA#vwdoPIxQrfMlgnzm%c-D&0LXy91kAq-fWAaFhD0l_Q;TOqxoG34h+;ts+8twy z2w9`HLHU(#yFl&1HtfmFiugBi`^8&^k=rDXc?*tu1EK%W95~R5Lmmo5V?zMPThDSos**b zTuv(@DY5%Grc=89EW7{oPox`A14X2Rc+CLl&Z+E9za-46OGT`6MfhsA!`n>>y(6cq z4M~(br(3!LRSrmMJ4Z^jv~#MpZ?aO=o6>hey)5lLFBK;t za80U|$^a14hU|)RV#WV`)1&jC7;<7rk^mHx7!cUo(klf%Ni@DZ)u)p(zw#rfL1N%q)A715{*!@f7wzU!N->q}JUL%)(* zKX*wf_Y*Lkg1{w{zzEDgSZ!5SwJBMxRWT*gsa(_nw91!6jl^pYHc=<6EI<|eKL9ii z<;k3G~(^^+7hmk-Vx`zS=A&97D(2S0sEwG5lA}3PTE602)|;gjLvuO<06| zED<4*EEFI$+0FllU5zOGk(7wng8h&(RKwXpL(c&%(}FELbVNH;tw$_bm1RVfU0FLk z*aZMce~ejAEe$t)8C20a%R)>zAr<%RpCbJejg8lrrIQGu6zPIEN>ti#;zaJkFH($J zs2xSBecJL0#lwi%neE4#Ee|Nmp`D1bbLu*DMGK7bw^XzkPn`-=43d?=#qj#B{}RSu zq+9;_6=PvWbA(2|b;bqj+W`w)Zt<`TSbz-RT7ER#40yA9aolei(rmmXW%JSZ_?Bse zy>cAK{g5zp6h?P6vCmaUiL6Hzqemt?UD8F}dsH%=@>Gk-zOUVhSuu}VJSPeR)(l%b z`kFo1eck^wWysiVjEB^(uc63{JXb0MTPxE^lO#!w)U%RYnl1at=M72g%`!_(i>N6U zvaLm0WQ#=fK98ZvmxP^(GGCiCU7UOvoGInfg3 zL9>J^NeZSHrP0QlWfi5n8ogy&wozMN($%QkjEOJUc)=i5kvuMoU-sp~Gg1#7yvY+L zDJ`aFc8)vM(s-iMF5SE;&1P)&JZ`>bo%mgW^szNnKsIF+HuOW)K3j0i&_(oxxvKb)UUPK^yOZI)?EL8 z`3!I_RrSMXRBb=cT2+I2Rc4)4k8W04%_)%%X{D-FVs*1$JxI$+K-dsg%T2`yPA`h$ zKVg#oE|b+p0q+s^+?drX{_!l=xC@!Sy`-Oz<^K3QFOY~6gcNBh=C{myTBBwp2-n1K{t!-HzG zO{d*m$aNK7j9lJ}Jl+OR-jsoGQm#muNfazAGwjW946j}ecU})i)%9Johmq@Jj@_x5 zvze^o?FBOV{j>Ou-}fan7#Fk`2g;tD@r?)w03rDV1qA>B04x9i008g+pa1{}{{RCB z3}6BQf*CUmni$BCph1KR8xAaZFd>445*=2In2{pHiy1Y3#3<3DMUnzRs0`UqB?y)b za|FpaQ(#S&H*ZP|l9OkE93XN4<)ISj%YhdYR1A>7#KNW~lpYm%av+GL1C=63kdsYj7y_(fJSMJ)n2nISB_#(i|y%GTj==--N51l$;21u;f z=S-j}9k_hqQu5KuFF_;#VR^Gaw`bYLji_~NX|7&Fn>NTc_36_ZpR!H>+x6_)q;JoT zt(x}kf&yRk&A1Y<@Q}p^@{njmF~jE087{Xfoc3nTv@2_#;W+?z&Dgnv|9t&BZvgWj z5q@Tf-lF>R>;>_w?c0_m01Q{rUds2cUidIB*<8nCW$(RVhuy(sDda_uyhd zNSM)d6)N~b0`pyW6o*W4g%E8~y(eIQ`b}jJf9IL!mx_6*w_<}x#Yo?bFV@H+jw^j; zV~bY7xTA|b0x2Vrex=0Fa136yWJ}6P*VBVjvSdVahgoIakEU_;;S66TB$f&EnIPnm zK@wCZK?^MeW{zYM#HO5Yt`ujRZF;wmoohNp=bkU!Ij5U|swtZpo^?96pkfQk z6y2ngRv1JM0tt$!cTCC0VSY}5IHH+`;`wKioL&?aR53DiW2mfh|2ojCt2)){tmnaM ztE}?nS}Sn*^{Og~z`E)yv9~hF&|V-MHFRpN#>hdg_YO4P9d~Vyz#bMFT8ZkYcIX)%BwHH__9kc!Tk_Rd z>!!=jI$N&W4twtL&W<~Rg$>4JOTj-XP?lX=IjP3VA=c3AsV4~>nJb4IdhNa6?j=KH zefCvG-REl7^T3H8Quv^e-}Cnpq0heh-j7f5R0a+|zlJ+OH+hs1!W6`{`|A}`%IB6~ zMa_B~x>u*t62FkFDlBL#iEm7U5{5jGf)1P@i84r+2sY$`8|;V%Jt(mzDQR&CqS#KH zQ!NTrYK0O6k_TJ1E{Mp8WfmM^1?5B#>!1xK7+F;a|ACk(9|qBaMYPTl$<{+9W(tW- z93m8j_(O>pk0n=($xN1$Ey^uVN|<_L6ss7ba2@Sa=P^+bjVQ(^lF2Fc$`je%2*)=O zk&bcXp&Q+m$2;=zje0!PAMJ=lJOYv=%$n8-^&&08C~F{LJYM9i1s!b#V3L=dN}C2L z$BC3FDxpf%9^rUM_5e~nZC0UDNJR93N{K>u%WCrSgAb`nN5aXGl8_T{ z=G+K6!Kuz2zO9`OJZA-iNl&W12wEYz7}vDc{}_HsPA8d}h&-*5l%+srfCm&PJdwh_ z=nYUUZxPKyLE})eP!ui`Z74=9s!@q@bS@h$A7>_`9cVd@aR_SRVki~Boy_DhSLrBT z5(J*kOjD+9kqrdPGalWb#Wp+rX>NkrnxU>ns68brYK%I;qBhbxDuJpngJZum31*Ve zR7_S`$k5*4W;@;a&Sq#M9-SW5sV53&fZC&00;P2+Ze=T6Re7Jb(v?4UjSpVus-aJX z(?bq39>ib*p$rk0LYR!wVk{)r_qa%9*d!4e|AQj)oashHx-5`r_sk3O}tdTJL z+0kw`N1!FGlCZK6e7_Z|V8s_)_NDKx@_VfM8f#eo^;UoPD=w2ZGD#p%>2tOkk}h6oAl!+taL^7rYftKZCQg+xDhs(&c${f`eP%@GR&% zYp&3H9$ZYFmbte%GI5LyPEZW%KkyQ^c6Bq{;CSdc^sY>FnI^PnphvsVD8+YP!rrO1 z7rX53PSqPp9q(5CYE#F$brGetL#;|xAp2N((P7^4oTnsG<1SGCsvdW)XKPf)_Mr^~ z9|7OTy=lvjf##F;`mQ~iXt&SW4atxD#FC%E)-QiQK5YMR0>DX)TY@oK8N3$Q?QBc1 zgYIl11oI6-5>7;i9Nc%nF(^WOXHbR}v>$Bo`CZ(8H{H=JxWKa_7R)8&hTO@a!9SQp zDKe3YOB5r>+sMO_2Xc*0|2%oe$tZF*s(g$g=Sx+!c*y`b*wU8VZ6s0d@s@Gtj51Q= z%45DsQWA2GoK(3Xk3Pyec2bZ=e|piKuJok0%~ne<$gUFU$VCbyl9x>Ef)$go3u$s( zRIlKjKp7@HqrH#4WYIUfDR)^ibeDFgdn;|3E4=fansxs>EUlRr5*W)4jt(|2#$9WCn7W&*nd_`OT*og<0oLem-gagLsyr6;{ORbNiOD8wYMH%Mme zna{12*~}1kX$mbkP=>A=p$Nqp=vQy=irOXDIR&Xlk8kSa-^KaJAI(LVpBDyL|N7X+ zzT#vXJgcbm;kkE?|6_goT%0Kz~$ zzrleY=z#(efFt+;C1`?yrEsD(A?wD1l=fhY)q!~>U_SSAB@!$ZSRcbxS}PJ-sAXC_ zvV)@4gR1p|M0i?7a)iDW001}uPS}J`h=MAFLXTu24o4-n^-Ng8TRP%{UjkfXQYJ#^ zT-dc->;+xxC0%H!UCnh}+hvAoXkBSoUD?Hi0l)wO;DmQ*hm+!6IQNI*HHT%GB;0Xc zB?4!pLSE2?F7m}I8UMCl|MgyuIAQZOU=;R|@C=dexfY#T9#L*C3hhPc@VGO2Q zmK0&Q0$`A6L3UIwox_Ou_@lQG1WBsd8t$rdJ`W|Oj3ZQFJ};HGWf z20!*@mFWYORjHL%$q-K1lV3So6>~-ZGmRL7SpL&)(eZ8{)LQbUK;y%f_cn2JNpN); zLU-wJNko@zxp8?}K`4la%V>;y$cHNEB>O~mRU&?lr*V8qLl(Cbm@_{8wnIF}awX?- zLNGQh;B#MK(v2A4!eFwsWG{IU+(Lg?J-E z$C*_Zb-$T*g=BTZ37mdpoW&`eNQazWIf4xE0mq1u8z~%4vJ#n*10CZWHy4exDII5* zb%9hWZ2u=BZU>$y(RsfVcb=!7>3MgSCwP9ROYbS4fhRS_Sdq+#pR7qdl0i(C5fow9 zn6xF0D+O#^LwV>)c$jBo=*3NySD&o6PP}(|6PkJe$t5H~Lk_Vc8R}*jN^t_kp;^I% z#<-t(sG3rEPxVAkU>9*_>7oTn699#J#8*(6=O>>dHL$l%(}x#53VqEdeNodM*CZD+ z;#f3O7DsAbqoYAnn_*MlW_(O_ zfBnaQ?k7}h0VEjprYjPs5e26bC8v2or}9{sf|;WCgegM71K1gMVrO%dBAYOnD{Wd- zVE^@iV-rqro#^Qr5ysh^jhs!5{2Q*+C)s;WwM zXsK>57>zHOg9HLua3*g!SXY)hhDpdJ#Fbh|m?`(tGxGvO!`fMXG7-lLB*`kQo3$d% zT8zlpiN#2m%$OvH!K!74g*I_pi>X`H!mGa}BEcnwU08%}*oK1mhGfXDF$F71qfM{( zK$;3i^XeP*YAdQjucKgfM7yy43xihU(okpSAAS#y>I znqvf-wb$wR4y4E4O2++Bos{o<9xv5LKrmLYO3b=rKtyvnYhRc{<^in+0yE<{Xn%g-x zcx0giymRA}rIwU38I$y8x6gxNAj&<^>%7w2yk%6qC5WH+S&zf^YYld&EdNCzzH2Fh zij=w|YsjW1%GQ)HxjS5$mDmQq^_D*D(zzX=00N-^_lv))5dij!zy7jS#a2)5Gn@O5eq?r+A5ca#jtZ`Pa+rm0b#$gP)GhD`Eyc+-* z#6KLw11Kq6gs2AVQd#l?KQItXoW)#RMmD&cX=FgRnVfL9oXXjBhySb^V0^}+Q5uar z#*Zw?YP=ha{JN6N70(%fLCnJfh=*Xe!7qy~r`WrB`~yjl%1#^rNzlZIyvUjINuMK1 zP?yLLx}NR{p}CC9b}PxZfhtXv$vGL!WBgjZ?8|)%0-G#=%p8CW(2+wtpeuX0v?
^k$@ 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 Lkp73%)%@Q8H5|>U literal 0 HcmV?d00001 diff --git a/docs/tutorials/img/namebox/pokenav.gif b/docs/tutorials/img/namebox/pokenav.gif new file mode 100644 index 0000000000000000000000000000000000000000..6de3f1370d5ff80c3a7d6c22164af86783a38d5d GIT binary patch literal 802936 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

}ql6_kPLtpwgBU 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

a03HTwlnx<^fOdNnQ70t>*O!bVIuqg1Z(< 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 nwFUq5lX>*crs;*B7!sp&AS%zGzpv+2j>V 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 N4p1EbuTUI({}0~D+l~ML literal 0 HcmV?d00001 diff --git a/graphics/pokenav/name_box.png b/graphics/pokenav/name_box.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2ed7036b60727c085473ebe3de1b0cbd92928c GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^5nSEXv2gQu&X J%Q~loCIFUVR@(po literal 0 HcmV?d00001 diff --git a/include/config/overworld.h b/include/config/overworld.h index 480c5dbcea..15e7e6d3d8 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -110,6 +110,7 @@ #define OW_FLAG_NO_TRAINER_SEE 0 // If this flag is set, trainers will not battle the player unless they're talked to. #define OW_FLAG_NO_COLLISION 0 // If this flag is set, the player will be able to walk over tiles with collision. Mainly intended for debugging purposes. #define OW_FLAG_POKE_RIDER 0 // If this flag is set, the player will be able to use fly from the Pokenav Region Map and the Town Map key item by pressing 'R' on a city/location they are able to fly to. +#define OW_FLAG_SUPPRESS_NAME_BOX 0 // If this flag is set, any namebox (whether its from a macro or a code) will not show up until this flag is unset. #define BATTLE_PYRAMID_RANDOM_ENCOUNTERS FALSE // If set to TRUE, battle pyramid Pokemon will be generated randomly based on the round's challenge instead of hardcoded in src/data/battle_frontier/battle_pyramid_level_50_wild_mons.h (or open_level_wild_mons.h) @@ -142,4 +143,15 @@ // Berry Blender #define BERRY_BLENDER_THROW_ALL_BERRIES_AT_ONCE TRUE // This is a small little addition, that basically speeds up the animation where all players' berries are thrown into the blender. Self-explanatory I hope! +// Namebox Speaker configs +#define OW_NAME_BOX_USE_DYNAMIC_WIDTH TRUE // When TRUE, the namebox window can use different width depending on the length of the speaker's name. +#define OW_NAME_BOX_NPC_TRAINER FALSE // When TRUE, any approaching NPC trainers will have a namebox shown automagically. The name will be taken from their trainer data. +#define OW_NAME_BOX_DEFAULT_WIDTH 8 // Maximum width of what OW_NAME_BOX_USE_DYNAMIC_WIDTH can set. Also the default width when the config above is set to FALSE (or the dynamic width exceeds this value). +#define OW_NAME_BOX_DEFAULT_HEIGHT 2 // Maximum height of the namebox window. + +// Text colors of Namebox. The numbers corresponds to the palette index. +// The BG color is not provided as it always needs to be 0. +#define OW_NAME_BOX_FOREGROUND_COLOR 1 +#define OW_NAME_BOX_SHADOW_COLOR 2 + #endif // GUARD_CONFIG_OVERWORLD_H diff --git a/include/constants/characters.h b/include/constants/characters.h index 6ac3c5224c..0af7b110f0 100644 --- a/include/constants/characters.h +++ b/include/constants/characters.h @@ -232,6 +232,7 @@ #define EXT_CTRL_CODE_ENG 0x16 #define EXT_CTRL_CODE_PAUSE_MUSIC 0x17 #define EXT_CTRL_CODE_RESUME_MUSIC 0x18 +#define EXT_CTRL_CODE_SPEAKER 0x19 #define TEXT_COLOR_TRANSPARENT 0x0 #define TEXT_COLOR_WHITE 0x1 diff --git a/include/constants/speaker_names.h b/include/constants/speaker_names.h new file mode 100644 index 0000000000..1f4f399e75 --- /dev/null +++ b/include/constants/speaker_names.h @@ -0,0 +1,11 @@ +#ifndef GUARD_CONSTANTS_SPEAKER_NAMES_H +#define GUARD_CONSTANTS_SPEAKER_NAMES_H + +enum SpeakerNames { + SP_NAME_NONE = 0, + SP_NAME_MOM, + SP_NAME_PLAYER, + SP_NAME_COUNT +}; + +#endif // GUARD_CONSTANTS_SPEAKER_NAMES_H diff --git a/include/field_name_box.h b/include/field_name_box.h new file mode 100644 index 0000000000..7732fa3418 --- /dev/null +++ b/include/field_name_box.h @@ -0,0 +1,17 @@ +#ifndef GUARD_FIELD_NAME_BOX_H +#define GUARD_FIELD_NAME_BOX_H + +extern EWRAM_DATA const u8 *gSpeakerName; +extern const u8 *const gSpeakerNamesTable[]; + +void TrySpawnNamebox(void); +u32 GetNameboxWindowId(void); +void DestroyNamebox(void); +void FillNamebox(void); +void DrawNamebox(u32 windowId, bool32 copyToVram); +void ClearNamebox(u32 windowId, bool32 copyToVram); +void SetSpeakerName(const u8 *name); +u32 GetNameboxWidth(void); +void TrySpawnAndShowNamebox(const u8 *speaker); + +#endif // GUARD_FIELD_NAME_BOX_H diff --git a/include/match_call.h b/include/match_call.h index ed2cf506c5..468a977a13 100644 --- a/include/match_call.h +++ b/include/match_call.h @@ -19,5 +19,6 @@ void BufferPokedexRatingForMatchCall(u8 *destStr); bool32 SelectMatchCallMessage(int trainerId, u8 *str); void LoadMatchCallWindowGfx(u32 windowId, u32 destOffset, u32 paletteId); void DrawMatchCallTextBoxBorder(u32 windowId, u32 tileOffset, u32 paletteId); +void RedrawMatchCallTextBoxBorder(void); #endif //GUARD_MATCH_CALL_H diff --git a/include/menu.h b/include/menu.h index ca7f8d008c..fec38f40d3 100644 --- a/include/menu.h +++ b/include/menu.h @@ -135,5 +135,6 @@ u8 AddSecondaryPopUpWindow(void); u8 GetSecondaryPopUpWindowId(void); void RemoveSecondaryPopUpWindow(void); void HBlankCB_DoublePopupWindow(void); +void RedrawDialogueFrame(void); #endif // GUARD_MENU_H diff --git a/src/battle_setup.c b/src/battle_setup.c index 01e95d45a1..39499fe179 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -42,6 +42,7 @@ #include "data.h" #include "vs_seeker.h" #include "item.h" +#include "field_name_box.h" #include "constants/battle_frontier.h" #include "constants/battle_setup.h" #include "constants/event_objects.h" @@ -1488,9 +1489,19 @@ static const u8 *ReturnEmptyStringIfNull(const u8 *string) static const u8 *GetIntroSpeechOfApproachingTrainer(void) { if (gApproachingTrainerId == 0) + { + if (OW_NAME_BOX_NPC_TRAINER) + gSpeakerName = GetTrainerNameFromId(TRAINER_BATTLE_PARAM.opponentA); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextA); + } else + { + if (OW_NAME_BOX_NPC_TRAINER) + gSpeakerName = GetTrainerNameFromId(TRAINER_BATTLE_PARAM.opponentB); + return ReturnEmptyStringIfNull(TRAINER_BATTLE_PARAM.introTextB); + } } const u8 *GetTrainerALoseText(void) diff --git a/src/data/speaker_names.h b/src/data/speaker_names.h new file mode 100644 index 0000000000..7f0ca56ca7 --- /dev/null +++ b/src/data/speaker_names.h @@ -0,0 +1,5 @@ +const u8 *const gSpeakerNamesTable[SP_NAME_COUNT] = +{ + [SP_NAME_MOM] = COMPOUND_STRING("MOM"), + [SP_NAME_PLAYER] = COMPOUND_STRING("{PLAYER}"), +}; diff --git a/src/field_message_box.c b/src/field_message_box.c index bf9ce1aa93..7a8d4bed10 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -7,6 +7,7 @@ #include "field_message_box.h" #include "text_window.h" #include "script.h" +#include "field_name_box.h" static EWRAM_DATA u8 sFieldMessageBoxMode = 0; EWRAM_DATA u8 gWalkAwayFromSignpostTimer = 0; @@ -39,9 +40,12 @@ static void Task_DrawFieldMessage(u8 taskId) task->tState++; break; case 1: - DrawDialogueFrame(0, TRUE); - task->tState++; - break; + u32 nameboxWinId = GetNameboxWindowId(); + DrawDialogueFrame(0, TRUE); + if (nameboxWinId != WINDOW_NONE) + DrawNamebox(nameboxWinId, TRUE); + task->tState++; + break; case 2: if (RunTextPrintersAndIsPrinter0Active() != TRUE) { @@ -123,6 +127,7 @@ bool8 ShowFieldMessageFromBuffer(void) static void ExpandStringAndStartDrawFieldMessage(const u8 *str, bool32 allowSkippingDelayWithButtonPress) { + TrySpawnNamebox(); StringExpandPlaceholders(gStringVar4, str); AddTextPrinterForMessage(allowSkippingDelayWithButtonPress); CreateTask_DrawFieldMessage(); @@ -138,6 +143,7 @@ void HideFieldMessageBox(void) { DestroyTask_DrawFieldMessage(); ClearDialogWindowAndFrame(0, TRUE); + DestroyNamebox(); sFieldMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; } diff --git a/src/field_name_box.c b/src/field_name_box.c new file mode 100644 index 0000000000..709dc4546f --- /dev/null +++ b/src/field_name_box.c @@ -0,0 +1,194 @@ +#include "global.h" +#include "main.h" +#include "menu.h" +#include "bg.h" +#include "window.h" +#include "text.h" +#include "string_util.h" +#include "international_string_util.h" +#include "script_menu.h" +#include "field_message_box.h" +#include "graphics.h" +#include "script.h" +#include "field_name_box.h" +#include "event_data.h" +#include "match_call.h" +#include "malloc.h" +#include "constants/speaker_names.h" +#include "data/speaker_names.h" + +#define NAME_BOX_BASE_TILE_TOTAL (6) +#define NAME_BOX_BASE_TILE_NUM (0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT) - NAME_BOX_BASE_TILE_TOTAL) + +static EWRAM_INIT u8 sNameboxWindowId = WINDOW_NONE; +EWRAM_DATA const u8 *gSpeakerName = NULL; + +static const u32 sNameBoxDefaultGfx[] = INCBIN_U32("graphics/text_window/name_box.4bpp"); +static const u32 sNameBoxPokenavGfx[] = INCBIN_U32("graphics/pokenav/name_box.4bpp"); + +static void WindowFunc_DrawNamebox(u8, u8, u8, u8, u8, u8); +static void WindowFunc_ClearNamebox(u8, u8, u8, u8, u8, u8); + +void TrySpawnNamebox(void) +{ + u8 *strbuf = AllocZeroed(32 * sizeof(u8)); + if ((OW_FLAG_SUPPRESS_NAME_BOX != 0 && FlagGet(OW_FLAG_SUPPRESS_NAME_BOX)) || gSpeakerName == NULL || !strbuf) + { + // Re-check again in case anything but !strbuf is TRUE. + if (strbuf) + Free(strbuf); + + DestroyNamebox(); + return; + } + + StringExpandPlaceholders(strbuf, gSpeakerName); + + u32 fontId = FONT_SMALL; + u32 winWidth = OW_NAME_BOX_DEFAULT_WIDTH; + + if (OW_NAME_BOX_USE_DYNAMIC_WIDTH) + { + winWidth = ConvertPixelWidthToTileWidth(GetStringWidth(fontId, strbuf, -1)); + if (winWidth > OW_NAME_BOX_DEFAULT_WIDTH) + winWidth = OW_NAME_BOX_DEFAULT_WIDTH; + } + + if (sNameboxWindowId != WINDOW_NONE) + { + DestroyNamebox(); + RedrawDialogueFrame(); + } + + bool32 matchCall = IsMatchCallTaskActive(); + + struct WindowTemplate template = + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 13, + .width = winWidth, + .height = OW_NAME_BOX_DEFAULT_HEIGHT, + .paletteNum = matchCall ? 14 : DLG_WINDOW_PALETTE_NUM, + .baseBlock = 0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT), + }; + + sNameboxWindowId = AddWindow(&template); + FillNamebox(); + + u8 colors[3] = {TEXT_COLOR_TRANSPARENT, OW_NAME_BOX_FOREGROUND_COLOR, OW_NAME_BOX_SHADOW_COLOR}; + u8 bakColors[3]; + int strX = GetStringCenterAlignXOffset(fontId, strbuf, (winWidth * 8)); + if (matchCall) + { + colors[1] = 1; + colors[2] = 0; + } + + SaveTextColors(&bakColors[0], &bakColors[1], &bakColors[2]); + AddTextPrinterParameterized3(sNameboxWindowId, fontId, strX, 0, colors, 0, strbuf); + RestoreTextColors(&bakColors[0], &bakColors[1], &bakColors[2]); + PutWindowTilemap(sNameboxWindowId); + Free(strbuf); +} + +u32 GetNameboxWindowId(void) +{ + return sNameboxWindowId; +} + +void DestroyNamebox(void) +{ + if (sNameboxWindowId == WINDOW_NONE) + return; + + ClearNamebox(sNameboxWindowId, TRUE); + ClearWindowTilemap(sNameboxWindowId); + RemoveWindow(sNameboxWindowId); + sNameboxWindowId = WINDOW_NONE; + gSpeakerName = NULL; +} + +u32 GetNameboxWidth(void) +{ + return gWindows[sNameboxWindowId].window.width; +} + +static const u32 *GetNameboxGraphics(void) +{ + if (IsMatchCallTaskActive()) + return sNameBoxPokenavGfx; + else + return sNameBoxDefaultGfx; +} + +void FillNamebox(void) +{ + u32 winSize = GetNameboxWidth(); + const u32 *gfx = GetNameboxGraphics(); + + for (u32 i = 0; i < winSize; i++) + { + #define TILE(x) (8 * x) + CopyToWindowPixelBuffer(sNameboxWindowId, &gfx[TILE(1)], TILE_SIZE_4BPP, i); + CopyToWindowPixelBuffer(sNameboxWindowId, &gfx[TILE(4)], TILE_SIZE_4BPP, i + winSize); + #undef TILE + } +} + +void DrawNamebox(u32 windowId, bool32 copyToVram) +{ + LoadBgTiles(GetWindowAttribute(sNameboxWindowId, WINDOW_BG), GetNameboxGraphics(), 0x0C0, NAME_BOX_BASE_TILE_NUM); + CallWindowFunction(windowId, WindowFunc_DrawNamebox); + PutWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, COPYWIN_FULL); +} + +void ClearNamebox(u32 windowId, bool32 copyToVram) +{ + CallWindowFunction(windowId, WindowFunc_ClearNamebox); + ClearWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, COPYWIN_FULL); +} + +static void WindowFunc_DrawNamebox(u8 bg, u8 L, u8 T, u8 w, u8 h, u8 p) +{ + // left-most + FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM, L - 1, T, 1, 1, p); + FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 3, L - 1, T + 1, 1, 1, p); + + // right-most + FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 2, L + w, T, 1, 1, p); + FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 5, L + w, T + 1, 1, 1, p); +} + +static void WindowFunc_ClearNamebox(u8 bg, u8 L, u8 T, u8 w, u8 h, u8 p) +{ + FillBgTilemapBufferRect(bg, 0, L - 1, T, w + 2, h, 0); // palette doesn't matter +} + +void SetSpeaker(struct ScriptContext *ctx) +{ + u32 arg = ScriptReadWord(ctx); + const u8 *speaker = NULL; + + if (arg < SP_NAME_COUNT) + speaker = gSpeakerNamesTable[arg]; + else if (arg >= ROM_START && arg < ROM_END) + speaker = (const u8 *)arg; + + gSpeakerName = speaker; +} + +// useful for other context e.g. match call +void TrySpawnAndShowNamebox(const u8 *speaker) +{ + gSpeakerName = speaker; + TrySpawnNamebox(); + if (sNameboxWindowId != WINDOW_NONE) + DrawNamebox(sNameboxWindowId, TRUE); + else // either NULL or SP_NAME_NONE + RedrawDialogueFrame(); +} diff --git a/src/match_call.c b/src/match_call.c index 221714de0e..e828dac999 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -27,6 +27,7 @@ #include "task.h" #include "wild_encounter.h" #include "window.h" +#include "field_name_box.h" #include "constants/abilities.h" #include "constants/battle_frontier.h" #include "constants/event_objects.h" @@ -1321,9 +1322,11 @@ static bool32 MatchCall_PrintIntro(u8 taskId) { FillWindowPixelBuffer(tWindowId, PIXEL_FILL(8)); - // Ready the message + // Ready the message (and the speaker's name if possible) if (!sMatchCallState.triggeredFromScript) SelectMatchCallMessage(sMatchCallState.trainerId, gStringVar4); + + TrySpawnAndShowNamebox(gSpeakerName); InitMatchCallTextPrinter(tWindowId, gStringVar4); return TRUE; } @@ -1348,9 +1351,9 @@ static bool32 MatchCall_PrintMessage(u8 taskId) static bool32 MatchCall_SlideWindowOut(u8 taskId) { s16 *data = gTasks[taskId].data; - if (ChangeBgY(0, 0x600, BG_COORD_SUB) <= -0x2000) + if (ChangeBgY(0, 0x600, BG_COORD_SUB) <= -0x4000) { - FillBgTilemapBufferRect_Palette0(0, 0, 0, 14, 30, 6); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 12, 30, 8); DestroyTask(tIconTaskId); RemoveWindow(tWindowId); CopyBgTilemapBufferToVram(0); @@ -1404,6 +1407,31 @@ static void DrawMatchCallTextBoxBorder_Internal(u32 windowId, u32 tileOffset, u3 FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 7), x + width, y + height, 1, 1); } +static u8 GetMatchCallWindowId(void) +{ + if (!IsMatchCallTaskActive()) + return WINDOW_NONE; + + u32 taskId = FindTaskIdByFunc(ExecuteMatchCall); + return gTasks[taskId].tWindowId; +} + +// redraw only the top-half +void RedrawMatchCallTextBoxBorder(void) +{ + u32 windowId = GetMatchCallWindowId(); + u32 bg = GetWindowAttribute(windowId, WINDOW_BG); + u32 x = GetWindowAttribute(windowId, WINDOW_TILEMAP_LEFT); + u32 y = GetWindowAttribute(windowId, WINDOW_TILEMAP_TOP); + u32 width = GetWindowAttribute(windowId, WINDOW_WIDTH); + u32 tileNum = TILE_MC_WINDOW + GetBgAttribute(bg, BG_ATTR_BASETILE); + u32 paletteId = 14; + + FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 0), x - 1, y - 1, 1, 1); + FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 1), x, y - 1, width, 1); + FillBgTilemapBufferRect_Palette0(bg, ((paletteId << 12) & 0xF000) | (tileNum + 2), x + width, y - 1, 1, 1); +} + static void InitMatchCallTextPrinter(int windowId, const u8 *str) { struct TextPrinterTemplate printerTemplate; diff --git a/src/menu.c b/src/menu.c index 48bbc01dc9..b771635de4 100644 --- a/src/menu.c +++ b/src/menu.c @@ -22,6 +22,7 @@ #include "task.h" #include "text_window.h" #include "window.h" +#include "match_call.h" #include "config/overworld.h" #include "constants/songs.h" @@ -341,6 +342,53 @@ void DrawDialogueFrame(u8 windowId, bool8 copyToVram) CopyWindowToVram(windowId, COPYWIN_FULL); } +static void WindowFunc_RedrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) +{ + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 1, + tilemapLeft - 2, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 3, + tilemapLeft - 1, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 4, + tilemapLeft, + tilemapTop - 1, + width - 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 5, + tilemapLeft + width - 1, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, + DLG_WINDOW_BASE_TILE_NUM + 6, + tilemapLeft + width, + tilemapTop - 1, + 1, + 1, + DLG_WINDOW_PALETTE_NUM); +} + +void RedrawDialogueFrame(void) +{ + if (IsMatchCallTaskActive()) + RedrawMatchCallTextBoxBorder(); + else + CallWindowFunction(0, WindowFunc_RedrawDialogueFrame); +} + void DrawStdWindowFrame(u8 windowId, bool8 copyToVram) { CallWindowFunction(windowId, WindowFunc_DrawStandardFrame); diff --git a/src/string_util.c b/src/string_util.c index fd4a0861ee..fe8b6fa592 100644 --- a/src/string_util.c +++ b/src/string_util.c @@ -706,6 +706,7 @@ u8 GetExtCtrlCodeLength(u8 code) [EXT_CTRL_CODE_ENG] = 1, [EXT_CTRL_CODE_PAUSE_MUSIC] = 1, [EXT_CTRL_CODE_RESUME_MUSIC] = 1, + [EXT_CTRL_CODE_SPEAKER] = 1, }; u8 length = 0; diff --git a/src/text.c b/src/text.c index 8166b35302..be19272fe5 100644 --- a/src/text.c +++ b/src/text.c @@ -12,6 +12,8 @@ #include "menu.h" #include "dynamic_placeholder_text_util.h" #include "fonts.h" +#include "field_name_box.h" +#include "constants/speaker_names.h" static u16 RenderText(struct TextPrinter *); static u32 RenderFont(struct TextPrinter *); @@ -1228,6 +1230,13 @@ static u16 RenderText(struct TextPrinter *textPrinter) case EXT_CTRL_CODE_ENG: textPrinter->japanese = FALSE; return RENDER_REPEAT; + case EXT_CTRL_CODE_SPEAKER: + { + enum SpeakerNames name = *textPrinter->printerTemplate.currentChar++; + TrySpawnAndShowNamebox(gSpeakerNamesTable[name]); + + return RENDER_REPEAT; + } } break; case CHAR_PROMPT_CLEAR: @@ -1418,6 +1427,7 @@ static u32 UNUSED GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 lett case EXT_CTRL_CODE_SKIP: case EXT_CTRL_CODE_CLEAR_TO: case EXT_CTRL_CODE_MIN_LETTER_SPACING: + case EXT_CTRL_CODE_SPEAKER: ++strPos; break; case EXT_CTRL_CODE_RESET_FONT: @@ -1566,6 +1576,7 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) case EXT_CTRL_CODE_ESCAPE: case EXT_CTRL_CODE_SHIFT_RIGHT: case EXT_CTRL_CODE_SHIFT_DOWN: + case EXT_CTRL_CODE_SPEAKER: ++str; break; case EXT_CTRL_CODE_FONT: @@ -1735,6 +1746,7 @@ u8 RenderTextHandleBold(u8 *pixels, u8 fontId, u8 *str) case EXT_CTRL_CODE_SKIP: case EXT_CTRL_CODE_CLEAR_TO: case EXT_CTRL_CODE_MIN_LETTER_SPACING: + case EXT_CTRL_CODE_SPEAKER: ++strPos; break; case EXT_CTRL_CODE_RESET_FONT: From 4822d946675564e505a76ed80d0f98ec870c03e0 Mon Sep 17 00:00:00 2001 From: Eva <105788407+purrfectdoodle@users.noreply.github.com> Date: Tue, 16 Sep 2025 13:04:17 +0200 Subject: [PATCH 038/183] Nickit & Thievul visual revamp (#7689) --- graphics/pokemon/nickit/front.png | Bin 647 -> 4711 bytes graphics/pokemon/nickit/normal.pal | 8 ++--- graphics/pokemon/nickit/overworld.png | Bin 671 -> 600 bytes graphics/pokemon/nickit/overworld_normal.pal | 26 +++++++-------- graphics/pokemon/nickit/overworld_shiny.pal | 30 +++++++++--------- graphics/pokemon/thievul/back.png | Bin 669 -> 599 bytes graphics/pokemon/thievul/front.png | Bin 828 -> 772 bytes graphics/pokemon/thievul/normal.pal | 16 +++++----- graphics/pokemon/thievul/overworld.png | Bin 940 -> 796 bytes graphics/pokemon/thievul/overworld_normal.pal | 26 +++++++-------- graphics/pokemon/thievul/overworld_shiny.pal | 30 +++++++++--------- graphics/pokemon/thievul/shiny.pal | 8 ++--- 12 files changed, 72 insertions(+), 72 deletions(-) diff --git a/graphics/pokemon/nickit/front.png b/graphics/pokemon/nickit/front.png index 9aba8f113ca416ae1f420fc251b88a01c479c7e9..6bcf9854fc1121731f89a16fcd427f21519aa89c 100644 GIT binary patch literal 4711 zcmeHKdsGuw8XtTt2*QDSq^?pKBltKv$xI%Ej06KDNQ%J}SPHrb!^|Yil9!o*1Rsc0 z5k<5L_*xZVZHr}9tkwt8ipN)N-J@M;MWHlB>ef|Ji*;>P+&cjgc6-hq&)NP*ax#za z{=VP+zTf@6dve$46Xy7OkN1Wk$X6SuP6T%q{~IwJTvO+m?t~7$C@b-K>xDI|F+)K3Ti0XxMz`dh<8b^7>2PzQtS#o3+MEVo*gtDQN%h zt0-+zr>3;>H4hB?Fix7#9FSBI;CUvrSsuA#*ov&ShcWUh+h}l5$LDC%->EL|)sy;NVu_RncFO_Ui7H6OV*7l0RB5%?~tLFTvYtv268C zv8Ssb#HQI4u&k>LAjo4S6BDD?#>Bix2_&*( z*+ymDX;skKjHFUQrC*+Zz(xJeJ2itIu01~pLVHBh50^Y}9SgqKrR-|=h^{-Ad`RS1yPc*sjlwcg$3Dpj zXbO)mIW-kann%CR-Ve(7*Zl`S2|qv7c?wsk>ASx*HjIK9t|8g72>?(g~c)K*n zquT81XsEler0IJ<^v6B%#hq~l+oSi6Xsr5DKDO|?1(~+L-Q9O+!xc|>PCD`}sv7A5fJ#>wP~1(Duxgq& zfq70M%bLq61p+V*zlhIl)9L!@Eo`3(Ko60Vu!%4sDl(fz13g$ylLtup0{T@CHW_rP zD3NBZxptD)S>_kP|%=oh)W!2qSx;c6?H%ZH~`D+T=gIAtXn3U@zd8N#S6 z8HOTRv^*S09BoZ+qCKWO=T!xWSdDZ|bt%cHyO}XO) zT)jhNHeoT+VE^bV*cW!@SBgPO(X?0^4oXRZWg${hCPoNSf+7Z5j*+B+kQ>7PgPpY+ zI0s>;ql`dDpcN=kw^s19zNMNzI2uPb&94KH3_)ec0LcWRzGOxGj`1Sf2+@D(5#a_5 z*kXWRuMKQnU?&vyZ-sq&@te+X_~~1R-*5&%Jv7NH={qFXkX)~%z$<}=s%uEDS5n}W zz(dvbf0N7mys3$KNkGwTy$=P$kXDCLf+s_2u$TCS!nvGd-! zu%r0qbhe@AeUG1)bsNT+mbAx5%xD?YP!*K15E))jk^Z}y&Zv3mP;hXe5L)LN?tmgw z;i9_h3!rr?CX|##bqpKk3Or{2X&h8Px3$7j$ohtq`P}!`zj^fX{`BWH`esdiVuC8* ztq}(*>!NFO8&;hg)i$mW+Bx>qw9NRjoD&b57f}Bg)^*EfTytQ3mF{rxW@yT&zlXZ^ zwTa(__fGJ5?*=#eqhFRxV4A{yzkP4+Ke>df%X^+RYc3j#Z|EDCkN@mf5cFy5S-rNd ze8)vf^G4(B#@2H2t@K&A>o1z>@+0*pKiDaLH0$=H2VV*vtCr1cIoe!v0hzN}Tc(+5u&92|e!3*HBvS?aUJcb_Ei=++z` z*NsXv*WZ_(SbF-BLSh%*3{CBs(w!El&iBwRYTvWv^@uNIQ1l7UErsL6lNtpFJJL!U z)TZm+HIIw3eN#8KEKK)I_S!Wwqou2Dixck|p5OWIbJ>0MG`>`{ngsR!=**&j1NZaG AdjJ3c delta 622 zcmV-!0+IdaB!>l%B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP0000mP)t-sn9!go zC?G&UFc1(Bh(Itv7!bfv7}(h0hpG;7LS5R7l6|l(BD{Koo}$oqyQF5w$Z1N>+SlM_CJx zQ^!gM$7@`8&fLLn*C`7K!YK0bb64)&4%%hiRs7ax9HjRT%Y z&jTXf&l49Abq5J9K-z&PBM0Eg77+3}XCr_WxPjOToB-bg*RGBP$dojffCyXwQ?jZ? zDiBa%Z7Vo|3V#ttIx?T;_$Uh}u&@9Mn7gj<&;pNGIOg64H!ae*fLHw85#P=O0`X}S z2n@<(4EStTfix?Fbq7?GBfvM=+aDqKC4KwU@QCp7_U-TU4Ys%GcMqlRUu{v#U)vw; zBG-4=0YzW1%5JweYtqu`jcyeH?+Rs}@L8^3v8n9rdw<>m?+SjmUXycEVhL70Bdo4_ z0OJc96{aa00IXqJq9H^7ujMn)_cJrsV3Pxo;Q009nk`@S6b?X}!OP*l?AI-j(IFcG zy91FYnM{%_VuL*VECIgmrjXMnNZPG*ocnDF%N-T90Aw;80(@7RrH*pQ1sO6a^^lkr zIAW;1@Y{IIs-G=B{nHf-3iVZ(;~g%Q1e z_%1(f#PsX_ZGPG)&umvz!E1T;X(rdk7QiC-1q!&7hdw@zgHsd;3AmP@)gK-rf*;eh zoI+qLyB01!$*m#aLN2QlD6oTzQ%bA7k{st@N4TWLW>$MfU}zH;Cr!)ZZv~U|dA1{5 zqQH1;8y6>H4}YPIs?g&n5^#a{mC@J^-kfN?bK?6-;34<8W`%b9lzVY`X0-e|_~E5w zPCVPawpHHXn|;j7?y$^~BR{GdxRru!(t7wextX1mpiT`gw4~Ws5(>SRB*gm!A8ty@ zigWC7lV}Hp`f1VOl?>xYB8nqRvJfa=6yLbu1)@oF zjq5IjGb`6R>QJbD(ooHVHu+LdFe@a2-8$t)4C{A=LQvn7J85rdxZYAzV$#qbj`TV> zzEqUpR74u~PPf$jJ5st$pzk@J>WzIF9$tHo64>XiCb$LYSvNtbuRA_aIZqoZ&L*=kXz4t^k+-|6X|o^+BCn#VlmF^~TxD*lG)zk4!(W|~a)Dh;+U zvKp_*^8=G`K+4H#mB|Hw^S5-F&;gYd zg92jLI{FMUlKx8^)Y3gEpzv2;4rzlO-{%jJvauui-P%r6fRopcwvG4>P1&uuD}N95*%n3YEVZ~&H>*1IJ$vln zJt#bB3Inc^guV7NYLGPhnT6VB{g|H0UW{%L%D?z{@kWm)c&o}r8-pUguIiGN_0aZ~ z7(KTr9_-8hxgU1WFst4v{FWrFScFrWFoqeTSF)I73YY0{#O@El`Ma{w5PK~od$ir= zU_Kj{+ker(g5kSl#j6NiobP?@#`(fKZ+`E<^WBc%XUp+ZcDiT&^?G5-x62c4Yc(3U zdC)S|k}lkKSb$SrG{JnlU+ya${zLWdI*t>k_{XnoF2WRgW#zhFG=NdhbRIk43J_t* tw^Nfp@Ju5_OFgd19?wQJ#x(!;Hy~#o{q)QXstf=C002ovPDHLkV1jwFIf?)P diff --git a/graphics/pokemon/nickit/overworld_normal.pal b/graphics/pokemon/nickit/overworld_normal.pal index faa146c087..ff8c34acea 100644 --- a/graphics/pokemon/nickit/overworld_normal.pal +++ b/graphics/pokemon/nickit/overworld_normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -255 0 25 +128 196 156 8 8 7 -0 0 0 52 51 48 -21 20 18 -121 53 31 -185 90 59 -36 14 7 -255 255 255 -210 184 61 +91 41 25 92 92 92 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +136 59 35 +185 90 59 +210 184 61 +159 147 159 +223 218 223 +255 255 255 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/nickit/overworld_shiny.pal b/graphics/pokemon/nickit/overworld_shiny.pal index 50a8845599..7327a9c8b6 100644 --- a/graphics/pokemon/nickit/overworld_shiny.pal +++ b/graphics/pokemon/nickit/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -0 0 24 -0 0 0 -8 41 115 -0 16 74 -115 106 98 -164 148 139 -24 24 24 +128 196 156 +8 8 7 +51 76 95 +82 75 73 +92 92 92 +122 112 109 +167 154 149 +210 184 61 +159 147 159 +223 218 223 255 255 255 -213 189 57 -90 90 90 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/thievul/back.png b/graphics/pokemon/thievul/back.png index 7658e0ec228532d035659b2d295a130825c42cb2..10b145f4ea79c92c1cfb105506d98d308bd83a0f 100644 GIT binary patch delta 568 zcmV-80>}NG1=j?S7&!<70001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!glNo@{3 zZ4eL;SWr+XC?KeynB?T-ue86BVHJOLC-|=b000nlQchC<|NsC0|NsC0|NsC0|NsBM zP>VwV00Fs4L_t(og}s*9vcn(o1`0=zB%oghB4~K2 zAypuI0Uldx{>PbrV3Z3G0W90yAYcVGIJ5G(%cfEYJPdpZ>h{O2fmXahP%=P#C2(a4 zjCdAk&No>!%TNm3l|WXMM&N&L1Umkk04Yp@{2=WL1;4N6FF(==+`hnzGN4AlhNgx# zqo6jlgV1KAt6{8SKYuDmVOj^Lg8SPG0W0cEDmudDO3a}Vj7%d`B{02|jtxrS-SeGw zs(^ud(ka^Fl)!M`daPlYfFb5_HwxxCve!nEaMJaRHwmD}b8~cyYC}4NdH4I4 zPO)hP>D*ylE~!mxkK3OX_q^F8+Nsz!O$r_EyS^GXMGA?>1NZ&O8lMgMa$W<&D2Q7$ z@blFma@_HL!S{m@<4p}MkGSA5u;DTVSkMEH%PvDt3$r?cKq)G<>V$aCi>WpOd1PaJZo}kJLnQxk)En5SO zRj2$IS#qWT%=DHBXzLMUC9ox`b5J5bOV&jK8UcA(1y%VjcBpUfPQR3I)MXB3&& z?Vto##EE}n?iekWs}5xlTX#g>1XVjtV9)>@nQhV33O0(rl)NDPgxeaZJWJpl%a=C9 zFerXrOn`d~bUQ=F0$(1*%`=k6Ofbe))I;1pnoD>pXZoLa_xNrs=;ku-==b{Wb$-TD zBxAO!F9*1pJj^esa#r3R0F#%q-ve~sslnys_Yy050Eqf}Ieoe?8m#7`Zjj$j-pGFy ZAz#+z9b9#Aq{9FJ002ovPDHLkV1l@F8_56w diff --git a/graphics/pokemon/thievul/front.png b/graphics/pokemon/thievul/front.png index 447aeaf02bbcb6814713859e7b962979ed6e0830..941b0b9a2a153789de96f30a16bf4889a1f3ab01 100644 GIT binary patch delta 760 zcmVc0004VQb$4nuFf3k0000mP)t-sn9!goC?G&U zFc1(Bh(JC-7!bj1LD<;fpOc@(lmGw#00000000000000000000*z?*k0000GbW%=J z0RR90|NsC0|NsC0|NsC0z)*`r0007JNkl(0f;LAdX;AYGMzB#PXJH#V#;@rq<_S(giKiUBOrLJf2EY8)d70_l7PD*dJF^ukjtO&{}ljM;}nBnOx7s) zH9$NQ+SCU^5V11mjMP*Ydz1by$C?=gQ%FX*-fG#Flhm`-{YJ1v67;F)aa3a<*lCv) zcSqa+7V}*m;rbmh@0_AfIj#t;Alv7*O=MQGW@w7IQHt2dF>=9E#;x^js6KBSrX2(Wd}9pH~WOn@==Sb~nI1h}~hpb~UAm`ZTy zpCxHn$$!-WM(MIp5?Esa!mt+CNGa%H0bL|4^Jx&H-TFE;B?*uRZ=rk2D z5vG-L0I=sfwf5FzJ3zdB)+LU6as#0ISjrt>ZQ3uSS+Rv3%R!aGW`Rp9>wtD{B>xDq zt<|>2{vsrQxlM!tz^ZnDZ%yBzCxA2ux1LWcAvMkb8Kcj+EP!24 z1F+=M#^U6&0h$1H`Zm@;lYAveslYOGot4|Sw7;vw^`>43Qa(`D)b9WrX5Xdmki6bQ qPyFTs>9(}m;kr$;P5c+XDgFVHu^IQishB4K0000Ia?h(Ivd*x=ZR0I;CAP)JY!00000 z00000jZ75g00009a7bBm000id000id0mpBsWB>pHl}SWFRDVdv<&@2C(?Af%*IInb zA#0Z+jvj|daI&*a8bl9}xDm&qHdZ+nJFA?LKpeP4h-lB1pjdqZ&KwE~FHq&Bm>qw_ zEpqw*ox{qz^P8Ff?v9t;A8X&?w|p~-I{@J}0}cX~H{Jq3z?_}!faOI&qrdGunZDTq zSe`Xe&dxSKD1Wt00*6Pt;%vS}WACXr-&Kp|bJ&N+u)A>lM&S4yz%ysjV75Ma_WV8g zM~%Sg+w-3Q!`r}vD0*2C*+=O4`s>ZGX{=OAMBDzPRMNi*7&lsKzO7hw&eTjVYc-~- zFiLUU>3LJB)vO}y(ywM_$|ZlX`n^=(nWhproK}F!gMV6=s~_rJM~#FK0K(S#HjriC zX*vR9L%ksq0{GM|qy4ftA1SpZ*3Aghw5m_n8tnJ2jf1k#ECkY+VMiKV%s))f+Q z4WNtVlwqC&7ujVAOi;wQ0+y74?O*))R>sG;-!v#|65S4 z20)#OjDJm)3Yh2HWb*F{9W#~eMPn0J0lEN~TpM5<*c*UutOA()fcZZ&JBkJcV0JOr zn@;U3b+Ez=CIwZFZvmJwSQ{Xccvr#yK&+D1FUC%y=xAsFk}%(BXveDG3UYvJT+h3z z0xVCdJ<}X^bjS!8(Cz8hMGXr?LI6KGWNe5nK7SZZ@Z|JPDZ+u!rOgQ(`>0_6T{W64 z#0K!`og*N87_dF)q|kj;10(?<4Y=F`7(qwWfFRreu6b9C)d1hbaY+j`pnO&=Y%?q$ zQUvMf8NXKp0%?Fynm-Kz4i5Q?62bxr(nX&s;9=A95D7PQNfX99zI4lU1TgM%FW@eP vFe>2ze#t^Grw<-5^vQBbHow&O!WjDp2JiC^_|{QM00000NkvXXu0mjfg7swz diff --git a/graphics/pokemon/thievul/normal.pal b/graphics/pokemon/thievul/normal.pal index 3f3b4bf6d1..74565685e7 100644 --- a/graphics/pokemon/thievul/normal.pal +++ b/graphics/pokemon/thievul/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -24 24 16 40 40 32 +64 64 48 16 16 16 -104 56 48 +136 64 62 64 24 16 -192 80 24 -136 120 136 -136 64 48 +193 108 65 216 216 224 -216 136 0 -176 160 184 -80 72 80 +159 147 159 +197 148 0 +0 0 0 +0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/thievul/overworld.png b/graphics/pokemon/thievul/overworld.png index c835302471590213b2bb7dd54ba74c9a83d344cc..53cf0b5b0e93e5ffd993f4a432d2f13556a7aef6 100644 GIT binary patch delta 785 zcmV+s1Md8+2b>0w7=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sfW({#2nRGX zFk2}ZTwGj;J0rPTJJPs4pOc^8+TZ{G|Nj60{{R60009300RI30Hu(oJ0000GbW%=J z0RR90|NsC0|NsC0|NsC0z)*`r0007hNklRtice~r~G@}0DpK}K28#wo%=J##R)cn55iI@ipC%AMW zpC1|UN&a*Fxeq-E_WLL&!UN~{>_pi?Fon2$e|B1mYUE2l9B;EZmm)CSZjh^48d#k) z$EGsCmjT!sb05gagM-oYBjUI*EmV!h^^7xmu<(xnoNz*0|vmC#x#g1^QU^ z99J_9G=DFC*2W=Fu2V!O#dF(C5_^+gf53y2jdFdE)bExH2L@>1xRi@_VvIWM0NrT41L4u-&Nwk(aN|5c zD4|{#Y9v4D!1|5`2GV>yHsBN(_UQB@1E!a@ai5=zKmP}>iWENo|LqSqToUu-piRpF P015yANkvXXu0mjfx(9k~ delta 930 zcmV;T16}-_2CN5=7=Hu<0002CwraKj001yhOjJeg{{RRG2Q)J<0001aH6Ile61iGC zBn}7v|NqjsJzQK|u&}TI000000000000004MF!ab00TEkL_t(|+U=H2PZL2H$Ddsm z77)vBQ7{PD_GA#SfCupfi)mtFjGR1~s9ylXK@z`&i5~zH;(x`9;!9#Y7^GsNiJ`E( zBsGDyLXZ|?*|s6lQg+v6x4ZMqLXADk9=7?-Gdurz=K0S|0S=$T=RbMG(#+Zoj6ioN zgBdqHK4w$Et9KSXq_s@OAt##x6(TSVs7IO1It18#0!+6ccHX%oH;MPnJrS#f2Ct}= zfVPtt;JKX3VP3C>J=VM#LFTu97-A>RC$|xgXn9ir5*yds-VWp~0h2vnh%G&$np=S! zVp!mtjDHCv5@IgzHf;IeYql{-n6Gvx;+$D(aa?nAX;S(<#>SAB87(j;Bd)x}EfpdB za7Go<;$43BGV=m4msL~6eW18Hx*Bw{o;?-`f)W&t1wZ*Q3&%f5_P+K+2gG0^>@gFu zcplU_lQ}{g8 zSwehN8O)*#b!G|H3S3|}1Z+%8Q5;Q6)=@F!1GY6lzBd@{{-MQ6BVWWwJ`Wz?f&o=d zNff8TU}vD`J6cCR32i-wWnAO{qs34HA)TWETVnwr25o_9$-(5X8+#802A}8!D1^oc zkAEqeDr3P3P0iSG Date: Tue, 16 Sep 2025 18:00:30 +0200 Subject: [PATCH 039/183] Attackcanceller fixes and improvements (#7698) --- asm/macros/battle_script.inc | 45 +- data/battle_scripts_1.s | 98 +-- docs/tutorials/how_to_new_move.md | 15 +- include/battle.h | 6 +- include/battle_ai_util.h | 3 +- include/battle_dynamax.h | 1 - include/battle_scripts.h | 10 +- include/battle_terastal.h | 2 +- include/battle_util.h | 18 +- include/constants/battle.h | 3 +- include/constants/battle_string_ids.h | 17 - src/battle_ai_main.c | 19 +- src/battle_ai_util.c | 31 +- src/battle_dynamax.c | 15 - src/battle_main.c | 2 + src/battle_message.c | 17 +- src/battle_script_commands.c | 336 +++----- src/battle_terastal.c | 21 +- src/battle_util.c | 738 +++++++++++------- src/data/battle_move_effects.h | 14 +- test/battle/ability/dazzling.c | 22 + test/battle/ability/teraform_zero.c | 1 + test/battle/gimmick/dynamax.c | 15 +- test/battle/gimmick/zmove.c | 2 +- test/battle/move_effect/aurora_veil.c | 29 + test/battle/move_effect/clangorous_soul.c | 55 +- .../battle/move_effect/fail_if_not_arg_type.c | 1 - test/battle/move_effect/no_retreat.c | 57 ++ test/battle/move_effect/psychic_terrain.c | 38 +- test/battle/move_effect/stockpile.c | 6 +- 30 files changed, 860 insertions(+), 777 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 0a50ce49d0..afbd257d21 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -724,14 +724,12 @@ .byte \mode .endm - .macro trysetrest failInstr:req + .macro trysetrest .byte 0x81 - .4byte \failInstr .endm - .macro jumpifnotfirstturn jumpInstr:req + .macro unused_0x82 .byte 0x82 - .4byte \jumpInstr .endm .macro unused_0x83 @@ -748,9 +746,8 @@ .byte \id .endm - .macro stockpiletobasedamage failInstr:req + .macro stockpiletobasedamage .byte 0x86 - .4byte \failInstr .endm .macro stockpiletohpheal failInstr:req @@ -1045,9 +1042,8 @@ .byte 0xc2 .endm - .macro trysetfutureattack failInstr:req + .macro setfutureattack .byte 0xc3 - .4byte \failInstr .endm .macro trydobeatup endInstr, failInstr @@ -1224,10 +1220,8 @@ .4byte \jumpInstr .endm - .macro jumpifnotcurrentmoveargtype battler:req, failInstr:req + .macro unused_0xE4 .byte 0xe4 - .byte \battler - .4byte \failInstr .endm .macro pickup @@ -1378,12 +1372,6 @@ .4byte \failInstr .endm - .macro jumpifcantfling battler:req, jumpInstr:req - callnative BS_JumpIfCantFling - .byte \battler - .4byte \jumpInstr - .endm - .macro itemstatchangeeffects battler:req callnative BS_RunStatChangeItems .byte \battler @@ -1438,10 +1426,6 @@ .4byte \failInstr .endm - .macro setglaiverush - callnative BS_SetGlaiveRush - .endm - .macro setpledge jumpInstr:req callnative BS_SetPledge .4byte \jumpInstr @@ -2179,11 +2163,6 @@ .4byte \failInstr .endm - .macro suckerpunchcheck failInstr:req - callnative BS_SuckerPunchCheck - .4byte \failInstr - .endm - .macro setsimplebeam failInstr:req callnative BS_SetSimpleBeam .4byte \failInstr @@ -2218,11 +2197,6 @@ .byte \case_ .endm - .macro trylastresort failInstr:req - callnative BS_TryLastResort - .4byte \failInstr - .endm - .macro tryautotomize failInstr:req callnative BS_TryAutotomize .4byte \failInstr @@ -2411,13 +2385,8 @@ .4byte \failInstr .endm - .macro checkpoltergeist failInstr:req - callnative BS_CheckPoltergeist - .4byte \failInstr - .endm - - .macro trynoretreat failInstr:req - callnative BS_TryNoRetreat + .macro setpoltergeistmessage failInstr:req + callnative BS_SetPoltergeistMessage .4byte \failInstr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1a7e91193f..645481bedd 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -210,7 +210,7 @@ BattleScript_EffectDoodleMoveEnd: BattleScript_EffectGlaiveRush:: call BattleScript_EffectHit_Ret jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TryFaintMon - setglaiverush + setvolatile BS_ATTACKER, VOLATILE_GLAIVE_RUSH, 2 goto BattleScript_TryFaintMon BattleScript_SyrupBombActivates:: @@ -685,7 +685,6 @@ BattleScript_SkyDropFlyingAlreadyConfused: BattleScript_EffectFling:: attackcanceler - jumpifcantfling BS_ATTACKER, BattleScript_ButItFailed setlastuseditem BS_ATTACKER accuracycheck BattleScript_FlingMissed, ACC_CURR_MOVE pause B_WAIT_TIME_SHORT @@ -776,11 +775,6 @@ BattleScript_FlingMissed: removeitem BS_ATTACKER goto BattleScript_MoveMissedPause -BattleScript_EffectAuraWheel:: @ Aura Wheel can only be used by Morpeko - jumpifspecies SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectHit - jumpifspecies SPECIES_MORPEKO_HANGRY, BattleScript_EffectHit - goto BattleScript_PokemonCantUseTheMove - BattleScript_EffectClangorousSoul:: attackcanceler cutonethirdhpandraisestats BattleScript_ButItFailed @@ -819,7 +813,7 @@ BattleScript_OctlockTurnDmgEnd: BattleScript_EffectPoltergeist:: attackcanceler accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - checkpoltergeist BattleScript_ButItFailed + setpoltergeistmessage BattleScript_ButItFailed printstring STRINGID_ABOUTTOUSEPOLTERGEIST waitmessage B_WAIT_TIME_LONG goto BattleScript_HitFromCritCalc @@ -844,7 +838,8 @@ BattleScript_TryTarShot: BattleScript_EffectNoRetreat:: attackcanceler accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - trynoretreat BattleScript_ButItFailed + jumpifvolatile BS_TARGET, VOLATILE_NO_RETREAT, BattleScript_ButItFailed + setvolatile BS_TARGET, VOLATILE_NO_RETREAT attackanimation waitanimation call BattleScript_AllStatsUp @@ -901,7 +896,6 @@ BattleScript_MoveEffectLightScreen:: BattleScript_EffectStuffCheeks:: attackcanceler - jumpifnotberry BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation setbyte sBERRY_OVERRIDE, 1 @@ -1049,12 +1043,6 @@ BattleScript_EffectFairyLock:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_FailIfNotArgType:: - attackcanceler - jumpifnotcurrentmoveargtype BS_ATTACKER, BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc - BattleScript_RemoveFireType:: printstring STRINGID_ATTACKERLOSTFIRETYPE waitmessage B_WAIT_TIME_LONG @@ -1747,12 +1735,6 @@ BattleScript_ShellSmashTrySpeed: BattleScript_ShellSmashEnd: goto BattleScript_MoveEnd -BattleScript_EffectLastResort:: - attackcanceler - trylastresort BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc - BattleScript_EffectGrowth:: attackcanceler jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_GrowthDoMoveAnim @@ -2064,12 +2046,6 @@ BattleScript_EffectSimpleBeam:: tryendneutralizinggas goto BattleScript_MoveEnd -BattleScript_EffectSuckerPunch:: - attackcanceler - suckerpunchcheck BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromAtkString - BattleScript_EffectLuckyChant:: attackcanceler setluckychant BattleScript_ButItFailed @@ -2577,7 +2553,7 @@ BattleScript_AbilityProtectsDoesntAffect:: setmoveresultflags MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_InsomniaProtects: +BattleScript_InsomniaProtects:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSTAYEDAWAKEUSING @@ -2866,16 +2842,10 @@ BattleScript_EffectLightScreen:: BattleScript_EffectRest:: attackcanceler - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_RestIsAlreadyAsleep - jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_RestIsAlreadyAsleep - jumpifuproarwakes BattleScript_RestCantSleep - jumpifability BS_TARGET, ABILITY_INSOMNIA, BattleScript_InsomniaProtects - jumpifability BS_TARGET, ABILITY_VITAL_SPIRIT, BattleScript_InsomniaProtects - jumpifability BS_ATTACKER, ABILITY_PURIFYING_SALT, BattleScript_InsomniaProtects .if B_LEAF_GUARD_PREVENTS_REST >= GEN_5 jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardPreventsRest .endif - trysetrest BattleScript_AlreadyAtFullHp + trysetrest pause B_WAIT_TIME_SHORT printfromtable gRestUsedStringIds waitmessage B_WAIT_TIME_LONG @@ -3288,10 +3258,6 @@ BattleScript_EffectPainSplit:: BattleScript_EffectSnore:: attackcanceler - jumpifability BS_ATTACKER, ABILITY_COMATOSE, BattleScript_SnoreIsAsleep - jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_SnoreIsAsleep - goto BattleScript_ButItFailed -BattleScript_SnoreIsAsleep:: jumpifhalfword CMP_EQUAL, gChosenMove, MOVE_SLEEP_TALK, BattleScript_DoSnore printstring STRINGID_PKMNFASTASLEEP waitmessage B_WAIT_TIME_LONG @@ -3331,7 +3297,7 @@ BattleScript_EffectSketch:: BattleScript_EffectDestinyBond:: attackcanceler - trysetdestinybond BattleScript_ButItFailed + setvolatile BS_ATTACKER, VOLATILE_DESTINY_BOND, 2 attackanimation waitanimation printstring STRINGID_PKMNTRYINGTOTAKEFOE @@ -3463,15 +3429,9 @@ BattleScript_DoGhostCurse:: tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectMatBlock:: - attackcanceler - jumpifnotfirstturn BattleScript_ButItFailed - goto BattleScript_ProtectLikeAttack - BattleScript_EffectProtect:: BattleScript_EffectEndure:: attackcanceler -BattleScript_ProtectLikeAttack: setprotectlike attackanimation waitanimation @@ -3785,7 +3745,7 @@ BattleScript_EffectMirrorCoat:: BattleScript_EffectFutureSight:: attackcanceler - trysetfutureattack BattleScript_ButItFailed + setfutureattack attackanimation waitanimation printfromtable gFutureMoveUsedStringIds @@ -3880,11 +3840,6 @@ BattleScript_AlreadyAtFullHp:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectFirstTurnOnly:: - attackcanceler - jumpifnotfirstturn BattleScript_ButItFailed - goto BattleScript_EffectHit - BattleScript_FailedFromAtkCanceler:: attackcanceler BattleScript_ButItFailed:: @@ -3920,7 +3875,7 @@ BattleScript_EffectStockpile:: stockpile 0 attackanimation waitanimation - printfromtable gStockpileUsedStringIds + printstring STRINGID_PKMNSTOCKPILED waitmessage B_WAIT_TIME_LONG .if B_STOCKPILE_RAISES_DEFS < GEN_4 goto BattleScript_EffectStockpileEnd @@ -3965,29 +3920,22 @@ BattleScript_EffectSpitUp:: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE damagecalc adjustdamage - stockpiletobasedamage BattleScript_SpitUpFail + stockpiletobasedamage call BattleScript_Hit_RetFromAtkAnimation tryfaintmon BS_TARGET removestockpilecounters - goto BattleScript_SpitUpEnd -BattleScript_SpitUpFail:: - checkparentalbondcounter 2, BattleScript_SpitUpEnd - pause B_WAIT_TIME_SHORT - printstring STRINGID_FAILEDTOSPITUP - waitmessage B_WAIT_TIME_LONG -BattleScript_SpitUpEnd: goto BattleScript_MoveEnd BattleScript_SpitUpFailProtect:: pause B_WAIT_TIME_LONG - stockpiletobasedamage BattleScript_SpitUpFail + stockpiletobasedamage resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectSwallow:: attackcanceler - stockpiletohpheal BattleScript_SwallowFail + stockpiletohpheal BattleScript_ButItFailed attackanimation waitanimation orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE @@ -3998,13 +3946,6 @@ BattleScript_EffectSwallow:: removestockpilecounters goto BattleScript_MoveEnd - -BattleScript_SwallowFail:: - pause B_WAIT_TIME_SHORT - printfromtable gSwallowFailStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - BattleScript_EffectHail:: attackcanceler call BattleScript_CheckPrimalWeather @@ -4112,9 +4053,6 @@ BattleScript_EffectFocusPunch:: BattleScript_EffectFollowMe:: attackcanceler - .if B_UPDATED_MOVE_DATA >= GEN_8 - jumpifnotbattletype BATTLE_TYPE_DOUBLE, BattleScript_ButItFailed - .endif setforcedtarget attackanimation waitanimation @@ -4324,7 +4262,8 @@ BattleScript_EffectRefresh:: BattleScript_EffectGrudge:: attackcanceler - trysetvolatile BS_ATTACKER, VOLATILE_GRUDGE, BattleScript_ButItFailed + jumpifvolatile BS_ATTACKER, VOLATILE_GRUDGE, BattleScript_ButItFailed + setvolatile BS_ATTACKER, VOLATILE_GRUDGE, 2 attackanimation waitanimation printstring STRINGID_PKMNWANTSGRUDGE @@ -7246,8 +7185,10 @@ BattleScript_DazzlingProtected:: goto BattleScript_MoveEnd BattleScript_MoveUsedPsychicTerrainPrevents:: - printstring STRINGID_POKEMONCANNOTUSEMOVE + pause B_WAIT_TIME_SHORT + printstring STRINGID_PSYCHICTERRAINPREVENTS waitmessage B_WAIT_TIME_LONG + setmoveresultflags MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd BattleScript_GrassyTerrainHeals:: @@ -8396,11 +8337,6 @@ BattleScript_TryFaint: tryfaintmon BS_TARGET goto BattleScript_MoveEnd -BattleScript_EffectSteelRoller:: - attackcanceler - jumpifhalfword CMP_NO_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_ButItFailed - goto BattleScript_HitFromAccCheck - BattleScript_RemoveTerrain:: removeterrain playanimation BS_ATTACKER, B_ANIM_RESTORE_BG diff --git a/docs/tutorials/how_to_new_move.md b/docs/tutorials/how_to_new_move.md index 0262ca3202..0f7ca1d15c 100644 --- a/docs/tutorials/how_to_new_move.md +++ b/docs/tutorials/how_to_new_move.md @@ -93,14 +93,21 @@ Contains more fundamental functions that control the flow of the battle. Functio ### data/battle_scripts_1.s Each move's effect is governed by a script defined here. For a simple example, let's look at the script for Fake Out/First Impression: +TODO: New Script ``` -BattleScript_EffectFirstTurnOnly:: +BattleScript_EffectTaunt:: attackcanceler - jumpifnotfirstturn BattleScript_ButItFailed - goto BattleScript_EffectHit + jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects + accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + settaunt BattleScript_ButItFailed + attackanimation + waitanimation + printstring STRINGID_PKMNFELLFORTAUNT + waitmessage B_WAIT_TIME_LONG + goto BattleScript_MoveEnd ``` -`attackcanceler` is a command that covers all the cases that could cause a move to fail before it's even attempted (e.g. paralysis). And as we can tell from the commands, if it's not the first turn, we go to `BattleScript_ButItFailed` which evidently causes us to print the `attackstring` ("POKEMON used MOVE") then fail ("But it failed!"). Otherwise, we go to the generic "hit" effect which is the same script for moves that just deal damage and nothing else. +`attackcanceler` is a command that covers all cases that could cause a move to fail before it's even attempted (e.g. paralysis). The next command is a jump command. A jump command can check anything and usually comes with a jump instruction. Usually it jumps to a place from where the move should pick up because of certain conditions. The next one is an accuracy check. Accuracy checks happen after all prior move failure checks happened. The next set of commands are unique to a certain move, they are mostly the same for damaging moves but can widely differ for status moves. Lastly there is `BattleScript_MoveEnd` which the move after a succesful hit. An ability activation or specific move effect like Burn, Freeze, Absorb etc. This is the most advanced part of the ROM. There are dozens upon dozens of commands and hundreds of scripts so this guide would go on forever if I were to go into more detail. To learn how these scripts work, it's best to look at a few examples of moves you know. diff --git a/include/battle.h b/include/battle.h index bf3cb78c47..3af2efc504 100644 --- a/include/battle.h +++ b/include/battle.h @@ -113,7 +113,6 @@ struct DisableStruct u8 usedMoves:4; u8 truantCounter:1; u8 truantSwitchInHack:1; - u8 noRetreat:1; u8 tarShot:1; u8 octolock:1; u8 cudChew:1; @@ -123,6 +122,7 @@ struct DisableStruct u8 usedProteanLibero:1; u8 flashFireBoosted:1; u8 boosterEnergyActivated:1; + u8 padding1:1; u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) u8 roostActive:1; u8 unburdenActive:1; @@ -130,9 +130,9 @@ struct DisableStruct u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case u8 unnerveActivated:1; // Unnerve and As One (Unnerve part) activate only once per switch in u8 hazardsDone:1; - u8 padding1:1; + u8 padding2:1; u8 octolockedBy:3; - u8 padding2:5; + u8 padding3:5; }; // Fully Cleared each turn after end turn effects are done. A few things are cleared before end turn effects diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 02e34961c8..b2e191c17f 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -155,6 +155,7 @@ u32 CountPositiveStatStages(u32 battlerId); u32 CountNegativeStatStages(u32 battlerId); // move checks +bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category); enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); @@ -312,7 +313,7 @@ bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); #define AI_EFFECT_TERRAIN (1 << 1) #define AI_EFFECT_CLEAR_HAZARDS (1 << 2) #define AI_EFFECT_BREAK_SCREENS (1 << 3) -#define AI_EFFECT_RESET_STATS (1 << 4) +#define AI_EFFECT_RESET_STATS (1 << 4) #define AI_EFFECT_FORCE_SWITCH (1 << 5) #define AI_EFFECT_TORMENT (1 << 6) #define AI_EFFECT_LIGHT_SCREEN (1 << 7) diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index ed295bb1e6..03dfef96a3 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -11,7 +11,6 @@ u16 GetNonDynamaxHP(u32 battler); u16 GetNonDynamaxMaxHP(u32 battler); void UndoDynamax(u32 battler); bool32 IsMoveBlockedByMaxGuard(u32 move); -bool32 IsMoveBlockedByDynamax(u32 move); u16 GetMaxMove(u32 battler, u32 baseMove); u32 GetMaxMovePower(u32 move); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index dc64b88e07..18c30b6cc8 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -332,7 +332,6 @@ extern const u8 BattleScript_MistySurgeActivates[]; extern const u8 BattleScript_ElectricSurgeActivates[]; extern const u8 BattleScript_EffectSpectralThief[]; extern const u8 BattleScript_EffectLifeDew[]; -extern const u8 BattleScript_EffectSteelRoller[]; extern const u8 BattleScript_AbilityRaisesDefenderStat[]; extern const u8 BattleScript_PowderMoveNoEffect[]; extern const u8 BattleScript_GrassyTerrainHeals[]; @@ -597,6 +596,8 @@ extern const u8 BattleScript_EffectConversion[]; extern const u8 BattleScript_EffectRestoreHp[]; extern const u8 BattleScript_EffectLightScreen[]; extern const u8 BattleScript_EffectRest[]; +extern const u8 BattleScript_RestIsAlreadyAsleep[]; +extern const u8 BattleScript_InsomniaProtects[]; extern const u8 BattleScript_EffectOHKO[]; extern const u8 BattleScript_EffectHealBlock[]; extern const u8 BattleScript_RecoilIfMiss[]; @@ -677,7 +678,6 @@ extern const u8 BattleScript_EffectBeatUp[]; extern const u8 BattleScript_EffectSemiInvulnerable[]; extern const u8 BattleScript_EffectDefenseCurl[]; extern const u8 BattleScript_EffectSoftboiled[]; -extern const u8 BattleScript_EffectFirstTurnOnly[]; extern const u8 BattleScript_EffectStockpile[]; extern const u8 BattleScript_EffectSpitUp[]; extern const u8 BattleScript_EffectSwallow[]; @@ -742,7 +742,6 @@ extern const u8 BattleScript_EffectGuardSplit[]; extern const u8 BattleScript_EffectStickyWeb[]; extern const u8 BattleScript_EffectMetalBurst[]; extern const u8 BattleScript_EffectLuckyChant[]; -extern const u8 BattleScript_EffectSuckerPunch[]; extern const u8 BattleScript_EffectSimpleBeam[]; extern const u8 BattleScript_EffectEntrainment[]; extern const u8 BattleScript_EffectHealPulse[]; @@ -761,7 +760,6 @@ extern const u8 BattleScript_EffectElectrify[]; extern const u8 BattleScript_EffectReflectType[]; extern const u8 BattleScript_EffectSoak[]; extern const u8 BattleScript_EffectGrowth[]; -extern const u8 BattleScript_EffectLastResort[]; extern const u8 BattleScript_EffectShellSmash[]; extern const u8 BattleScript_EffectShiftGear[]; extern const u8 BattleScript_EffectDefenseUp3[]; @@ -790,14 +788,12 @@ extern const u8 BattleScript_EffectAcupressure[]; extern const u8 BattleScript_EffectAromaticMist[]; extern const u8 BattleScript_EffectPowder[]; extern const u8 BattleScript_EffectPartingShot[]; -extern const u8 BattleScript_EffectMatBlock[]; extern const u8 BattleScript_EffectInstruct[]; extern const u8 BattleScript_EffectLaserFocus[]; extern const u8 BattleScript_EffectMagneticFlux[]; extern const u8 BattleScript_EffectGearUp[]; extern const u8 BattleScript_EffectStrengthSap[]; extern const u8 BattleScript_EffectPurify[]; -extern const u8 BattleScript_FailIfNotArgType[]; extern const u8 BattleScript_EffectShoreUp[]; extern const u8 BattleScript_EffectGeomancy[]; extern const u8 BattleScript_EffectFairyLock[]; @@ -814,7 +810,6 @@ extern const u8 BattleScript_MoveEffectLeechSeed[]; extern const u8 BattleScript_MoveEffectHaze[]; extern const u8 BattleScript_MoveEffectIonDeluge[]; extern const u8 BattleScript_EffectHyperspaceFury[]; -extern const u8 BattleScript_EffectAuraWheel[]; extern const u8 BattleScript_EffectNoRetreat[]; extern const u8 BattleScript_EffectTarShot[]; extern const u8 BattleScript_EffectPoltergeist[]; @@ -855,5 +850,6 @@ extern const u8 BattleScript_SubmoveAttackstring[]; extern const u8 BattleScript_MetronomeAttackstring[]; extern const u8 BattleScript_SleepTalkAttackstring[]; extern const u8 BattleScript_NaturePowerAttackstring[]; +extern const u8 BattleScript_PokemonCantUseTheMove[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/battle_terastal.h b/include/battle_terastal.h index 6b5c385463..9c55a49d70 100644 --- a/include/battle_terastal.h +++ b/include/battle_terastal.h @@ -7,7 +7,7 @@ bool32 CanTerastallize(u32 battler); u32 GetBattlerTeraType(u32 battler); void ExpendTypeStellarBoost(u32 battler, u32 type); bool32 IsTypeStellarBoosted(u32 battler, u32 type); -uq4_12_t GetTeraMultiplier(u32 battler, u32 type); +uq4_12_t GetTeraMultiplier(struct DamageContext *ctx); u16 GetTeraTypeRGB(u32 type); diff --git a/include/battle_util.h b/include/battle_util.h index a1eea3b770..b9652c1caf 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -105,7 +105,7 @@ struct TypePower enum MoveSuccessOrder { - CANCELLER_FLAGS, + CANCELLER_CLEAR_FLAGS, CANCELLER_STANCE_CHANGE_1, CANCELLER_SKY_DROP, CANCELLER_RECHARGE, @@ -130,10 +130,10 @@ enum MoveSuccessOrder CANCELLER_ATTACKSTRING, CANCELLER_PPDEDUCTION, CANCELLER_WEATHER_PRIMAL, - CANCELLER_DYNAMAX_BLOCKED, + CANCELLER_MOVE_FAILURE, CANCELLER_POWDER_STATUS, + CANCELLER_PRIORITY_BLOCK, CANCELLER_PROTEAN, - CANCELLER_PSYCHIC_TERRAIN, CANCELLER_EXPLODING_DAMP, CANCELLER_MULTIHIT_MOVES, CANCELLER_MULTI_TARGET_MOVES, @@ -180,6 +180,15 @@ struct DamageContext enum ItemHoldEffect holdEffectDef:16; }; +struct BattleContext +{ + u32 battlerAtk:3; + u32 battlerDef:3; + u32 currentMove:16; + enum BattleMoveEffects moveEffect:10; + u16 ability[MAX_BATTLERS_COUNT]; +}; + enum SleepClauseBlock { NOT_BLOCKED_BY_SLEEP_CLAUSE, @@ -242,7 +251,7 @@ bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck); u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); -enum MoveCanceller AtkCanceller_MoveSuccessOrder(void); +enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option); @@ -414,5 +423,6 @@ bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); u32 GetNaturePowerMove(u32 battler); u32 GetNaturePowerMove(u32 battler); void RemoveAbilityFlags(u32 battler); +bool32 IsDazzlingAbility(u32 ability); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 47fff193a6..45a74be518 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -162,7 +162,7 @@ enum VolatileFlags F(VOLATILE_RECHARGE, recharge, (u32, 1)) \ F(VOLATILE_RAGE, rage, (u32, 1)) \ F(VOLATILE_SUBSTITUTE, substitute, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_DESTINY_BOND, destinyBond, (u32, 1)) \ + F(VOLATILE_DESTINY_BOND, destinyBond, (u32, 2)) \ F(VOLATILE_ESCAPE_PREVENTION, escapePrevention, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_NIGHTMARE, nightmare, (u32, 1)) \ F(VOLATILE_CURSED, cursed, (u32, 1), V_BATON_PASSABLE) \ @@ -196,6 +196,7 @@ enum VolatileFlags F(VOLATILE_AQUA_RING, aquaRing, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_LASER_FOCUS, laserFocus, (u32, 1)) \ F(VOLATILE_POWER_TRICK, powerTrick, (u32, 1), V_BATON_PASSABLE) \ + F(VOLATILE_NO_RETREAT, noRetreat, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_VESSEL_OF_RUIN, vesselOfRuin, (u32, 1)) \ F(VOLATILE_SWORD_OF_RUIN, swordOfRuin, (u32, 1)) \ F(VOLATILE_TABLETS_OF_RUIN, tabletsOfRuin, (u32, 1)) \ diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 83175f285f..e37da539f9 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -113,7 +113,6 @@ enum StringID STRINGID_PKMNCALMEDDOWN, STRINGID_PKMNCANTSLEEPINUPROAR, STRINGID_PKMNSTOCKPILED, - STRINGID_PKMNCANTSTOCKPILE, STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE, STRINGID_PKMNSTAYEDAWAKEUSING, @@ -239,8 +238,6 @@ enum StringID STRINGID_STARTEDHAIL, STRINGID_HAILCONTINUES, STRINGID_HAILSTOPPED, - STRINGID_FAILEDTOSPITUP, - STRINGID_FAILEDTOSWALLOW, STRINGID_STATCHANGESGONE, STRINGID_COINSSCATTERED, STRINGID_TOOWEAKFORSUBSTITUTE, @@ -858,20 +855,6 @@ enum UproarOverTurnStringID B_MSG_UPROAR_ENDS, }; -// gStockpileUsedStringIds -enum StockpileUsedStringID -{ - B_MSG_STOCKPILED, - B_MSG_CANT_STOCKPILE, -}; - -// gSwallowFailStringIds -enum SwallowFailStringID -{ - B_MSG_SWALLOW_FAILED, - B_MSG_SWALLOW_FULL_HP, -}; - // gKOFailedStringIds enum KOFailedStringID { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index fb0e40bfd3..25971437bc 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1141,6 +1141,9 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // check non-user target if (!(moveTarget & MOVE_TARGET_USER)) { + if (Ai_IsPriorityBlocked(battlerAtk, battlerDef, move, aiData)) + return TRUE; + if (CanAbilityBlockMove(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) RETURN_SCORE_MINUS(20); @@ -2871,7 +2874,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_NO_RETREAT: - if (gDisableStructs[battlerAtk].noRetreat) + if (gBattleMons[battlerAtk].volatiles.noRetreat) ADJUST_SCORE(-10); break; case EFFECT_EXTREME_EVOBOOST: @@ -3106,7 +3109,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_HELPING_HAND: - if (!hasPartner + if (!hasPartner || !HasDamagingMove(battlerAtkPartner) || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove))) { @@ -3122,7 +3125,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (hasTwoOpponents) { // Might be about to die - if (CanTargetFaintAi(LEFT_FOE(battlerAtk), battlerAtk) && CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) + if (CanTargetFaintAi(LEFT_FOE(battlerAtk), battlerAtk) && CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) && AI_IsSlower(battlerAtk, LEFT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) && AI_IsSlower(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); @@ -3144,14 +3147,14 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (IsBattlerAlive(RIGHT_FOE(battlerAtk))) { // Might be about to die - if (CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) + if (CanTargetFaintAi(RIGHT_FOE(battlerAtk), battlerAtk) && AI_IsSlower(battlerAtk, RIGHT_FOE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) ADJUST_SCORE(GOOD_EFFECT); - } + } } break; case EFFECT_PERISH_SONG: @@ -3178,7 +3181,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_COACHING: - if (!hasPartner + if (!hasPartner || !HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)) { ADJUST_SCORE(WORST_EFFECT); @@ -5271,7 +5274,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(GOOD_EFFECT); // Set it for next pokemon in singles. else if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !hasPartner && (CountUsablePartyMons(battlerAtk) != 0)) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(DECENT_EFFECT); // Don't unset it on last turn. else if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != gBattleTurnCounter && ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); @@ -5406,7 +5409,7 @@ case EFFECT_GUARD_SPLIT: u32 partnerSpeed = aiData->speedStats[BATTLE_PARTNER(battlerAtk)]; u32 foe1Speed = aiData->speedStats[LEFT_FOE(battlerAtk)]; u32 foe2Speed = aiData->speedStats[RIGHT_FOE(battlerAtk)]; - + if (speed <= foe1Speed && (speed * 2) > foe1Speed) tailwindScore += 1; if (speed <= foe2Speed && (speed * 2) > foe2Speed) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index eac7e728b1..fc62eb907a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -501,11 +501,11 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) u32 GetTotalBaseStat(u32 species) { return GetSpeciesBaseHP(species) - + GetSpeciesBaseAttack(species) - + GetSpeciesBaseDefense(species) - + GetSpeciesBaseSpeed(species) - + GetSpeciesBaseSpAttack(species) - + GetSpeciesBaseSpDefense(species); + + GetSpeciesBaseAttack(species) + + GetSpeciesBaseDefense(species) + + GetSpeciesBaseSpeed(species) + + GetSpeciesBaseSpAttack(species) + + GetSpeciesBaseSpDefense(species); } bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) @@ -535,6 +535,24 @@ bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffe return TRUE; } +bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +{ + s32 atkPriority = GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move); + + if (atkPriority <= 0 || IsBattlerAlly(battlerAtk, battlerDef)) + return FALSE; + + if (IsMoldBreakerTypeAbility(battlerAtk, aiData->abilities[battlerAtk]) || MoveIgnoresTargetAbility(move)) + return FALSE; + + if (IsDazzlingAbility(aiData->abilities[battlerDef])) + return TRUE; + + if (IsDoubleBattle() && IsDazzlingAbility(aiData->abilities[BATTLE_PARTNER(battlerDef)])) + return TRUE; + + return FALSE; +} // This function checks if all physical/special moves are either unusable or unreasonable to use. // Consider a pokemon boosting their attack against a ghost pokemon having only normal-type physical attacks. bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category) @@ -630,6 +648,9 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) partnerDefAbility = aiData->abilities[BATTLE_PARTNER(ctx->battlerDef)]; } + if (Ai_IsPriorityBlocked(ctx->battlerAtk, ctx->battlerDef, ctx->move, aiData)) + return TRUE; + if (CanAbilityBlockMove(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, battlerDefAbility, ctx->move, AI_CHECK)) return TRUE; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index c6e91742e8..33a7d5ee28 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -234,21 +234,6 @@ bool32 IsMoveBlockedByMaxGuard(u32 move) return FALSE; } -// Weight-based moves (and some other moves in Raids) are blocked by Dynamax. -bool32 IsMoveBlockedByDynamax(u32 move) -{ - // TODO: Certain moves are banned in raids. - switch (GetMoveEffect(move)) - { - case EFFECT_HEAT_CRASH: - case EFFECT_LOW_KICK: - return TRUE; - default: - break; - } - return FALSE; -} - static u16 GetTypeBasedMaxMove(u32 battler, u32 type) { // Gigantamax check diff --git a/src/battle_main.c b/src/battle_main.c index 488a1e81f8..e7150694f1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4840,7 +4840,9 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) priority++; } else if (ability == ABILITY_TRIAGE && IsHealingMove(move)) + { priority += 3; + } if (gProtectStructs[battler].quash) priority = -8; diff --git a/src/battle_message.c b/src/battle_message.c index f3d804dec5..04414d602d 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -272,7 +272,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNCALMEDDOWN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} calmed down."), [STRINGID_PKMNCANTSLEEPINUPROAR] = COMPOUND_STRING("But {B_DEF_NAME_WITH_PREFIX2} can't sleep in an uproar!"), [STRINGID_PKMNSTOCKPILED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} stockpiled {B_BUFF1}!"), - [STRINGID_PKMNCANTSTOCKPILE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can't stockpile any more!"), //I think this was replaced with just "But it failed!" [STRINGID_PKMNCANTSLEEPINUPROAR2] = COMPOUND_STRING("But {B_DEF_NAME_WITH_PREFIX2} can't sleep in an uproar!"), [STRINGID_UPROARKEPTPKMNAWAKE] = COMPOUND_STRING("But the uproar kept {B_DEF_NAME_WITH_PREFIX2} awake!"), [STRINGID_PKMNSTAYEDAWAKEUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} stayed awake using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup @@ -398,8 +397,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_STARTEDHAIL] = COMPOUND_STRING("It started to hail!"), [STRINGID_HAILCONTINUES] = COMPOUND_STRING("The hail is crashing down."), [STRINGID_HAILSTOPPED] = COMPOUND_STRING("The hail stopped."), - [STRINGID_FAILEDTOSPITUP] = COMPOUND_STRING("But it failed to spit up a thing!"), //not in gen 5+, uses "but it failed" - [STRINGID_FAILEDTOSWALLOW] = COMPOUND_STRING("But it failed to swallow a thing!"), //not in gen 5+, uses "but it failed" [STRINGID_STATCHANGESGONE] = COMPOUND_STRING("All stat changes were eliminated!"), [STRINGID_COINSSCATTERED] = COMPOUND_STRING("Coins were scattered everywhere!"), [STRINGID_TOOWEAKFORSUBSTITUTE] = COMPOUND_STRING("But it does not have enough HP left to make a substitute!"), @@ -663,7 +660,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_MISTYTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounds itself with a protective mist!"), [STRINGID_GRASSYTERRAINHEALS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is healed by the grassy terrain!"), [STRINGID_ELECTRICTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounds itself with electrified terrain!"), - [STRINGID_PSYCHICTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounds itself with psychic terrain!"), + [STRINGID_PSYCHICTERRAINPREVENTS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is protected by the Psychic Terrain!"), [STRINGID_SAFETYGOGGLESPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is not affected thanks to its {B_LAST_ITEM}!"), [STRINGID_FLOWERVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} surrounded itself with a veil of petals!"), [STRINGID_SWEETVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} can't fall asleep due to a veil of sweetness!"), @@ -1073,24 +1070,12 @@ const u16 gUproarOverTurnStringIds[] = [B_MSG_UPROAR_ENDS] = STRINGID_PKMNCALMEDDOWN }; -const u16 gStockpileUsedStringIds[] = -{ - [B_MSG_STOCKPILED] = STRINGID_PKMNSTOCKPILED, - [B_MSG_CANT_STOCKPILE] = STRINGID_PKMNCANTSTOCKPILE, -}; - const u16 gWokeUpStringIds[] = { [B_MSG_WOKE_UP] = STRINGID_PKMNWOKEUP, [B_MSG_WOKE_UP_UPROAR] = STRINGID_PKMNWOKEUPINUPROAR }; -const u16 gSwallowFailStringIds[] = -{ - [B_MSG_SWALLOW_FAILED] = STRINGID_FAILEDTOSWALLOW, - [B_MSG_SWALLOW_FULL_HP] = STRINGID_PKMNHPFULL -}; - const u16 gUproarAwakeStringIds[] = { [B_MSG_CANT_SLEEP_UPROAR] = STRINGID_PKMNCANTSLEEPINUPROAR2, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3b2eeeb942..41976e1149 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -467,7 +467,7 @@ static void Cmd_setreflect(void); static void Cmd_setseeded(void); static void Cmd_manipulatedamage(void); static void Cmd_trysetrest(void); -static void Cmd_jumpifnotfirstturn(void); +static void Cmd_unused_0x82(void); static void Cmd_unused_0x83(void); static void Cmd_jumpifuproarwakes(void); static void Cmd_stockpile(void); @@ -507,7 +507,7 @@ static void Cmd_settypetorandomresistance(void); static void Cmd_setalwayshitflag(void); static void Cmd_copymovepermanently(void); static void Cmd_unused_0xA9(void); -static void Cmd_trysetdestinybond(void); +static void Cmd_unused_AA(void); static void Cmd_trysetdestinybondtohappen(void); static void Cmd_settailwind(void); static void Cmd_tryspiteppreduce(void); @@ -532,7 +532,7 @@ static void Cmd_unused_0xBF(void); static void Cmd_recoverbasedonsunlight(void); static void Cmd_setstickyweb(void); static void Cmd_selectfirstvalidtarget(void); -static void Cmd_trysetfutureattack(void); +static void Cmd_setfutureattack(void); static void Cmd_trydobeatup(void); static void Cmd_setsemiinvulnerablebit(void); static void Cmd_tryfiretwoturnmovenowbyeffect(void); @@ -565,7 +565,7 @@ static void Cmd_trysetsnatch(void); static void Cmd_unused2(void); static void Cmd_switchoutabilities(void); static void Cmd_jumpifhasnohp(void); -static void Cmd_jumpifnotcurrentmoveargtype(void); +static void Cmd_unused_0xE4(void); static void Cmd_pickup(void); static void Cmd_unused_0xE6(void); static void Cmd_unused_0xE7(void); @@ -726,7 +726,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setseeded, //0x7F Cmd_manipulatedamage, //0x80 Cmd_trysetrest, //0x81 - Cmd_jumpifnotfirstturn, //0x82 + Cmd_unused_0x82, //0x82 Cmd_unused_0x83, //0x83 Cmd_jumpifuproarwakes, //0x84 Cmd_stockpile, //0x85 @@ -766,7 +766,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setalwayshitflag, //0xA7 Cmd_copymovepermanently, //0xA8 Cmd_unused_0xA9, //0xA9 - Cmd_trysetdestinybond, //0xAA + Cmd_unused_AA, //0xAA Cmd_trysetdestinybondtohappen, //0xAB Cmd_settailwind, //0xAC Cmd_tryspiteppreduce, //0xAD @@ -791,7 +791,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_recoverbasedonsunlight, //0xC0 Cmd_setstickyweb, //0xC1 Cmd_selectfirstvalidtarget, //0xC2 - Cmd_trysetfutureattack, //0xC3 + Cmd_setfutureattack, //0xC3 Cmd_trydobeatup, //0xC4 Cmd_setsemiinvulnerablebit, //0xC5 Cmd_tryfiretwoturnmovenowbyeffect, //0xC6 @@ -824,7 +824,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_unused2, //0xE1 Cmd_switchoutabilities, //0xE2 Cmd_jumpifhasnohp, //0xE3 - Cmd_jumpifnotcurrentmoveargtype, //0xE4 + Cmd_unused_0xE4, //0xE4 Cmd_pickup, //0xE5 Cmd_unused_0xE6, //0xE6 Cmd_unused_0xE7, //0xE7 @@ -1040,23 +1040,23 @@ u32 NumFaintedBattlersByAttacker(u32 battlerAtk) return numMonsFainted; } -bool32 IsMovePowderBlocked(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsMovePowderBlocked(struct BattleContext *ctx) { bool32 effect = FALSE; - if (IsPowderMove(move) && (battlerAtk != battlerDef)) + if (IsPowderMove(ctx->currentMove) && (ctx->battlerAtk != ctx->battlerDef)) { if (B_POWDER_GRASS >= GEN_6 - && (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || GetBattlerAbility(battlerDef) == ABILITY_OVERCOAT)) + && (IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_GRASS) || ctx->ability[ctx->battlerDef] == ABILITY_OVERCOAT)) { - gBattlerAbility = battlerDef; - RecordAbilityBattle(gBattlerTarget, ABILITY_OVERCOAT); + gBattlerAbility = ctx->battlerDef; + RecordAbilityBattle(ctx->battlerDef, ABILITY_OVERCOAT); effect = TRUE; } - else if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) + else if (GetBattlerHoldEffect(ctx->battlerDef, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) { - RecordItemEffectBattle(battlerDef, HOLD_EFFECT_SAFETY_GOGGLES); - gLastUsedItem = gBattleMons[battlerDef].item; + RecordItemEffectBattle(ctx->battlerDef, HOLD_EFFECT_SAFETY_GOGGLES); + gLastUsedItem = gBattleMons[ctx->battlerDef].item; effect = TRUE; } @@ -1103,22 +1103,30 @@ static void Cmd_attackcanceler(void) return; } - enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); + struct BattleContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.currentMove = gCurrentMove; + ctx.moveEffect = GetMoveEffect(ctx.currentMove); if (!IsBattlerAlive(gBattlerAttacker) - && effect != EFFECT_EXPLOSION - && effect != EFFECT_MISTY_EXPLOSION) + && ctx.moveEffect != EFFECT_EXPLOSION + && ctx.moveEffect != EFFECT_MISTY_EXPLOSION) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } - if (AtkCanceller_MoveSuccessOrder() != MOVE_STEP_SUCCESS) + // With how attackcanceller works right now we only need attacker and target abilities. Might change in the future + ctx.ability[ctx.battlerAtk] = GetBattlerAbility(ctx.battlerAtk); + ctx.ability[ctx.battlerDef] = GetBattlerAbility(ctx.battlerDef); + + if (AtkCanceller_MoveSuccessOrder(&ctx) != MOVE_STEP_SUCCESS) return; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF - && GetBattlerAbility(gBattlerAttacker) == ABILITY_PARENTAL_BOND + && ctx.ability[ctx.battlerAtk] == ABILITY_PARENTAL_BOND && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) && !(gAbsentBattlerFlags & (1u << gBattlerTarget)) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE) @@ -1129,44 +1137,43 @@ static void Cmd_attackcanceler(void) return; } - u32 abilityDef = GetBattlerAbility(gBattlerTarget); if (CanAbilityBlockMove( - gBattlerAttacker, - gBattlerTarget, - GetBattlerAbility(gBattlerAttacker), - abilityDef, - gCurrentMove, + ctx.battlerAtk, + ctx.battlerDef, + ctx.ability[ctx.battlerAtk], + ctx.ability[ctx.battlerDef], + ctx.currentMove, RUN_SCRIPT)) return; - if (GetMoveNonVolatileStatus(gCurrentMove) == MOVE_EFFECT_PARALYSIS) + if (GetMoveNonVolatileStatus(ctx.currentMove) == MOVE_EFFECT_PARALYSIS) { if (CanAbilityAbsorbMove( - gBattlerAttacker, - gBattlerTarget, - abilityDef, - gCurrentMove, - GetBattleMoveType(gCurrentMove), + ctx.battlerAtk, + ctx.battlerDef, + ctx.ability[ctx.battlerDef], + ctx.currentMove, + GetBattleMoveType(ctx.currentMove), RUN_SCRIPT)) return; } - if (IsMovePowderBlocked(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + if (IsMovePowderBlocked(&ctx)) return; // Check if no available target present on the field or if Sky Battles ban the move if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) - && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) + && (!gBattleMoveEffects[ctx.moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) || (IsMoveNotAllowedInSkyBattles(gCurrentMove))) { gBattleStruct->noTargetPresent = TRUE; - if (effect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. + if (ctx.moveEffect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. gBattlescriptCurrInstr = BattleScript_FlingFailConsumeItem; else gBattlescriptCurrInstr = BattleScript_ButItFailed; - if (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) + if (!gBattleMoveEffects[ctx.moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); return; } @@ -1197,7 +1204,7 @@ static void Cmd_attackcanceler(void) { u32 battler = gBattlerTarget; - if (abilityDef == ABILITY_MAGIC_BOUNCE) + if (ctx.ability[ctx.battlerDef] == ABILITY_MAGIC_BOUNCE) { battler = gBattlerTarget; gBattleStruct->bouncedMoveIsUsed = TRUE; @@ -1257,11 +1264,11 @@ static void Cmd_attackcanceler(void) RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && (effect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - && (!gBattleMoveEffects[effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) - && effect != EFFECT_SUCKER_PUNCH - && effect != EFFECT_COUNTER - && effect != EFFECT_UPPER_HAND) + && (ctx.moveEffect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) + && (!gBattleMoveEffects[ctx.moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) + && ctx.moveEffect != EFFECT_SUCKER_PUNCH + && ctx.moveEffect != EFFECT_COUNTER + && ctx.moveEffect != EFFECT_UPPER_HAND) { if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; @@ -3238,7 +3245,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai gBattlescriptCurrInstr++; break; case MOVE_EFFECT_PREVENT_ESCAPE: - if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) + if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) // Do we need to check if the status is already set? { gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; @@ -6800,6 +6807,9 @@ static void Cmd_moveend(void) DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); // #endif } + + if (gBattleMons[gBattlerAttacker].volatiles.destinyBond > 0) + gBattleMons[gBattlerAttacker].volatiles.destinyBond--; gProtectStructs[gBattlerAttacker].shellTrap = FALSE; gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE; gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; @@ -7572,7 +7582,7 @@ static void UpdateSentMonFlags(u32 battler) static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) { - gBattleMons[battler].volatiles.destinyBond = FALSE; + gBattleMons[battler].volatiles.destinyBond = 0; gHitMarker &= ~HITMARKER_DESTINYBOND; gBattleScripting.battler = battler; gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; @@ -9659,17 +9669,12 @@ static void Cmd_manipulatedamage(void) static void Cmd_trysetrest(void) { - CMD_ARGS(const u8 *failInstr); + CMD_ARGS(); - const u8 *failInstr = cmd->failInstr; gBattlerTarget = gBattlerAttacker; gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) - { - gBattlescriptCurrInstr = failInstr; - } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; } @@ -9691,16 +9696,8 @@ static void Cmd_trysetrest(void) } } -static void Cmd_jumpifnotfirstturn(void) +static void Cmd_unused_0x82(void) { - CMD_ARGS(const u8 *jumpInstr); - - const u8 *jumpInstr = cmd->jumpInstr; - - if (gDisableStructs[gBattlerAttacker].isFirstTurn && !(gSpecialStatuses[gBattlerAttacker].instructedChosenTarget)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = jumpInstr; } static void Cmd_unused_0x83(void) @@ -9752,19 +9749,10 @@ static void Cmd_stockpile(void) switch (cmd->id) { case 0: - if (gDisableStructs[gBattlerAttacker].stockpileCounter >= 3) - { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_STOCKPILE; - } - else - { - gDisableStructs[gBattlerAttacker].stockpileCounter++; - gDisableStructs[gBattlerAttacker].stockpileBeforeDef = gBattleMons[gBattlerAttacker].statStages[STAT_DEF]; - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef = gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF]; - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STOCKPILED; - } + gDisableStructs[gBattlerAttacker].stockpileCounter++; + gDisableStructs[gBattlerAttacker].stockpileBeforeDef = gBattleMons[gBattlerAttacker].statStages[STAT_DEF]; + gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef = gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF]; + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); break; case 1: // Save def/sp def stats. if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) @@ -9780,20 +9768,12 @@ static void Cmd_stockpile(void) static void Cmd_stockpiletobasedamage(void) { - CMD_ARGS(const u8 *failInstr); + CMD_ARGS(); - const u8 *failInstr = cmd->failInstr; - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) - { - gBattlescriptCurrInstr = failInstr; - } - else - { - if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - gBattlescriptCurrInstr = cmd->nextInstr; - } + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_stockpiletohpheal(void) @@ -9802,40 +9782,31 @@ static void Cmd_stockpiletohpheal(void) const u8 *failInstr = cmd->failInstr; - if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) + if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) { + gDisableStructs[gBattlerAttacker].stockpileCounter = 0; gBattlescriptCurrInstr = failInstr; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED; + gBattlerTarget = gBattlerAttacker; } else { - if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) + if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) { - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; - gBattlescriptCurrInstr = failInstr; - gBattlerTarget = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FULL_HP; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; } - else + else // Snatched move { - if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; - } - else // Snatched move - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - gBattleScripting.animTurn = 1; - } - - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - - gBattlescriptCurrInstr = cmd->nextInstr; - gBattlerTarget = gBattlerAttacker; + gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + gBattleScripting.animTurn = 1; } + + if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) + gBattleStruct->moveDamage[gBattlerAttacker] = 1; + gBattleStruct->moveDamage[gBattlerAttacker] *= -1; + + gBattlescriptCurrInstr = cmd->nextInstr; + gBattlerTarget = gBattlerAttacker; } } @@ -11488,23 +11459,8 @@ static inline bool32 IsDanamaxMonPresent(void) return FALSE; } -static void Cmd_trysetdestinybond(void) +static void Cmd_unused_AA(void) { - CMD_ARGS(const u8 *failInstr); - - if (IsDanamaxMonPresent()) - { - gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; - } - else if (DoesDestinyBondFail(gBattlerAttacker)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleMons[gBattlerAttacker].volatiles.destinyBond = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void TrySetDestinyBondToHappen(void) @@ -12231,29 +12187,22 @@ static void Cmd_selectfirstvalidtarget(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_trysetfutureattack(void) +static void Cmd_setfutureattack(void) { - CMD_ARGS(const u8 *failInstr); + CMD_ARGS(); - if (gWishFutureKnock.futureSightCounter[gBattlerTarget] > gBattleTurnCounter) - { - gBattlescriptCurrInstr = cmd->failInstr; - } + gSideStatuses[GetBattlerSide(gBattlerTarget)] |= SIDE_STATUS_FUTUREATTACK; + gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; + gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker; + gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker]; + gWishFutureKnock.futureSightCounter[gBattlerTarget] = gBattleTurnCounter + 3; + + if (gCurrentMove == MOVE_DOOM_DESIRE) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; else - { - gSideStatuses[GetBattlerSide(gBattlerTarget)] |= SIDE_STATUS_FUTUREATTACK; - gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; - gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker; - gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker]; - gWishFutureKnock.futureSightCounter[gBattlerTarget] = gBattleTurnCounter + 3; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; - if (gCurrentMove == MOVE_DOOM_DESIRE) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; - - gBattlescriptCurrInstr = cmd->nextInstr; - } + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_trydobeatup(void) @@ -13054,18 +13003,8 @@ static void Cmd_jumpifhasnohp(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_jumpifnotcurrentmoveargtype(void) +static void Cmd_unused_0xE4(void) { - CMD_ARGS(u8 battler, const u8 *failInstr); - - u8 battler = GetBattlerForBattleScript(cmd->battler); - const u8 *failInstr = cmd->failInstr; - u32 type = GetMoveArgType(gCurrentMove); - - if (!IS_BATTLER_OF_TYPE(battler, type)) - gBattlescriptCurrInstr = failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_pickup(void) @@ -14396,17 +14335,6 @@ void BS_CalcMetalBurstDmg(void) } } -void BS_JumpIfCantFling(void) -{ - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - - u32 battler = GetBattlerForBattleScript(cmd->battler); - if (!CanFling(battler)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_JumpIfMoreThanHalfHP(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); @@ -15070,13 +14998,6 @@ void BS_TrySetOctolock(void) } } -void BS_SetGlaiveRush(void) -{ - NATIVE_ARGS(); - gBattleMons[gBattlerAttacker].volatiles.glaiveRush = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_SetPledge(void) { NATIVE_ARGS(const u8 *jumpInstr); @@ -17039,19 +16960,6 @@ void BS_SetLuckyChant(void) } } -void BS_SuckerPunchCheck(void) -{ - NATIVE_ARGS(const u8 *failInstr); - if (gProtectStructs[gBattlerTarget].protected == PROTECT_OBSTRUCT) - gBattlescriptCurrInstr = cmd->failInstr; - else if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)) - gBattlescriptCurrInstr = cmd->failInstr; - else if (IsBattleMoveStatus(gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]) && !gProtectStructs[gBattlerTarget].noValidMoves) - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_SetSimpleBeam(void) { NATIVE_ARGS(const u8 *failInstr); @@ -17183,15 +17091,6 @@ void BS_HandleFormChange(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TryLastResort(void) -{ - NATIVE_ARGS(const u8 *failInstr); - if (CanUseLastResort(gBattlerAttacker)) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->failInstr; -} - void BS_TryAutotomize(void) { NATIVE_ARGS(const u8 *failInstr); @@ -17441,8 +17340,7 @@ void BS_SetAuroraVeil(void) { NATIVE_ARGS(); u32 side = GetBattlerSide(gBattlerAttacker); - if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL - || !(HasWeatherEffect() && gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = 0; @@ -17877,9 +17775,7 @@ void BS_CutOneThirdHpAndRaiseStats(void) { NATIVE_ARGS(const u8 *failInstr); - bool8 atLeastOneStatBoosted = FALSE; - u16 hpFraction = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); - + bool32 atLeastOneStatBoosted = FALSE; for (u32 stat = 1; stat < NUM_STATS; stat++) { if (CompareStat(gBattlerAttacker, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) @@ -17888,9 +17784,9 @@ void BS_CutOneThirdHpAndRaiseStats(void) break; } } - if (atLeastOneStatBoosted && gBattleMons[gBattlerAttacker].hp > hpFraction) + if (atLeastOneStatBoosted) { - gBattleStruct->moveDamage[gBattlerAttacker] = hpFraction; + gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -17899,36 +17795,12 @@ void BS_CutOneThirdHpAndRaiseStats(void) } } -void BS_CheckPoltergeist(void) +void BS_SetPoltergeistMessage(void) { NATIVE_ARGS(const u8 *failInstr); - if (gBattleMons[gBattlerTarget].item == ITEM_NONE - || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || GetBattlerAbility(gBattlerTarget) == ABILITY_KLUTZ) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].item); - gLastUsedItem = gBattleMons[gBattlerTarget].item; - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -void BS_TryNoRetreat(void) -{ - NATIVE_ARGS(const u8 *failInstr); - if (gDisableStructs[gBattlerTarget].noRetreat) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) - gDisableStructs[gBattlerTarget].noRetreat = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].item); + gLastUsedItem = gBattleMons[gBattlerTarget].item; + gBattlescriptCurrInstr = cmd->nextInstr; } void BS_CureCertainStatuses(void) diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 8799dc7ab2..c083ca0575 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -132,20 +132,19 @@ bool32 IsTypeStellarBoosted(u32 battler, u32 type) // Returns the STAB power multiplier to use when Terastallized. // Power multipliers from Smogon Research thread. -uq4_12_t GetTeraMultiplier(u32 battler, u32 type) +uq4_12_t GetTeraMultiplier(struct DamageContext *ctx) { - u32 teraType = GetBattlerTeraType(battler); - bool32 hasAdaptability = (GetBattlerAbility(battler) == ABILITY_ADAPTABILITY); + u32 teraType = GetBattlerTeraType(ctx->battlerAtk); // Safety check. - if (GetActiveGimmick(battler) != GIMMICK_TERA) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_TERA) return UQ_4_12(1.0); // Stellar-type checks. if (teraType == TYPE_STELLAR) { - bool32 shouldBoost = IsTypeStellarBoosted(battler, type); - if (IS_BATTLER_OF_BASE_TYPE(battler, type)) + bool32 shouldBoost = IsTypeStellarBoosted(ctx->battlerAtk, ctx->moveType); + if (IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType)) { if (shouldBoost) return UQ_4_12(2.0); @@ -158,18 +157,18 @@ uq4_12_t GetTeraMultiplier(u32 battler, u32 type) return UQ_4_12(1.0); } // Base and Tera type. - if (type == teraType && IS_BATTLER_OF_BASE_TYPE(battler, type)) + if (ctx->moveType == teraType && IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType)) { - if (hasAdaptability) + if (ctx->abilityAtk == ABILITY_ADAPTABILITY) return UQ_4_12(2.25); else return UQ_4_12(2.0); } // Base or Tera type only. - else if ((type == teraType && !IS_BATTLER_OF_BASE_TYPE(battler, type)) - || (type != teraType && IS_BATTLER_OF_BASE_TYPE(battler, type))) + else if ((ctx->moveType == teraType && !IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType)) + || (ctx->moveType != teraType && IS_BATTLER_OF_BASE_TYPE(ctx->battlerAtk, ctx->moveType))) { - if (hasAdaptability) + if (ctx->abilityAtk == ABILITY_ADAPTABILITY) return UQ_4_12(2.0); else return UQ_4_12(1.5); diff --git a/src/battle_util.c b/src/battle_util.c index a75c8397dd..cc5543618e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1928,25 +1928,24 @@ static inline bool32 TryActivatePowderStatus(u32 move) return FALSE; } -static enum MoveCanceller CancellerFlags(void) +static enum MoveCanceller CancellerClearFlags(struct BattleContext *ctx) { - gBattleMons[gBattlerAttacker].volatiles.destinyBond = FALSE; - gBattleMons[gBattlerAttacker].volatiles.grudge = FALSE; - gBattleMons[gBattlerAttacker].volatiles.glaiveRush = FALSE; + gBattleMons[ctx->battlerAtk].volatiles.grudge = FALSE; + gBattleMons[ctx->battlerAtk].volatiles.glaiveRush = FALSE; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerStanceChangeOne(void) +static enum MoveCanceller CancellerStanceChangeOne(struct BattleContext *ctx) { - if (B_STANCE_CHANGE_FAIL < GEN_7 && gChosenMove == gCurrentMove && TryFormChangeBeforeMove()) + if (B_STANCE_CHANGE_FAIL < GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerSkyDrop(void) +static enum MoveCanceller CancellerSkyDrop(struct BattleContext *ctx) { // If Pokemon is being held in Sky Drop - if (gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable == STATE_SKY_DROP) + if (gBattleMons[ctx->battlerAtk].volatiles.semiInvulnerable == STATE_SKY_DROP) { gBattlescriptCurrInstr = BattleScript_MoveEnd; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -1955,13 +1954,13 @@ static enum MoveCanceller CancellerSkyDrop(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerRecharge(void) +static enum MoveCanceller CancellerRecharge(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].volatiles.recharge) + if (gBattleMons[ctx->battlerAtk].volatiles.recharge) { - gBattleMons[gBattlerAttacker].volatiles.recharge = TRUE; - gDisableStructs[gBattlerAttacker].rechargeTimer = 0; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gBattleMons[ctx->battlerAtk].volatiles.recharge = TRUE; + gDisableStructs[ctx->battlerAtk].rechargeTimer = 0; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -1969,15 +1968,15 @@ static enum MoveCanceller CancellerRecharge(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerAsleepOrFrozen(void) +static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { - if (UproarWakeUpCheck(gBattlerAttacker)) + if (UproarWakeUpCheck(ctx->battlerAtk)) { - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; - gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; + TryDeactivateSleepClause(GetBattlerSide(ctx->battlerAtk), gBattlerPartyIndexes[ctx->battlerAtk]); + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_SLEEP; + gBattleMons[ctx->battlerAtk].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; BattleScriptCall(BattleScript_MoveUsedWokeUp); return MOVE_STEP_REMOVES_STATUS; @@ -1985,20 +1984,19 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) else { u8 toSub; - if (IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_EARLY_BIRD)) + if (IsAbilityAndRecord(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ABILITY_EARLY_BIRD)) toSub = 2; else toSub = 1; - if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub) - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP; + if ((gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) < toSub) + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_SLEEP; else - gBattleMons[gBattlerAttacker].status1 -= toSub; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) + gBattleMons[ctx->battlerAtk].status1 -= toSub; + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { - enum BattleMoveEffects moveEffect = GetMoveEffect(gChosenMove); - if (moveEffect != EFFECT_SNORE && moveEffect != EFFECT_SLEEP_TALK) + if (ctx->moveEffect != EFFECT_SNORE && ctx->moveEffect != EFFECT_SLEEP_TALK) { - gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; + gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_REMOVES_STATUS; @@ -2006,25 +2004,25 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) } else { - TryDeactivateSleepClause(GetBattlerSide(gBattlerAttacker), gBattlerPartyIndexes[gBattlerAttacker]); - gBattleMons[gBattlerAttacker].volatiles.nightmare = FALSE; + TryDeactivateSleepClause(GetBattlerSide(ctx->battlerAtk), gBattlerPartyIndexes[ctx->battlerAtk]); + gBattleMons[ctx->battlerAtk].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; BattleScriptCall(BattleScript_MoveUsedWokeUp); return MOVE_STEP_REMOVES_STATUS; } } } - else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE && !MoveThawsUser(gCurrentMove)) + else if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE && !MoveThawsUser(ctx->currentMove)) { if (!RandomPercentage(RNG_FROZEN, 20)) { - gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; + gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } else // unfreeze { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FREEZE; BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } @@ -2033,9 +2031,9 @@ static enum MoveCanceller CancellerAsleepOrFrozen(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerObedience(void) +static enum MoveCanceller CancellerObedience(struct BattleContext *ctx) { - if (!gBattleMons[gBattlerAttacker].volatiles.multipleTurns) + if (!gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) { enum Obedience obedienceResult = GetAttackerObedienceForAction(); switch (obedienceResult) @@ -2048,36 +2046,36 @@ static enum MoveCanceller CancellerObedience(void) // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE gBattleCommunication[MULTISTRING_CHOOSER] = MOD(Random(), NUM_LOAF_STRINGS); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; return MOVE_STEP_FAILURE; case DISOBEYS_HITS_SELF: - gBattlerTarget = gBattlerAttacker; - struct DamageContext ctx; - ctx.battlerAtk = ctx.battlerDef = gBattlerAttacker; - ctx.move = MOVE_NONE; - ctx.moveType = TYPE_MYSTERY; - ctx.isCrit = FALSE; - ctx.randomFactor = FALSE; - ctx.updateFlags = TRUE; - ctx.fixedBasePower = 40; - gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&ctx); + gBattlerTarget = ctx->battlerAtk; + struct DamageContext dmgCtx; + dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk; + dmgCtx.move = MOVE_NONE; + dmgCtx.moveType = TYPE_MYSTERY; + dmgCtx.isCrit = FALSE; + dmgCtx.randomFactor = FALSE; + dmgCtx.updateFlags = TRUE; + dmgCtx.fixedBasePower = 40; + gBattleStruct->moveDamage[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker |= HITMARKER_OBEYS; return MOVE_STEP_FAILURE; // Move doesn't fail but mon hits itself case DISOBEYS_FALL_ASLEEP: if (IsSleepClauseEnabled()) - gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; + gBattleStruct->battlerState[ctx->battlerAtk].sleepClauseEffectExempt = TRUE; gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; return MOVE_STEP_FAILURE; break; case DISOBEYS_WHILE_ASLEEP: gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; return MOVE_STEP_FAILURE; case DISOBEYS_RANDOM_MOVE: - gCurrentMove = gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; + gCurrentMove = gCalledMove = gBattleMons[ctx->battlerAtk].moves[gCurrMovePos]; BattleScriptCall(BattleScript_IgnoresAndUsesRandomMove); gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); gHitMarker |= HITMARKER_OBEYS; @@ -2088,42 +2086,42 @@ static enum MoveCanceller CancellerObedience(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerPowerPoints(void) +static enum MoveCanceller CancellerPowerPoints(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].pp[gCurrMovePos] == 0 - && gCurrentMove != MOVE_STRUGGLE - && !gSpecialStatuses[gBattlerAttacker].dancerUsedMove - && !gBattleMons[gBattlerAttacker].volatiles.multipleTurns) + if (gBattleMons[ctx->battlerAtk].pp[gCurrMovePos] == 0 + && ctx->currentMove != MOVE_STRUGGLE + && !gSpecialStatuses[ctx->battlerAtk].dancerUsedMove + && !gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) { gBattlescriptCurrInstr = BattleScript_NoPPForMove; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerTruant(void) +static enum MoveCanceller CancellerTruant(struct BattleContext *ctx) { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) + if (GetBattlerAbility(ctx->battlerAtk) == ABILITY_TRUANT && gDisableStructs[ctx->battlerAtk].truantCounter) { - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; - gBattlerAbility = gBattlerAttacker; + gBattlerAbility = ctx->battlerAtk; gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerFlinch(void) +static enum MoveCanceller CancellerFlinch(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].volatiles.flinched) + if (gBattleMons[ctx->battlerAtk].volatiles.flinched) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2131,13 +2129,15 @@ static enum MoveCanceller CancellerFlinch(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerDisabled(void) +static enum MoveCanceller CancellerDisabled(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != MOVE_NONE) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE + && gDisableStructs[ctx->battlerAtk].disabledMove == ctx->currentMove + && gDisableStructs[ctx->battlerAtk].disabledMove != MOVE_NONE) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + gBattleScripting.battler = ctx->battlerAtk; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2145,30 +2145,32 @@ static enum MoveCanceller CancellerDisabled(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerVolatileBlocked(void) +static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gBattleMons[gBattlerAttacker].volatiles.healBlock && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE + && gBattleMons[ctx->battlerAtk].volatiles.healBlock + && IsHealBlockPreventingMove(ctx->battlerAtk, ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + gBattleScripting.battler = ctx->battlerAtk; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } - else if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) + else if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - gBattleScripting.battler = gBattlerAttacker; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + gBattleScripting.battler = ctx->battlerAtk; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } - else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].throatChopTimer > gBattleTurnCounter && IsSoundMove(gCurrentMove)) + else if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].throatChopTimer > gBattleTurnCounter && IsSoundMove(ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2176,12 +2178,12 @@ static enum MoveCanceller CancellerVolatileBlocked(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerTaunted(void) +static enum MoveCanceller CancellerTaunted(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].tauntTimer && IsBattleMoveStatus(gCurrentMove)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].tauntTimer && IsBattleMoveStatus(ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_BREAK; @@ -2189,12 +2191,12 @@ static enum MoveCanceller CancellerTaunted(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerImprisoned(void) +static enum MoveCanceller CancellerImprisoned(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(ctx->battlerAtk, ctx->currentMove)) { - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2202,29 +2204,28 @@ static enum MoveCanceller CancellerImprisoned(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerConfused(void) +static enum MoveCanceller CancellerConfused(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].volatiles.confusionTurns) + if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { - if (!gBattleMons[gBattlerAttacker].volatiles.infiniteConfusion) - gBattleMons[gBattlerAttacker].volatiles.confusionTurns--; - if (gBattleMons[gBattlerAttacker].volatiles.confusionTurns) + if (!gBattleMons[ctx->battlerAtk].volatiles.infiniteConfusion) + gBattleMons[ctx->battlerAtk].volatiles.confusionTurns--; + if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { // confusion dmg if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) { gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; - gBattlerTarget = gBattlerAttacker; - struct DamageContext ctx; - ctx.battlerAtk = ctx.battlerDef = gBattlerAttacker; - ctx.move = MOVE_NONE; - ctx.moveType = TYPE_MYSTERY; - ctx.isCrit = FALSE; - ctx.randomFactor = FALSE; - ctx.updateFlags = TRUE; - ctx.fixedBasePower = 40; - gBattleStruct->moveDamage[gBattlerAttacker] = CalculateMoveDamage(&ctx); - gProtectStructs[gBattlerAttacker].confusionSelfDmg = TRUE; + struct DamageContext dmgCtx; + dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk; + dmgCtx.move = MOVE_NONE; + dmgCtx.moveType = TYPE_MYSTERY; + dmgCtx.isCrit = FALSE; + dmgCtx.randomFactor = FALSE; + dmgCtx.updateFlags = TRUE; + dmgCtx.fixedBasePower = 40; + gBattleStruct->moveDamage[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); + gProtectStructs[ctx->battlerAtk].confusionSelfDmg = TRUE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; } @@ -2243,13 +2244,13 @@ static enum MoveCanceller CancellerConfused(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerParalysed(void) +static enum MoveCanceller CancellerParalysed(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS - && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_PARALYSIS + && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) && !RandomPercentage(RNG_PARALYSIS, 75)) { - gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility = TRUE; + gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; // This is removed in FRLG and Emerald for some reason //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; @@ -2259,11 +2260,11 @@ static enum MoveCanceller CancellerParalysed(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerInfatuation(void) +static enum MoveCanceller CancellerInfatuation(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].volatiles.infatuation) + if (gBattleMons[ctx->battlerAtk].volatiles.infatuation) { - gBattleScripting.battler = gBattleMons[gBattlerAttacker].volatiles.infatuation - 1; + gBattleScripting.battler = gBattleMons[ctx->battlerAtk].volatiles.infatuation - 1; if (!RandomPercentage(RNG_INFATUATION, 50)) { BattleScriptCall(BattleScript_MoveUsedIsInLove); @@ -2273,8 +2274,8 @@ static enum MoveCanceller CancellerInfatuation(void) { BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[gBattlerAttacker].unableToUseMove = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; return MOVE_STEP_FAILURE; } @@ -2282,11 +2283,11 @@ static enum MoveCanceller CancellerInfatuation(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerBide(void) +static enum MoveCanceller CancellerBide(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].volatiles.bideTurns) + if (gBattleMons[ctx->battlerAtk].volatiles.bideTurns) { - if (--gBattleMons[gBattlerAttacker].volatiles.bideTurns) + if (--gBattleMons[ctx->battlerAtk].volatiles.bideTurns) { gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; } @@ -2294,11 +2295,11 @@ static enum MoveCanceller CancellerBide(void) { // This is removed in FRLG and Emerald for some reason //gBattleMons[gBattlerAttacker].volatiles.multipleTurns = FALSE; - if (gBideDmg[gBattlerAttacker]) + if (gBideDmg[ctx->battlerAtk]) { gCurrentMove = MOVE_BIDE; - gBattlerTarget = gBideTarget[gBattlerAttacker]; - if (gAbsentBattlerFlags & (1u << gBattlerTarget)) + gBattlerTarget = gBideTarget[ctx->battlerAtk]; + if (gAbsentBattlerFlags & (1u << ctx->battlerDef)) gBattlerTarget = GetBattleMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); gBattlescriptCurrInstr = BattleScript_BideAttack; return MOVE_STEP_BREAK; // Jumps to a different script but no failure @@ -2313,16 +2314,16 @@ static enum MoveCanceller CancellerBide(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerZMoves(void) +static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) + if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE) { // attacker has a queued z move - RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_Z_CRYSTAL); - SetGimmickAsActivated(gBattlerAttacker, GIMMICK_Z_MOVE); + RecordItemEffectBattle(ctx->battlerAtk, HOLD_EFFECT_Z_CRYSTAL); + SetGimmickAsActivated(ctx->battlerAtk, GIMMICK_Z_MOVE); - gBattleScripting.battler = gBattlerAttacker; - if (GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) + gBattleScripting.battler = ctx->battlerAtk; + if (GetMoveCategory(ctx->currentMove) == DAMAGE_CATEGORY_STATUS) BattleScriptCall(BattleScript_ZMoveActivateStatus); else BattleScriptCall(BattleScript_ZMoveActivateDamaging); @@ -2332,20 +2333,20 @@ static enum MoveCanceller CancellerZMoves(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerChoiceLock(void) +static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) { - u16 *choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + u16 *choicedMoveAtk = &gBattleStruct->choicedMove[ctx->battlerAtk]; + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); if (gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) - && (IsHoldEffectChoice(holdEffect) || GetBattlerAbility(gBattlerAttacker) == ABILITY_GORILLA_TACTICS)) + && (IsHoldEffectChoice(holdEffect) || ctx->ability[ctx->battlerAtk] == ABILITY_GORILLA_TACTICS)) *choicedMoveAtk = gChosenMove; u32 moveIndex; for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gBattleMons[gBattlerAttacker].moves[moveIndex] == *choicedMoveAtk) + if (gBattleMons[ctx->battlerAtk].moves[moveIndex] == *choicedMoveAtk) break; } @@ -2355,15 +2356,14 @@ static enum MoveCanceller CancellerChoiceLock(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerCallSubmove(void) +static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) { u32 noEffect = FALSE; u32 calledMove = MOVE_NONE; - u32 effect = GetMoveEffect(gCurrentMove); const u8 *battleScript = NULL; battleScript = BattleScript_SubmoveAttackstring; - switch(effect) + switch(ctx->moveEffect) { case EFFECT_MIRROR_MOVE: calledMove = GetMirrorMoveMove(); @@ -2376,7 +2376,7 @@ static enum MoveCanceller CancellerCallSubmove(void) calledMove = GetAssistMove(); break; case EFFECT_NATURE_POWER: - calledMove = GetNaturePowerMove(gBattlerAttacker); + calledMove = GetNaturePowerMove(ctx->battlerAtk); battleScript = BattleScript_NaturePowerAttackstring; break; case EFFECT_SLEEP_TALK: @@ -2402,9 +2402,9 @@ static enum MoveCanceller CancellerCallSubmove(void) if (calledMove != MOVE_NONE) { - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(calledMove)) + if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(calledMove)) calledMove = GetTypeBasedZMove(calledMove); - if (effect == EFFECT_COPYCAT && IsMaxMove(calledMove)) + if (ctx->moveEffect == EFFECT_COPYCAT && IsMaxMove(calledMove)) calledMove = gBattleStruct->dynamax.lastUsedBaseMove; gBattleStruct->submoveAnnouncement = SUBMOVE_SUCCESS; @@ -2417,23 +2417,23 @@ static enum MoveCanceller CancellerCallSubmove(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerThaw(void) +static enum MoveCanceller CancellerThaw(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE) { - if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) + if (!(IsMoveEffectRemoveSpeciesType(ctx->currentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FREEZE; BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; } return MOVE_STEP_REMOVES_STATUS; } - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE && MoveThawsUser(gCurrentMove)) + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE && MoveThawsUser(ctx->currentMove)) { - if (!(IsMoveEffectRemoveSpeciesType(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) + if (!(IsMoveEffectRemoveSpeciesType(ctx->currentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) { - gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FROSTBITE; + gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FROSTBITE; BattleScriptCall(BattleScript_MoveUsedUnfrostbite); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; } @@ -2442,29 +2442,29 @@ static enum MoveCanceller CancellerThaw(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerStanceChangeTwo(void) +static enum MoveCanceller CancellerStanceChangeTwo(struct BattleContext *ctx) { - if (B_STANCE_CHANGE_FAIL >= GEN_7 && gChosenMove == gCurrentMove && TryFormChangeBeforeMove()) + if (B_STANCE_CHANGE_FAIL >= GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerAttackstring(void) +static enum MoveCanceller CancellerAttackstring(struct BattleContext *ctx) { gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED; BattleScriptCall(BattleScript_Attackstring); return MOVE_STEP_BREAK; } -static enum MoveCanceller CancellerPPDeduction(void) +static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) { - if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns - || gSpecialStatuses[gBattlerAttacker].dancerUsedMove - || gCurrentMove == MOVE_STRUGGLE) + if (gBattleMons[ctx->battlerAtk].volatiles.multipleTurns + || gSpecialStatuses[ctx->battlerAtk].dancerUsedMove + || ctx->currentMove == MOVE_STRUGGLE) return MOVE_STEP_SUCCESS; s32 ppToDeduct = 1; - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); u32 movePosition = gCurrMovePos; if (gBattleStruct->submoveAnnouncement == SUBMOVE_SUCCESS) @@ -2473,37 +2473,41 @@ static enum MoveCanceller CancellerPPDeduction(void) if (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY || moveTarget == MOVE_TARGET_ALL_BATTLERS - || MoveForcesPressure(gCurrentMove)) + || MoveForcesPressure(ctx->currentMove)) { for (u32 i = 0; i < gBattlersCount; i++) { - if (!IsBattlerAlly(i, gBattlerAttacker) && IsBattlerAlive(i)) + if (!IsBattlerAlly(i, ctx->battlerAtk) && IsBattlerAlive(i)) ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); } } else if (moveTarget != MOVE_TARGET_OPPONENTS_FIELD) { - if (gBattlerAttacker != gBattlerTarget && GetBattlerAbility(gBattlerTarget) == ABILITY_PRESSURE) + if (ctx->battlerAtk != ctx->battlerDef && ctx->ability[ctx->battlerDef] == ABILITY_PRESSURE) ppToDeduct++; } - gProtectStructs[gBattlerAttacker].notFirstStrike = TRUE; + gProtectStructs[ctx->battlerAtk].notFirstStrike = TRUE; // For item Metronome, echoed voice - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || WasUnableToUseMove(gBattlerAttacker)) - gBattleStruct->sameMoveTurns[gBattlerAttacker] = 0; + if (ctx->currentMove != gLastResultingMoves[ctx->battlerAtk] || WasUnableToUseMove(ctx->battlerAtk)) + gBattleStruct->sameMoveTurns[ctx->battlerAtk] = 0; - if (gBattleMons[gBattlerAttacker].pp[movePosition] > ppToDeduct) - gBattleMons[gBattlerAttacker].pp[movePosition] -= ppToDeduct; + if (gBattleMons[ctx->battlerAtk].pp[movePosition] > ppToDeduct) + gBattleMons[ctx->battlerAtk].pp[movePosition] -= ppToDeduct; else - gBattleMons[gBattlerAttacker].pp[movePosition] = 0; + gBattleMons[ctx->battlerAtk].pp[movePosition] = 0; - if (MOVE_IS_PERMANENT(gBattlerAttacker, movePosition)) + if (MOVE_IS_PERMANENT(ctx->battlerAtk, movePosition)) { - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + movePosition, 0, - sizeof(gBattleMons[gBattlerAttacker].pp[movePosition]), - &gBattleMons[gBattlerAttacker].pp[movePosition]); - MarkBattlerForControllerExec(gBattlerAttacker); + BtlController_EmitSetMonData( + ctx->battlerAtk, + B_COMM_TO_CONTROLLER, + REQUEST_PPMOVE1_BATTLE + movePosition, + 0, + sizeof(gBattleMons[ctx->battlerAtk].pp[movePosition]), + &gBattleMons[ctx->battlerAtk].pp[movePosition]); + MarkBattlerForControllerExec(ctx->battlerAtk); } if (gBattleStruct->submoveAnnouncement != SUBMOVE_NO_EFFECT) @@ -2514,7 +2518,7 @@ static enum MoveCanceller CancellerPPDeduction(void) gBattlescriptCurrInstr = BattleScript_ButItFailed; return MOVE_STEP_FAILURE; } - else if (CancellerVolatileBlocked() == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove + else if (CancellerVolatileBlocked(ctx) == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove { gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; return MOVE_STEP_FAILURE; @@ -2522,14 +2526,14 @@ static enum MoveCanceller CancellerPPDeduction(void) else { gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(ctx->currentMove, NO_TARGET_OVERRIDE); gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; // Possibly better to just move type setting and redirection to attackcanceller as a new case at this point - SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); + SetTypeBeforeUsingMove(ctx->currentMove, ctx->battlerAtk); HandleMoveTargetRedirection(); - gBattlescriptCurrInstr = GetMoveBattleScript(gCurrentMove); + gBattlescriptCurrInstr = GetMoveBattleScript(ctx->currentMove); return MOVE_STEP_BREAK; } } @@ -2537,13 +2541,13 @@ static enum MoveCanceller CancellerPPDeduction(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerWeatherPrimal(void) +static enum MoveCanceller CancellerWeatherPrimal(struct BattleContext *ctx) { enum MoveCanceller effect = MOVE_STEP_SUCCESS; - if (HasWeatherEffect() && GetMovePower(gCurrentMove) > 0) + if (HasWeatherEffect() && GetMovePower(ctx->currentMove) > 0) { - u32 moveType = GetBattleMoveType(gCurrentMove); - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) + u32 moveType = GetBattleMoveType(ctx->currentMove); + if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(ctx->currentMove))) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; effect = MOVE_STEP_FAILURE; @@ -2556,8 +2560,8 @@ static enum MoveCanceller CancellerWeatherPrimal(void) if (effect == MOVE_STEP_FAILURE) { gBattleScripting.moveEffect = MOVE_EFFECT_NONE; - gProtectStructs[gBattlerAttacker].chargingTurn = FALSE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + gProtectStructs[ctx->battlerAtk].chargingTurn = FALSE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; } @@ -2565,27 +2569,145 @@ static enum MoveCanceller CancellerWeatherPrimal(void) return effect; } -static enum MoveCanceller CancellerDynamaxBlocked(void) +static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) { - if ((GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && IsMoveBlockedByDynamax(gCurrentMove)) + const u8 *battleScript = NULL; + + switch (ctx->moveEffect) + { + case EFFECT_FAIL_IF_NOT_ARG_TYPE: + if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, GetMoveArgType(ctx->currentMove))) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_AURA_WHEEL: + if (gBattleMons[ctx->battlerAtk].species != SPECIES_MORPEKO_FULL_BELLY + && gBattleMons[ctx->battlerAtk].species != SPECIES_MORPEKO_HANGRY) + battleScript = BattleScript_PokemonCantUseTheMove; + break; + case EFFECT_AURORA_VEIL: + if (!(gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW) && HasWeatherEffect())) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_CLANGOROUS_SOUL: + if (gBattleMons[ctx->battlerAtk].hp <= max(1, GetNonDynamaxMaxHP(ctx->battlerAtk) / 3)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_COUNTER: + case EFFECT_MIRROR_COAT: + case EFFECT_METAL_BURST: + // TODO: Needs a refactor because the moves currently don't work according to new gens + break; + case EFFECT_DESTINY_BOND: + if (DoesDestinyBondFail(ctx->battlerAtk)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FIRST_TURN_ONLY: + if (!gDisableStructs[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_MAT_BLOCK: + if (!gDisableStructs[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FLING: + if (!CanFling(ctx->battlerAtk)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FOLLOW_ME: + if (B_UPDATED_MOVE_DATA >= GEN_8 && !(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_FUTURE_SIGHT: + if (gWishFutureKnock.futureSightCounter[ctx->battlerDef] > gBattleTurnCounter) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_LAST_RESORT: + if (!CanUseLastResort(ctx->battlerAtk)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_NO_RETREAT: + if (gBattleMons[ctx->battlerDef].volatiles.noRetreat) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_POLTERGEIST: + if (gBattleMons[ctx->battlerDef].item == ITEM_NONE + || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM + || ctx->ability[ctx->battlerDef] == ABILITY_KLUTZ) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_PROTECT: + // TODO + break; + case EFFECT_REST: + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP + || ctx->ability[ctx->battlerAtk] == ABILITY_COMATOSE) + battleScript = BattleScript_RestIsAlreadyAsleep; + else if (gBattleMons[ctx->battlerAtk].hp == gBattleMons[ctx->battlerAtk].maxHP) + battleScript = BattleScript_AlreadyAtFullHp; + else if (ctx->ability[ctx->battlerAtk] == ABILITY_INSOMNIA + || ctx->ability[ctx->battlerAtk] == ABILITY_VITAL_SPIRIT + || ctx->ability[ctx->battlerAtk] == ABILITY_PURIFYING_SALT) + battleScript = BattleScript_InsomniaProtects; + break; + case EFFECT_SUCKER_PUNCH: + if ((GetBattlerTurnOrderNum(ctx->battlerAtk) > GetBattlerTurnOrderNum(ctx->battlerDef)) + || (IsBattleMoveStatus(gBattleMons[ctx->battlerDef].moves[gBattleStruct->chosenMovePositions[ctx->battlerDef]]) && !gProtectStructs[ctx->battlerDef].noValidMoves)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_SNORE: + if (!(gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) + && ctx->ability[ctx->battlerAtk] != ABILITY_COMATOSE) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_STEEL_ROLLER: + if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_STOCKPILE: + if (gDisableStructs[ctx->battlerAtk].stockpileCounter >= 3) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_STUFF_CHEEKS: + if (GetItemPocket(gBattleMons[ctx->battlerAtk].item) != POCKET_BERRIES) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_SWALLOW: + case EFFECT_SPIT_UP: + if (gDisableStructs[ctx->battlerAtk].stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) + battleScript = BattleScript_ButItFailed; + break; + case EFFECT_TELEPORT: + // TODO: follow up: Can't make sense of teleport logic + break; + case EFFECT_LOW_KICK: + case EFFECT_HEAT_CRASH: + if (GetActiveGimmick(ctx->battlerDef) == GIMMICK_DYNAMAX) + battleScript = BattleScript_MoveBlockedByDynamax; + break; + default: + break; + } + + if (battleScript != NULL) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattlescriptCurrInstr = BattleScript_MoveBlockedByDynamax; + gBattlescriptCurrInstr = battleScript; return MOVE_STEP_FAILURE; } + return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerPowderStatus(void) +static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx) { - if (TryActivatePowderStatus(gCurrentMove)) + if (TryActivatePowderStatus(ctx->currentMove)) { - if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) + gBattleStruct->moveDamage[ctx->battlerAtk] = GetNonDynamaxMaxHP(ctx->battlerAtk) / 4; // This might be incorrect - if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE - || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE + || HasTrainerUsedGimmick(ctx->battlerAtk, GIMMICK_Z_MOVE)) gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_BREAK; @@ -2593,16 +2715,67 @@ static enum MoveCanceller CancellerPowderStatus(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerProtean(void) +bool32 IsDazzlingAbility(u32 ability) { - u32 moveType = GetBattleMoveType(gCurrentMove); - if (ProteanTryChangeType(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), gCurrentMove, moveType)) + switch (ability) + { + case ABILITY_DAZZLING: return TRUE; + case ABILITY_QUEENLY_MAJESTY: return TRUE; + case ABILITY_ARMOR_TAIL: return TRUE; + default: break; + } + return FALSE; +} + +static enum MoveCanceller CancellerPriorityBlock(struct BattleContext *ctx) +{ + bool32 effect = FALSE; + s32 priority = GetChosenMovePriority(ctx->battlerAtk, ctx->ability[ctx->battlerAtk]); + u32 blockAbility = ABILITY_NONE; // ability of battler who is blocking + u32 blockedByBattler = ctx->battlerDef; + + if (priority <= 0 || IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef)) + return MOVE_STEP_SUCCESS; + + if (IsDazzlingAbility(ctx->ability[ctx->battlerDef])) + { + blockAbility = ctx->ability[ctx->battlerDef]; + effect = TRUE; + } + else if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(ctx->battlerDef))) + { + blockAbility = GetBattlerAbility(BATTLE_PARTNER(ctx->battlerDef)); + if (IsDazzlingAbility(blockAbility)) + { + blockedByBattler = BATTLE_PARTNER(ctx->battlerDef); + effect = TRUE; + } + } + + if (effect) + { + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + gLastUsedAbility = blockAbility; + RecordAbilityBattle(blockedByBattler, blockAbility); + gBattleScripting.battler = gBattlerAbility = blockedByBattler; + gBattlescriptCurrInstr = BattleScript_DazzlingProtected; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + return MOVE_STEP_FAILURE; + } + + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceller CancellerProtean(struct BattleContext *ctx) +{ + u32 moveType = GetBattleMoveType(ctx->currentMove); + if (ProteanTryChangeType(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ctx->currentMove, moveType)) { if (GetGenConfig(GEN_PROTEAN_LIBERO) >= GEN_9) - gDisableStructs[gBattlerAttacker].usedProteanLibero = TRUE; + gDisableStructs[ctx->battlerAtk].usedProteanLibero = TRUE; PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - gBattlerAbility = gBattlerAttacker; - PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker); + gBattlerAbility = ctx->battlerAtk; + PrepareStringBattle(STRINGID_EMPTYSTRING3, ctx->battlerAtk); gBattleCommunication[MSG_DISPLAY] = 1; BattleScriptCall(BattleScript_ProteanActivates); return MOVE_STEP_BREAK; @@ -2610,27 +2783,10 @@ static enum MoveCanceller CancellerProtean(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerPsychicTerrain(void) -{ - if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN - && IsBattlerGrounded(gBattlerTarget) - && GetChosenMovePriority(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) > 0 - && GetMoveTarget(gCurrentMove) != MOVE_TARGET_ALL_BATTLERS - && GetMoveTarget(gCurrentMove) != MOVE_TARGET_OPPONENTS_FIELD - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - { - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); - gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_FAILURE; - } - return MOVE_STEP_SUCCESS; -} - -static enum MoveCanceller CancellerExplodingDamp(void) +static enum MoveCanceller CancellerExplodingDamp(struct BattleContext *ctx) { u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); - if (dampBattler && IsMoveDampBanned(gCurrentMove)) + if (dampBattler && IsMoveDampBanned(ctx->currentMove)) { gBattleScripting.battler = dampBattler - 1; gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; @@ -2640,19 +2796,19 @@ static enum MoveCanceller CancellerExplodingDamp(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerMultihitMoves(void) +static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) { - if (GetMoveEffect(gCurrentMove) == EFFECT_MULTI_HIT) + if (GetMoveEffect(ctx->currentMove) == EFFECT_MULTI_HIT) { - u32 ability = GetBattlerAbility(gBattlerAttacker); + u32 ability = ctx->ability[ctx->battlerAtk]; if (ability == ABILITY_SKILL_LINK) { gMultiHitCounter = 5; } else if (ability == ABILITY_BATTLE_BOND - && gCurrentMove == MOVE_WATER_SHURIKEN - && gBattleMons[gBattlerAttacker].species == SPECIES_GRENINJA_ASH) + && ctx->currentMove == MOVE_WATER_SHURIKEN + && gBattleMons[ctx->battlerAtk].species == SPECIES_GRENINJA_ASH) { gMultiHitCounter = 3; } @@ -2663,28 +2819,28 @@ static enum MoveCanceller CancellerMultihitMoves(void) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - else if (GetMoveStrikeCount(gCurrentMove) > 1) + else if (GetMoveStrikeCount(ctx->currentMove) > 1) { - if (GetMoveEffect(gCurrentMove) == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) + if (ctx->moveEffect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk, TRUE) == HOLD_EFFECT_LOADED_DICE) { gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); } else { - gMultiHitCounter = GetMoveStrikeCount(gCurrentMove); + gMultiHitCounter = GetMoveStrikeCount(ctx->currentMove); - if (GetMoveEffect(gCurrentMove) == EFFECT_DRAGON_DARTS - && !IsAffectedByFollowMe(gBattlerAttacker, GetBattlerSide(gBattlerTarget), gCurrentMove) - && CanTargetPartner(gBattlerAttacker, gBattlerTarget) - && TargetFullyImmuneToCurrMove(gBattlerAttacker, gBattlerTarget)) - gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); + if (ctx->moveEffect == EFFECT_DRAGON_DARTS + && !IsAffectedByFollowMe(ctx->battlerAtk, GetBattlerSide(ctx->battlerDef), ctx->currentMove) + && CanTargetPartner(ctx->battlerAtk, ctx->battlerDef) + && TargetFullyImmuneToCurrMove(ctx->battlerAtk, ctx->battlerDef)) + gBattlerTarget = BATTLE_PARTNER(ctx->battlerDef); } PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } - else if (B_BEAT_UP >= GEN_5 && GetMoveEffect(gCurrentMove) == EFFECT_BEAT_UP) + else if (B_BEAT_UP >= GEN_5 && ctx->moveEffect == EFFECT_BEAT_UP) { - struct Pokemon* party = GetBattlerParty(gBattlerAttacker); + struct Pokemon* party = GetBattlerParty(ctx->battlerAtk); int i; for (i = 0; i < PARTY_SIZE; i++) @@ -2707,10 +2863,10 @@ static enum MoveCanceller CancellerMultihitMoves(void) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerMultiTargetMoves(void) +static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) { - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); + u32 abilityAtk = ctx->ability[ctx->battlerAtk]; if (IsSpreadMove(moveTarget)) { @@ -2721,43 +2877,43 @@ static enum MoveCanceller CancellerMultiTargetMoves(void) u32 abilityDef = GetBattlerAbility(battlerDef); - if (gBattlerAttacker == battlerDef + if (ctx->battlerAtk == battlerDef || !IsBattlerAlive(battlerDef) - || (GetMoveEffect(gCurrentMove) == EFFECT_SYNCHRONOISE && !DoBattlersShareType(gBattlerAttacker, battlerDef)) - || (moveTarget == MOVE_TARGET_BOTH && gBattlerAttacker == BATTLE_PARTNER(battlerDef)) - || IsBattlerProtected(gBattlerAttacker, battlerDef, gCurrentMove)) // Missing Invulnerable check + || (ctx->moveEffect == EFFECT_SYNCHRONOISE && !DoBattlersShareType(ctx->battlerAtk, battlerDef)) + || (moveTarget == MOVE_TARGET_BOTH && ctx->battlerAtk == BATTLE_PARTNER(battlerDef)) + || IsBattlerProtected(ctx->battlerAtk, battlerDef, ctx->currentMove)) // Missing Invulnerable check { gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; gBattleStruct->noResultString[battlerDef] = WILL_FAIL; } - else if (CanAbilityBlockMove(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, gCurrentMove, CHECK_TRIGGER) - || (IsBattlerTerrainAffected(gBattlerAttacker, STATUS_FIELD_PSYCHIC_TERRAIN) && GetBattleMovePriority(gBattlerAttacker, abilityAtk, gCurrentMove) > 0)) + else if (CanAbilityBlockMove(ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, ctx->currentMove, CHECK_TRIGGER) + || (IsBattlerTerrainAffected(ctx->battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && GetBattleMovePriority(ctx->battlerAtk, abilityAtk, gCurrentMove) > 0)) { gBattleStruct->moveResultFlags[battlerDef] = 0; gBattleStruct->noResultString[battlerDef] = WILL_FAIL; } - else if (CanAbilityAbsorbMove(gBattlerAttacker, battlerDef, abilityDef, gCurrentMove, GetBattleMoveType(gCurrentMove), CHECK_TRIGGER)) + else if (CanAbilityAbsorbMove(ctx->battlerAtk, battlerDef, abilityDef, ctx->currentMove, GetBattleMoveType(gCurrentMove), CHECK_TRIGGER)) { gBattleStruct->moveResultFlags[battlerDef] = 0; gBattleStruct->noResultString[battlerDef] = CHECK_ACCURACY; } else { - CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), gBattlerAttacker, battlerDef, abilityAtk, abilityDef, TRUE); // Sets moveResultFlags + CalcTypeEffectivenessMultiplierHelper(ctx->currentMove, GetBattleMoveType(ctx->currentMove), ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, TRUE); // Sets moveResultFlags gBattleStruct->noResultString[battlerDef] = CAN_DAMAGE; } } if (moveTarget == MOVE_TARGET_BOTH) - gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER_SIDE, gBattlerAttacker); + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER_SIDE, ctx->battlerAtk); else - gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker); + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, ctx->battlerAtk); } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(void) = +static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(struct BattleContext *ctx) = { - [CANCELLER_FLAGS] = CancellerFlags, + [CANCELLER_CLEAR_FLAGS] = CancellerClearFlags, [CANCELLER_STANCE_CHANGE_1] = CancellerStanceChangeOne, [CANCELLER_SKY_DROP] = CancellerSkyDrop, [CANCELLER_RECHARGE] = CancellerRecharge, @@ -2782,29 +2938,35 @@ static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(void) = [CANCELLER_ATTACKSTRING] = CancellerAttackstring, [CANCELLER_PPDEDUCTION] = CancellerPPDeduction, [CANCELLER_WEATHER_PRIMAL] = CancellerWeatherPrimal, - [CANCELLER_DYNAMAX_BLOCKED] = CancellerDynamaxBlocked, + [CANCELLER_MOVE_FAILURE] = CancellerMoveFailure, [CANCELLER_POWDER_STATUS] = CancellerPowderStatus, + [CANCELLER_PRIORITY_BLOCK] = CancellerPriorityBlock, [CANCELLER_PROTEAN] = CancellerProtean, - [CANCELLER_PSYCHIC_TERRAIN] = CancellerPsychicTerrain, [CANCELLER_EXPLODING_DAMP] = CancellerExplodingDamp, [CANCELLER_MULTIHIT_MOVES] = CancellerMultihitMoves, [CANCELLER_MULTI_TARGET_MOVES] = CancellerMultiTargetMoves, }; -enum MoveCanceller AtkCanceller_MoveSuccessOrder(void) +enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx) { enum MoveCanceller effect = MOVE_STEP_SUCCESS; while (gBattleStruct->atkCancellerTracker < CANCELLER_END && effect == MOVE_STEP_SUCCESS) { - effect = sMoveSuccessOrderCancellers[gBattleStruct->atkCancellerTracker](); + effect = sMoveSuccessOrderCancellers[gBattleStruct->atkCancellerTracker](ctx); gBattleStruct->atkCancellerTracker++; } if (effect == MOVE_STEP_REMOVES_STATUS) { - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); + BtlController_EmitSetMonData( + ctx->battlerAtk, + B_COMM_TO_CONTROLLER, + REQUEST_STATUS_BATTLE, + 0, + 4, + &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(ctx->battlerAtk); } return effect; @@ -3181,13 +3343,6 @@ static void ChooseStatBoostAnimation(u32 battler) bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option) { const u8 *battleScriptBlocksMove = NULL; - u32 battlerAbility = battlerDef; - s32 atkPriority = 0; - - if (option == AI_CHECK) - atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); - else - atkPriority = GetChosenMovePriority(battlerAtk, abilityAtk); switch (abilityDef) { @@ -3199,12 +3354,6 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a if (IsBallisticMove(move)) battleScriptBlocksMove = BattleScript_SoundproofProtected; break; - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - if (atkPriority > 0 && !IsBattlerAlly(battlerAtk, battlerDef)) - battleScriptBlocksMove = BattleScript_DazzlingProtected; - break; case ABILITY_GOOD_AS_GOLD: if (IsBattleMoveStatus(move)) { @@ -3214,40 +3363,39 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a break; } - if (atkPriority > 0) + if (battleScriptBlocksMove == NULL) { - // Prankster check - if (battleScriptBlocksMove == NULL - && IsBattleMoveStatus(move) - && BlocksPrankster(move, battlerAtk, battlerDef, TRUE) - && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) + s32 atkPriority = 0; + if (option == AI_CHECK) + atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); + else + atkPriority = GetChosenMovePriority(battlerAtk, abilityAtk); + + if (atkPriority <= 0) + { + // Not a priority move + } + else if (IsBattleMoveStatus(move) + && BlocksPrankster(move, battlerAtk, battlerDef, TRUE) + && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) { if (option == RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected - battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; } - - // Check def partner ability - u32 partnerDef = BATTLE_PARTNER(battlerDef); - if (battleScriptBlocksMove == NULL - && IsDoubleBattle() - && IsBattlerAlive(partnerDef) - && !IsBattlerAlly(battlerAtk, partnerDef)) + else if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions + && !IsBattlerAlly(battlerAtk, battlerDef) + && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS + && GetMoveTarget(move) != MOVE_TARGET_OPPONENTS_FIELD) { - if (option == AI_CHECK) - abilityDef = gAiLogicData->abilities[partnerDef]; - else - abilityDef = GetBattlerAbility(partnerDef); - - switch (abilityDef) + battleScriptBlocksMove = BattleScript_MoveUsedPsychicTerrainPrevents; + if (option == RUN_SCRIPT) { - case ABILITY_DAZZLING: - case ABILITY_QUEENLY_MAJESTY: - case ABILITY_ARMOR_TAIL: - battlerAbility = partnerDef; - battleScriptBlocksMove = BattleScript_DazzlingProtected; - break; + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + if (!IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) + CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected + gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; + return TRUE; // Early return since we don't want to set remaining values } } } @@ -3257,10 +3405,10 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a if (option == RUN_SCRIPT) { - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. gLastUsedAbility = abilityDef; RecordAbilityBattle(battlerDef, abilityDef); - gBattleScripting.battler = gBattlerAbility = battlerAbility; + gBattleScripting.battler = gBattlerAbility = battlerDef; gBattlescriptCurrInstr = battleScriptBlocksMove; } @@ -4698,7 +4846,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; } - + RemoveAbilityFlags(gBattlerAttacker); gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; @@ -7448,7 +7596,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) void ClearVariousBattlerFlags(u32 battler) { gDisableStructs[battler].furyCutterCounter = 0; - gBattleMons[battler].volatiles.destinyBond = FALSE; + gBattleMons[battler].volatiles.destinyBond = 0; gBattleMons[battler].volatiles.glaiveRush = FALSE; gBattleMons[battler].volatiles.grudge = FALSE; } @@ -9555,7 +9703,7 @@ static inline s32 DoMoveDamageCalcVars(struct DamageContext *ctx) s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg) { if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_TERA) - DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(ctx->battlerAtk, ctx->moveType)); + DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(ctx)); else DAMAGE_APPLY_MODIFIER(GetSameTypeAttackBonusModifier(ctx)); DAMAGE_APPLY_MODIFIER(ctx->typeEffectivenessModifier); @@ -11446,11 +11594,7 @@ void ClearDamageCalcResults(void) bool32 DoesDestinyBondFail(u32 battler) { - if (B_DESTINY_BOND_FAIL >= GEN_7 - && GetMoveEffect(gLastLandedMoves[battler]) == EFFECT_DESTINY_BOND - && GetMoveEffect(gLastResultingMoves[battler]) == EFFECT_DESTINY_BOND) - return TRUE; - return FALSE; + return B_DESTINY_BOND_FAIL >= GEN_7 && gBattleMons[battler].volatiles.destinyBond; } // This check has always to be the last in a condtion statement because of the recording of AI data. @@ -11893,11 +12037,11 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u switch (defAbility) { case ABILITY_SAND_VEIL: - if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) + if (gBattleWeather & B_WEATHER_SANDSTORM && HasWeatherEffect()) calc = (calc * 80) / 100; // 1.2 sand veil loss break; case ABILITY_SNOW_CLOAK: - if (HasWeatherEffect() && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && HasWeatherEffect()) calc = (calc * 80) / 100; // 1.2 snow cloak loss break; case ABILITY_TANGLED_FEET: diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 3816548ba5..03e55ba9f7 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -819,7 +819,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_FIRST_TURN_ONLY] = { - .battleScript = BattleScript_EffectFirstTurnOnly, + .battleScript = BattleScript_EffectHit, .battleTvScore = 4, .encourageEncore = TRUE, }, @@ -1392,7 +1392,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_SUCKER_PUNCH] = { - .battleScript = BattleScript_EffectSuckerPunch, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1531,7 +1531,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_LAST_RESORT] = { - .battleScript = BattleScript_EffectLastResort, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1721,7 +1721,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_MAT_BLOCK] = { - .battleScript = BattleScript_EffectMatBlock, + .battleScript = BattleScript_EffectProtect, .battleTvScore = 0, // TODO: Assign points .encourageEncore = TRUE, }, @@ -1774,7 +1774,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_FAIL_IF_NOT_ARG_TYPE] = { - .battleScript = BattleScript_FailIfNotArgType, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1881,7 +1881,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_AURA_WHEEL] = { - .battleScript = BattleScript_EffectAuraWheel, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -2233,7 +2233,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_STEEL_ROLLER] = { - .battleScript = BattleScript_EffectSteelRoller, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, diff --git a/test/battle/ability/dazzling.c b/test/battle/ability/dazzling.c index 7541b8a566..19cd3db0e1 100644 --- a/test/battle/ability/dazzling.c +++ b/test/battle/ability/dazzling.c @@ -96,3 +96,25 @@ SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect from all mu } } } + +SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail prevent Protean activation") +{ + u32 species, ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_WATER_SHURIKEN); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_SHURIKEN, player); + ABILITY_POPUP(player, ABILITY_PROTEAN); + } + ABILITY_POPUP(opponent, ability); + } +} diff --git a/test/battle/ability/teraform_zero.c b/test/battle/ability/teraform_zero.c index 96186f2047..9304041164 100644 --- a/test/battle/ability/teraform_zero.c +++ b/test/battle/ability/teraform_zero.c @@ -44,6 +44,7 @@ SINGLE_BATTLE_TEST("Teraform Zero can be replaced") PLAYER(SPECIES_TERAPAGOS); OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_PRANKSTER); } } WHEN { + TURN { MOVE(opponent, MOVE_POUND); } TURN { MOVE(opponent, MOVE_WORRY_SEED); MOVE(player, MOVE_REST, gimmick: GIMMICK_TERA); } } SCENE { MESSAGE("The opposing Whimsicott used Worry Seed!"); diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 8220fee053..e0a13971be 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -903,7 +903,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Mindstorm sets up Psychic Terrain") } SCENE { MESSAGE("The opposing Wobbuffet used Extreme Speed!"); MESSAGE("Wobbuffet used Max Mindstorm!"); - MESSAGE("The opposing Wobbuffet cannot use Extreme Speed!"); + MESSAGE("Wobbuffet is protected by the Psychic Terrain!"); MESSAGE("Wobbuffet used Max Mindstorm!"); } } @@ -1648,18 +1648,5 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamax is reverted before switch out") } } -SINGLE_BATTLE_TEST("Dynamax: Destiny Bond fails if a dynamaxed battler is present on field") -{ - GIVEN { - ASSUME(GetMoveEffect(MOVE_DESTINY_BOND) == EFFECT_DESTINY_BOND); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } - } SCENE { - MESSAGE("The move was blocked by the power of Dynamax!"); - } -} - TO_DO_BATTLE_TEST("Dynamax: Contrary inverts stat-lowering Max Moves, without showing a message") TO_DO_BATTLE_TEST("Dynamax: Contrary inverts stat-increasing Max Moves, without showing a message") diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 1cea196ae7..e1acb4e406 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -588,7 +588,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Genesis Supernova sets up psychic terrain") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_GENESIS_SUPERNOVA, player); NOT { ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, player); } - MESSAGE("Mew cannot use Quick Attack!"); + MESSAGE("The opposing Wobbuffet is protected by the Psychic Terrain!"); } } diff --git a/test/battle/move_effect/aurora_veil.c b/test/battle/move_effect/aurora_veil.c index b57c85df06..1b480ad1ed 100644 --- a/test/battle/move_effect/aurora_veil.c +++ b/test/battle/move_effect/aurora_veil.c @@ -25,6 +25,35 @@ SINGLE_BATTLE_TEST("Aurora Veil can only be used in Hail and Snow") } } +SINGLE_BATTLE_TEST("Aurora Veil will prevent Protean activation if it fails due to no Snow/Hail") +{ + GIVEN { + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AURORA_VEIL); } + } SCENE { + MESSAGE("But it failed!"); + NOT ABILITY_POPUP(player, ABILITY_PROTEAN); + } +} + +SINGLE_BATTLE_TEST("Aurora Veil wont prevent Protean activation when it fails due to being set up already") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SNOWSCAPE); MOVE(player, MOVE_AURORA_VEIL); } + TURN { SWITCH(player, 1); } + TURN { MOVE(player, MOVE_AURORA_VEIL); } + } SCENE { + ABILITY_POPUP(player, ABILITY_PROTEAN); + MESSAGE("But it failed!"); + } +} + TO_DO_BATTLE_TEST("Aurora Veil reduces damage done to the user by half in singles") TO_DO_BATTLE_TEST("Aurora Veil reduces damage done to the user by roughly a third in doubles") TO_DO_BATTLE_TEST("Aurora Veil's damage reduction is ignored by Critical Hits") diff --git a/test/battle/move_effect/clangorous_soul.c b/test/battle/move_effect/clangorous_soul.c index 17e57d7dd5..a1a7ffa42a 100644 --- a/test/battle/move_effect/clangorous_soul.c +++ b/test/battle/move_effect/clangorous_soul.c @@ -1,11 +1,52 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Attack by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Defense by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Sp. Attack by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Sp. Defense by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul raises the user's Speed by 1 stage"); -TO_DO_BATTLE_TEST("Clangorous Soul cuts the user's HP by 1/3"); +SINGLE_BATTLE_TEST("Clangorous Soul cuts the user's HP by 1/3") +{ + s16 dmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CLANGOROUS_SOUL, player); + HP_BAR(player, captureDamage: &dmg); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(gBattleMons[0].maxHP / 3, dmg); + } +} + +SINGLE_BATTLE_TEST("Clangorous Soul raises the user's Atk, Def, Sp. Atk. Sp. Def and Speed by 1 stage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CLANGOROUS_SOUL, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Clangorous Soul fails if the user's HP is less or equal than 1/3") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(300); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CLANGOROUS_SOUL, player); + } +} + TO_DO_BATTLE_TEST("Clangorous Soul fails if Attack, Defense, Sp. Attack, Sp. Defense and Speed are all maxed out"); -TO_DO_BATTLE_TEST("Clangorous Soul fails if the user's HP is less or equal than 1/3"); diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index c1371d393d..4be65a5677 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -42,7 +42,6 @@ TO_DO_BATTLE_TEST("Burn Up doesn't thaw the user if it fails due to the user not SINGLE_BATTLE_TEST("Burn Up fails if the user has Protean/Libero and is not a Fire-type") { - KNOWN_FAILING; GIVEN { WITH_CONFIG(GEN_PROTEAN_LIBERO, GEN_6); PLAYER(SPECIES_REGIROCK); diff --git a/test/battle/move_effect/no_retreat.c b/test/battle/move_effect/no_retreat.c index bf2a15dfbf..fa944ab776 100644 --- a/test/battle/move_effect/no_retreat.c +++ b/test/battle/move_effect/no_retreat.c @@ -2,3 +2,60 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write No Retreat (Move Effect) test titles") + +SINGLE_BATTLE_TEST("No Retreat raises user's Atk/Def/Sp.Atk/Sp.Def/Speed unless No Retreat was already used by user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_NO_RETREAT); } + TURN { MOVE(player, MOVE_NO_RETREAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + bool32 escapePrevention = gBattleMons[0].volatiles.escapePrevention; + EXPECT_EQ(escapePrevention, TRUE); + } +} + +// Question: If No Retreat is used is the mon blocking the switch out changed? +SINGLE_BATTLE_TEST("No Retreat won't fail if user is prevented from escaping") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_MEAN_LOOK); MOVE(player, MOVE_NO_RETREAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEAN_LOOK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } +} + +SINGLE_BATTLE_TEST("No Retreat won't activate Protean if it fails due to already being used by the user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + } WHEN { + TURN { MOVE(player, MOVE_NO_RETREAT); MOVE(opponent, MOVE_SKILL_SWAP); } + TURN { MOVE(player, MOVE_NO_RETREAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SKILL_SWAP, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NO_RETREAT, player); + ABILITY_POPUP(player, ABILITY_PROTEAN); + } + } +} diff --git a/test/battle/move_effect/psychic_terrain.c b/test/battle/move_effect/psychic_terrain.c index b85653a0be..40df878a1f 100644 --- a/test/battle/move_effect/psychic_terrain.c +++ b/test/battle/move_effect/psychic_terrain.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Psychic Terrain protects grounded battlers from priority mov TURN { MOVE(player, MOVE_QUICK_ATTACK); MOVE(opponent, MOVE_QUICK_ATTACK); } } SCENE { MESSAGE("Claydol used Psychic Terrain!"); - MESSAGE("Claydol cannot use Quick Attack!"); + MESSAGE("The opposing Wobbuffet is protected by the Psychic Terrain!"); NOT { HP_BAR(opponent); } MESSAGE("The opposing Wobbuffet used Quick Attack!"); HP_BAR(player); @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Psychic Terrain increases power of Psychic-type moves by 30/ } } -SINGLE_BATTLE_TEST("Psychic Terrain doesn't block priority moves that target the user") +SINGLE_BATTLE_TEST("Psychic Terrain doesn't blocks priority moves that target the user") { GIVEN { PLAYER(SPECIES_SABLEYE) { Ability(ABILITY_PRANKSTER); HP(1); } @@ -142,3 +142,37 @@ SINGLE_BATTLE_TEST("Psychic Terrain lasts for 5 turns") MESSAGE("The weirdness disappeared from the battlefield!"); } } + +DOUBLE_BATTLE_TEST("Psychic Terrain protects grounded battlers from priority moves in doubles - Left") +{ + GIVEN { + PLAYER(SPECIES_CLAYDOL) { Ability(ABILITY_LEVITATE); } + PLAYER(SPECIES_TAPU_LELE) { Ability(ABILITY_PSYCHIC_SURGE); } + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_COTTON_SPORE); } + } SCENE { + ABILITY_POPUP(playerRight, ABILITY_PSYCHIC_SURGE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COTTON_SPORE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } +} + +DOUBLE_BATTLE_TEST("Psychic Terrain protects grounded battlers from priority moves in doubles - Right") +{ + GIVEN { + PLAYER(SPECIES_TAPU_LELE) { Ability(ABILITY_PSYCHIC_SURGE); } + PLAYER(SPECIES_CLAYDOL) { Ability(ABILITY_LEVITATE); } + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_COTTON_SPORE); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_PSYCHIC_SURGE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COTTON_SPORE, opponentLeft); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } +} diff --git a/test/battle/move_effect/stockpile.c b/test/battle/move_effect/stockpile.c index 907643a1bd..e18c97fc57 100644 --- a/test/battle/move_effect/stockpile.c +++ b/test/battle/move_effect/stockpile.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Stockpile's count can go up only to 3") MESSAGE("Wobbuffet stockpiled 3!"); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_STOCKPILE, player); - MESSAGE("Wobbuffet can't stockpile any more!"); + MESSAGE("But it failed!"); } } @@ -49,9 +49,9 @@ SINGLE_BATTLE_TEST("Spit Up and Swallow don't work if used without Stockpile") } SCENE { NOT ANIMATION(ANIM_TYPE_MOVE, move, player); if (move == MOVE_SWALLOW) - MESSAGE("But it failed to swallow a thing!"); + MESSAGE("But it failed!"); else - MESSAGE("But it failed to spit up a thing!"); + MESSAGE("But it failed!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_STOCKPILE, player); MESSAGE("Wobbuffet stockpiled 1!"); From 6096f97f3f506f89c3f53d3af60dc5b66d95dfb5 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Tue, 16 Sep 2025 18:40:25 +0100 Subject: [PATCH 040/183] Fixes AI scoring when Priority moves are blocked (#7745) --- src/battle_ai_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 25971437bc..6cc42f482c 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1142,7 +1142,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!(moveTarget & MOVE_TARGET_USER)) { if (Ai_IsPriorityBlocked(battlerAtk, battlerDef, move, aiData)) - return TRUE; + RETURN_SCORE_MINUS(20); if (CanAbilityBlockMove(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) RETURN_SCORE_MINUS(20); From e92598e9e87f4bf775a39fce772e40ae3932de9c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 19 Sep 2025 20:07:24 +0200 Subject: [PATCH 041/183] Fix up end turn scripts plus small documentation (#7758) --- data/battle_scripts_1.s | 35 ++++++++++++++++++++++------------- include/battle_scripts.h | 2 ++ src/battle_end_turn.c | 13 +++++++++++++ src/battle_util.c | 30 +++++++++++++++--------------- 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c9ccb48d0c..f85a077c8a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4902,7 +4902,7 @@ BattleScript_IceBodyHeal:: datahpupdate BS_ATTACKER printstring STRINGID_ICEBODYHPGAIN waitmessage B_WAIT_TIME_LONG - end3 + end2 BattleScript_OverworldStatusStarts:: printfromtable gStartingStatusStringIds @@ -5918,7 +5918,7 @@ BattleScript_PowerConstruct:: handleformchange BS_SCRIPTING, 2 printstring STRINGID_POWERCONSTRUCTTRANSFORM waitmessage B_WAIT_TIME_SHORT - end3 + end2 BattleScript_UltraBurst:: flushtextbox @@ -5956,7 +5956,11 @@ BattleScript_BattlerFormChangeEnd3:: BattleScript_BattlerFormChangeEnd3NoPopup:: call BattleScript_BattlerFormChangeNoPopup - end3 + end2 + +BattleScript_BattlerFormChangeEnd2:: + call BattleScript_BattlerFormChange + end2 BattleScript_BattlerFormChangeWithStringEnd3:: pause 5 @@ -5987,7 +5991,7 @@ BattleScript_BallFetch:: call BattleScript_AbilityPopUp printstring STRINGID_FETCHEDPOKEBALL waitmessage B_WAIT_TIME_LONG - end3 + end2 BattleScript_CudChewActivates:: pause B_WAIT_TIME_SHORTEST @@ -5995,7 +5999,7 @@ BattleScript_CudChewActivates:: setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries consumeberry BS_ATTACKER, FALSE setbyte sBERRY_OVERRIDE, 0 - end3 + end2 BattleScript_ApplyDisguiseFormChangeHPLoss:: jumpifgenconfiglowerthan GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn @@ -6564,7 +6568,7 @@ BattleScript_MoodyLower: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_MoodyEnd: - end3 + end2 BattleScript_EmergencyExit:: pause 5 @@ -6655,7 +6659,7 @@ BattleScript_AbilityHpHeal: BattleScript_RainDishActivates:: call BattleScript_AbilityHpHeal - end3 + end2 BattleScript_CheekPouchActivates:: copybyte sSAVED_BATTLER, gBattlerAttacker @@ -6672,7 +6676,7 @@ BattleScript_PickupActivates:: waitmessage B_WAIT_TIME_LONG tryrestorehpberry BattleScript_PickupActivatesEnd: - end3 + end2 BattleScript_HarvestActivates:: pause 5 @@ -6682,7 +6686,7 @@ BattleScript_HarvestActivates:: waitmessage B_WAIT_TIME_LONG tryrestorehpberry BattleScript_HarvestActivatesEnd: - end3 + end2 BattleScript_SolarPowerActivates:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE @@ -6692,7 +6696,7 @@ BattleScript_SolarPowerActivates:: printstring STRINGID_SOLARPOWERHPDROP waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER - end3 + end2 BattleScript_HealerActivates:: call BattleScript_AbilityPopUp @@ -6700,7 +6704,7 @@ BattleScript_HealerActivates:: updatestatusicon BS_SCRIPTING printstring STRINGID_HEALERCURE waitmessage B_WAIT_TIME_LONG - end3 + end2 BattleScript_SandstreamActivates:: pause B_WAIT_TIME_SHORT @@ -6725,7 +6729,7 @@ BattleScript_ShedSkinActivates:: printstring STRINGID_PKMNSXCUREDYPROBLEM waitmessage B_WAIT_TIME_LONG updatestatusicon BS_ATTACKER - end3 + end2 BattleScript_ActivateWeatherAbilities: saveattacker @@ -7089,7 +7093,7 @@ BattleScript_BadDreamsIncrement: destroyabilitypopup pause 15 BattleScript_BadDreamsEnd: - end3 + end2 BattleScript_BadDreams_ShowPopUp: copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp @@ -7423,6 +7427,11 @@ BattleScript_AttackerAbilityStatRaiseEnd3:: restoreattacker end3 +BattleScript_AttackerAbilityStatRaiseEnd2:: + call BattleScript_AttackerAbilityStatRaise + restoreattacker + end2 + BattleScript_SwitchInAbilityMsg:: call BattleScript_AbilityPopUp printfromtable gSwitchInAbilityStringIds diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 3ba335db44..c1b83c5f70 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -277,6 +277,7 @@ extern const u8 BattleScript_MoveStatDrain[]; extern const u8 BattleScript_TargetsStatWasMaxedOut[]; extern const u8 BattleScript_AttackerAbilityStatRaise[]; extern const u8 BattleScript_AttackerAbilityStatRaiseEnd3[]; +extern const u8 BattleScript_AttackerAbilityStatRaiseEnd2[]; extern const u8 BattleScript_PoisonHealActivates[]; extern const u8 BattleScript_BadDreamsActivates[]; extern const u8 BattleScript_SwitchInAbilityMsg[]; @@ -365,6 +366,7 @@ extern const u8 BattleScript_IllusionOffAndTerastallization[]; extern const u8 BattleScript_DancerActivates[]; extern const u8 BattleScript_AftermathDmg[]; extern const u8 BattleScript_BattlerFormChange[]; +extern const u8 BattleScript_BattlerFormChangeEnd2[]; extern const u8 BattleScript_BattlerFormChangeEnd3[]; extern const u8 BattleScript_AttackerFormChangeWithString[]; extern const u8 BattleScript_BattlerFormChangeWithStringEnd3[]; diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 85a77399c0..66dd1adf7c 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -1530,6 +1530,19 @@ static bool32 HandleEndTurnDynamax(u32 battler) return effect; } +/* + * Various end turn effects that happen after all battlers moved. + * Each Case will apply the effects for each battler. Moving to the next case when all battlers are done. + * If an effect is going to be applied on a better, the bool effect will be set to TRUE and a script set. + * The script is set with `BattleScriptExecute` and should have the ending `end2` + Example: + BattleScriptExecute(BattleScript_X); + + (in battle_scripts_1.s) + BattleScript_X: + some commands + end2 + */ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = { [ENDTURN_ORDER] = HandleEndTurnOrder, diff --git a/src/battle_util.c b/src/battle_util.c index f838cc5fce..4a2933b7b2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4509,7 +4509,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { gBattlerTarget = RandomUniformExcept(RNG_PICKUP, 0, gBattlersCount - 1, CantPickupItem); gLastUsedItem = GetUsedHeldItem(gBattlerTarget); - BattleScriptPushCursorAndCallback(BattleScript_PickupActivates); + BattleScriptExecute(BattleScript_PickupActivates); effect++; } break; @@ -4520,7 +4520,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) { gLastUsedItem = GetUsedHeldItem(battler); - BattleScriptPushCursorAndCallback(BattleScript_HarvestActivates); + BattleScriptExecute(BattleScript_HarvestActivates); effect++; } break; @@ -4531,7 +4531,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER && !gBattleMons[battler].volatiles.healBlock) { - BattleScriptPushCursorAndCallback(BattleScript_IceBodyHeal); + BattleScriptExecute(BattleScript_IceBodyHeal); gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; if (gBattleStruct->moveDamage[battler] == 0) gBattleStruct->moveDamage[battler] = 1; @@ -4548,7 +4548,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock) { - BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates); + BattleScriptExecute(BattleScript_RainDishActivates); gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); if (gBattleStruct->moveDamage[battler] == 0) gBattleStruct->moveDamage[battler] = 1; @@ -4586,7 +4586,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattleMons[battler].status1 = 0; gBattleMons[battler].volatiles.nightmare = FALSE; gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); + BattleScriptExecute(BattleScript_ShedSkinActivates); BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(battler); effect++; @@ -4597,7 +4597,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { SaveBattlerAttacker(gBattlerAttacker); SET_STATCHANGER(STAT_SPEED, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3); + BattleScriptExecute(BattleScript_AttackerAbilityStatRaiseEnd2); gBattleScripting.battler = battler; effect++; } @@ -4629,7 +4629,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 i = RandomUniformExcept(RNG_MOODY_DECREASE, STAT_ATK, statsNum - 1, MoodyCantLowerStat); SET_STATCHANGER2(gBattleScripting.savedStatChanger, i, 1, TRUE); } - BattleScriptPushCursorAndCallback(BattleScript_MoodyActivates); + BattleScriptExecute(BattleScript_MoodyActivates); effect++; } break; @@ -4644,14 +4644,14 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_BAD_DREAMS: - BattleScriptPushCursorAndCallback(BattleScript_BadDreamsActivates); + BattleScriptExecute(BattleScript_BadDreamsActivates); effect++; break; case ABILITY_SOLAR_POWER: if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) { SOLAR_POWER_HP_DROP: - BattleScriptPushCursorAndCallback(BattleScript_SolarPowerActivates); + BattleScriptExecute(BattleScript_SolarPowerActivates); gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; if (gBattleStruct->moveDamage[battler] == 0) gBattleStruct->moveDamage[battler] = 1; @@ -4664,7 +4664,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && gBattleMons[gBattleScripting.battler].status1 & STATUS1_ANY && RandomPercentage(RNG_HEALER, 30)) { - BattleScriptPushCursorAndCallback(BattleScript_HealerActivates); + BattleScriptExecute(BattleScript_HealerActivates); effect++; } break; @@ -4677,7 +4677,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeEnd3); + BattleScriptExecute(BattleScript_BattlerFormChangeEnd2); effect++; } break; @@ -4685,7 +4685,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_PowerConstruct); + BattleScriptExecute(BattleScript_PowerConstruct); effect++; } break; @@ -4699,7 +4699,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 MarkBattlerForControllerExec(battler); gHasFetchedBall = TRUE; gLastUsedItem = gLastUsedBall; - BattleScriptPushCursorAndCallback(BattleScript_BallFetch); + BattleScriptExecute(BattleScript_BallFetch); effect++; } break; @@ -4709,7 +4709,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_TURN_END)) { gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeEnd3NoPopup); + BattleScriptExecute(BattleScript_BattlerFormChangeEnd3NoPopup); effect++; } break; @@ -4720,7 +4720,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gDisableStructs[battler].cudChew = FALSE; gLastUsedItem = gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = ITEM_NONE; - BattleScriptPushCursorAndCallback(BattleScript_CudChewActivates); + BattleScriptExecute(BattleScript_CudChewActivates); effect++; } else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) From a55d6035024a186069c2bcd685559b2ee4fd53e9 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 19 Sep 2025 14:50:13 -0400 Subject: [PATCH 042/183] AI sees dynamic moves and Nature Power as correct types for weather, terrain (#7759) --- include/battle_ai_util.h | 4 ++-- src/battle_ai_util.c | 24 ++++++++++++++++-------- test/battle/ai/ai_check_viability.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index b2e191c17f..1e5cb325e6 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -121,8 +121,8 @@ u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon); enum WeatherState IsWeatherActive(u32 flags); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, enum DamageCalcContext calcContext); -bool32 HasDamagingMove(u32 battlerId); -bool32 HasDamagingMoveOfType(u32 battlerId, u32 type); +bool32 HasDamagingMove(u32 battler); +bool32 HasDamagingMoveOfType(u32 battler, u32 type); u32 GetBattlerSecondaryDamage(u32 battlerId); bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability); bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dfc305ec5b..38e8d341a5 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2929,30 +2929,38 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) return FALSE; } -bool32 HasDamagingMove(u32 battlerId) +bool32 HasDamagingMove(u32 battler) { u32 i; - u16 *moves = GetMovesArray(battlerId); + u16 *moves = GetMovesArray(battler); for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && !IsBattleMoveStatus(moves[i])) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMovePower(moves[i]) > 0) return TRUE; } return FALSE; } -bool32 HasDamagingMoveOfType(u32 battlerId, u32 type) +bool32 HasDamagingMoveOfType(u32 battler, u32 type) { s32 i; - u16 *moves = GetMovesArray(battlerId); + u16 *moves = GetMovesArray(battler); for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && GetMoveType(moves[i]) == type && !IsBattleMoveStatus(moves[i])) - return TRUE; + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMovePower(moves[i]) > 0) + { + u32 moveType = GetDynamicMoveType(GetBattlerMon(battler), moves[i], battler, MON_IN_BATTLE); + + if (moveType != TYPE_NONE && type == moveType) + return TRUE; + if (GetMoveType(moves[i]) == type) + return TRUE; + if (GetMoveEffect(moves[i]) == EFFECT_NATURE_POWER && GetMoveType(GetNaturePowerMove(moves[i])) == type) + return TRUE; + } } return FALSE; diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 6d16d4fb6e..5583c3b38f 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -409,3 +409,32 @@ AI_SINGLE_BATTLE_TEST("AI sees Shield Dust immunity to additional effects") TURN { EXPECT_MOVE(opponent, MOVE_CHILLING_WATER); } } } + +AI_DOUBLE_BATTLE_TEST("AI sees type-changing moves as the correct type") +{ + u32 species, fieldStatus, ability; + u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; + + PARAMETRIZE { fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_NONE; } + PARAMETRIZE { fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_LIQUID_VOICE; } + PARAMETRIZE { fieldStatus = MOVE_ELECTRIC_TERRAIN; species = SPECIES_GEODUDE_ALOLA; ability = ABILITY_GALVANIZE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_NONE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + fieldStatus = MOVE_RAIN_DANCE; species = SPECIES_PRIMARINA; ability = ABILITY_LIQUID_VOICE; } + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + fieldStatus = MOVE_ELECTRIC_TERRAIN; species = SPECIES_GEODUDE_ALOLA; ability = ABILITY_GALVANIZE; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(fieldStatus, MOVE_RETURN, MOVE_TAUNT); } + OPPONENT(species) { Ability(ability); Moves(MOVE_HYPER_VOICE); } + } WHEN { + if (ability != ABILITY_NONE) + TURN { EXPECT_MOVE(opponentLeft, fieldStatus); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, fieldStatus); } + } +} From 6a4f92390491712879d9c0c2c10df1ce68370fa4 Mon Sep 17 00:00:00 2001 From: mudskipper13 <105766191+mudskipper13@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:17:47 +0700 Subject: [PATCH 043/183] `field_name_box` smol followup (#7762) Co-authored-by: Bassoonian --- include/field_name_box.h | 9 ++++++--- src/field_message_box.c | 4 ++-- src/field_name_box.c | 35 ++++++++++++++++++----------------- src/match_call.c | 2 +- src/text.c | 2 +- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/include/field_name_box.h b/include/field_name_box.h index 7732fa3418..f139cd21dc 100644 --- a/include/field_name_box.h +++ b/include/field_name_box.h @@ -1,17 +1,20 @@ #ifndef GUARD_FIELD_NAME_BOX_H #define GUARD_FIELD_NAME_BOX_H +#define NAME_BOX_BASE_TILES_TOTAL (6) // Total tiles within the namebox's .png, best practice to make all images uses the same total tiles. +#define NAME_BOX_BASE_TILE_NUM (0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT)) + extern EWRAM_DATA const u8 *gSpeakerName; extern const u8 *const gSpeakerNamesTable[]; -void TrySpawnNamebox(void); +void TrySpawnNamebox(u32 tileNum); u32 GetNameboxWindowId(void); void DestroyNamebox(void); void FillNamebox(void); -void DrawNamebox(u32 windowId, bool32 copyToVram); +void DrawNamebox(u32 windowId, u32 tileNum, bool32 copyToVram); void ClearNamebox(u32 windowId, bool32 copyToVram); void SetSpeakerName(const u8 *name); u32 GetNameboxWidth(void); -void TrySpawnAndShowNamebox(const u8 *speaker); +void TrySpawnAndShowNamebox(const u8 *speaker, u32 tileNum); #endif // GUARD_FIELD_NAME_BOX_H diff --git a/src/field_message_box.c b/src/field_message_box.c index 7a8d4bed10..d0aa412d65 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -43,7 +43,7 @@ static void Task_DrawFieldMessage(u8 taskId) u32 nameboxWinId = GetNameboxWindowId(); DrawDialogueFrame(0, TRUE); if (nameboxWinId != WINDOW_NONE) - DrawNamebox(nameboxWinId, TRUE); + DrawNamebox(nameboxWinId, NAME_BOX_BASE_TILE_NUM, TRUE); task->tState++; break; case 2: @@ -127,7 +127,7 @@ bool8 ShowFieldMessageFromBuffer(void) static void ExpandStringAndStartDrawFieldMessage(const u8 *str, bool32 allowSkippingDelayWithButtonPress) { - TrySpawnNamebox(); + TrySpawnNamebox(NAME_BOX_BASE_TILE_NUM); StringExpandPlaceholders(gStringVar4, str); AddTextPrinterForMessage(allowSkippingDelayWithButtonPress); CreateTask_DrawFieldMessage(); diff --git a/src/field_name_box.c b/src/field_name_box.c index 709dc4546f..a3deb84b13 100644 --- a/src/field_name_box.c +++ b/src/field_name_box.c @@ -17,19 +17,16 @@ #include "constants/speaker_names.h" #include "data/speaker_names.h" -#define NAME_BOX_BASE_TILE_TOTAL (6) -#define NAME_BOX_BASE_TILE_NUM (0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT) - NAME_BOX_BASE_TILE_TOTAL) - static EWRAM_INIT u8 sNameboxWindowId = WINDOW_NONE; EWRAM_DATA const u8 *gSpeakerName = NULL; static const u32 sNameBoxDefaultGfx[] = INCBIN_U32("graphics/text_window/name_box.4bpp"); static const u32 sNameBoxPokenavGfx[] = INCBIN_U32("graphics/pokenav/name_box.4bpp"); -static void WindowFunc_DrawNamebox(u8, u8, u8, u8, u8, u8); +static void WindowFunc_DrawNamebox(u32, u32, u32, u32, u32, u32, u32); static void WindowFunc_ClearNamebox(u8, u8, u8, u8, u8, u8); -void TrySpawnNamebox(void) +void TrySpawnNamebox(u32 tileNum) { u8 *strbuf = AllocZeroed(32 * sizeof(u8)); if ((OW_FLAG_SUPPRESS_NAME_BOX != 0 && FlagGet(OW_FLAG_SUPPRESS_NAME_BOX)) || gSpeakerName == NULL || !strbuf) @@ -70,7 +67,7 @@ void TrySpawnNamebox(void) .width = winWidth, .height = OW_NAME_BOX_DEFAULT_HEIGHT, .paletteNum = matchCall ? 14 : DLG_WINDOW_PALETTE_NUM, - .baseBlock = 0x194 - (OW_NAME_BOX_DEFAULT_WIDTH * OW_NAME_BOX_DEFAULT_HEIGHT), + .baseBlock = tileNum, }; sNameboxWindowId = AddWindow(&template); @@ -136,10 +133,14 @@ void FillNamebox(void) } } -void DrawNamebox(u32 windowId, bool32 copyToVram) +void DrawNamebox(u32 windowId, u32 tileNum, bool32 copyToVram) { - LoadBgTiles(GetWindowAttribute(sNameboxWindowId, WINDOW_BG), GetNameboxGraphics(), 0x0C0, NAME_BOX_BASE_TILE_NUM); - CallWindowFunction(windowId, WindowFunc_DrawNamebox); + // manual instead of using CallWindowFunction for extra tileNum param + struct WindowTemplate *w = &gWindows[windowId].window; + u32 size = TILE_OFFSET_4BPP(NAME_BOX_BASE_TILES_TOTAL); + + LoadBgTiles(GetWindowAttribute(sNameboxWindowId, WINDOW_BG), GetNameboxGraphics(), size, tileNum); + WindowFunc_DrawNamebox(w->bg, w->tilemapLeft, w->tilemapTop, w->width, w->height, w->paletteNum, tileNum); PutWindowTilemap(windowId); if (copyToVram == TRUE) CopyWindowToVram(windowId, COPYWIN_FULL); @@ -153,15 +154,15 @@ void ClearNamebox(u32 windowId, bool32 copyToVram) CopyWindowToVram(windowId, COPYWIN_FULL); } -static void WindowFunc_DrawNamebox(u8 bg, u8 L, u8 T, u8 w, u8 h, u8 p) +static void WindowFunc_DrawNamebox(u32 bg, u32 L, u32 T, u32 w, u32 h, u32 p, u32 tileNum) { // left-most - FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM, L - 1, T, 1, 1, p); - FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 3, L - 1, T + 1, 1, 1, p); + FillBgTilemapBufferRect(bg, tileNum, L - 1, T, 1, 1, p); + FillBgTilemapBufferRect(bg, tileNum + 3, L - 1, T + 1, 1, 1, p); // right-most - FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 2, L + w, T, 1, 1, p); - FillBgTilemapBufferRect(bg, NAME_BOX_BASE_TILE_NUM + 5, L + w, T + 1, 1, 1, p); + FillBgTilemapBufferRect(bg, tileNum + 2, L + w, T, 1, 1, p); + FillBgTilemapBufferRect(bg, tileNum + 5, L + w, T + 1, 1, 1, p); } static void WindowFunc_ClearNamebox(u8 bg, u8 L, u8 T, u8 w, u8 h, u8 p) @@ -183,12 +184,12 @@ void SetSpeaker(struct ScriptContext *ctx) } // useful for other context e.g. match call -void TrySpawnAndShowNamebox(const u8 *speaker) +void TrySpawnAndShowNamebox(const u8 *speaker, u32 tileNum) { gSpeakerName = speaker; - TrySpawnNamebox(); + TrySpawnNamebox(tileNum); if (sNameboxWindowId != WINDOW_NONE) - DrawNamebox(sNameboxWindowId, TRUE); + DrawNamebox(sNameboxWindowId, tileNum - NAME_BOX_BASE_TILES_TOTAL, TRUE); else // either NULL or SP_NAME_NONE RedrawDialogueFrame(); } diff --git a/src/match_call.c b/src/match_call.c index e828dac999..f1f518b3c9 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1326,7 +1326,7 @@ static bool32 MatchCall_PrintIntro(u8 taskId) if (!sMatchCallState.triggeredFromScript) SelectMatchCallMessage(sMatchCallState.trainerId, gStringVar4); - TrySpawnAndShowNamebox(gSpeakerName); + TrySpawnAndShowNamebox(gSpeakerName, NAME_BOX_BASE_TILE_NUM); InitMatchCallTextPrinter(tWindowId, gStringVar4); return TRUE; } diff --git a/src/text.c b/src/text.c index be19272fe5..7d24700068 100644 --- a/src/text.c +++ b/src/text.c @@ -1233,7 +1233,7 @@ static u16 RenderText(struct TextPrinter *textPrinter) case EXT_CTRL_CODE_SPEAKER: { enum SpeakerNames name = *textPrinter->printerTemplate.currentChar++; - TrySpawnAndShowNamebox(gSpeakerNamesTable[name]); + TrySpawnAndShowNamebox(gSpeakerNamesTable[name], NAME_BOX_BASE_TILE_NUM); return RENDER_REPEAT; } From db3405dc3ad831cd1d282258b7f5282f11341498 Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Sat, 20 Sep 2025 05:18:55 -0400 Subject: [PATCH 044/183] Added COMPOUND_STRINGs to region_map_entries.h (#7669) --- .../region_map/region_map_sections.json.txt | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/data/region_map/region_map_sections.json.txt b/src/data/region_map/region_map_sections.json.txt index 0da2d31794..5c532a050a 100644 --- a/src/data/region_map/region_map_sections.json.txt +++ b/src/data/region_map/region_map_sections.json.txt @@ -2,21 +2,6 @@ #ifndef GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H #define GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H -## for map_section in map_sections -{% if existsIn(map_section, "name") and isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.id) }}{% endif %} -## endfor - -## for map_section in map_sections -{% if existsIn(map_section, "name") %} -{% if getVar(map_section.name) == map_section.id %} -static const u8 sMapName_{{ cleanString(map_section.name) }}[] = _("{{ map_section.name }}"); -{% endif %} -{% if existsIn(map_section, "name_clone") %} -static const u8 sMapName_{{ cleanString(map_section.name) }}_Clone[] = _("{{ map_section.name }}"); -{% endif %} -{% endif %} -## endfor - const struct RegionMapLocation gRegionMapEntries[] = { ## for map_section in map_sections [{{ map_section.id }}] = { @@ -41,7 +26,7 @@ const struct RegionMapLocation gRegionMapEntries[] = { .height = 1, {% endif %} {% if existsIn(map_section, "name") %} - .name = sMapName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, "name_clone") %}_Clone{% endif %}, + .name = COMPOUND_STRING("{{ map_section.name }}"), {% else %} .name = (const u8[])_(""), {% endif %} From 40ffcfb94aa4c3ae13d13237f746b7254c43c24e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 20 Sep 2025 11:19:25 +0200 Subject: [PATCH 045/183] Remove redundant function call (#7752) --- src/battle_util.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 4a2933b7b2..3d880b6f39 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2885,8 +2885,7 @@ static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; gBattleStruct->noResultString[battlerDef] = WILL_FAIL; } - else if (CanAbilityBlockMove(ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, ctx->currentMove, CHECK_TRIGGER) - || (IsBattlerTerrainAffected(ctx->battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && GetBattleMovePriority(ctx->battlerAtk, abilityAtk, gCurrentMove) > 0)) + else if (CanAbilityBlockMove(ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, ctx->currentMove, CHECK_TRIGGER)) { gBattleStruct->moveResultFlags[battlerDef] = 0; gBattleStruct->noResultString[battlerDef] = WILL_FAIL; From 7aad95ae6326ec256417577f3cb4feb02391e449 Mon Sep 17 00:00:00 2001 From: Cooper McDonald Date: Sat, 20 Sep 2025 04:21:40 -0500 Subject: [PATCH 046/183] Fix Critical Capture RNG and Catching Charm boost (#7534) --- include/config/battle.h | 2 +- src/battle_script_commands.c | 38 +++++++++++++++++++----------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index 6f48f0fc19..1e90fecd1e 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -286,7 +286,7 @@ // Catching settings #define B_SEMI_INVULNERABLE_CATCH GEN_LATEST // In Gen4+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) -#define B_CATCHING_CHARM_BOOST 20 // % boost in Critical Capture odds if player has the Catching Charm. +#define B_CATCHING_CHARM_BOOST 100 // % boost in Critical Capture odds if player has the Catching Charm. #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. #define B_CRITICAL_CAPTURE_LOCAL_DEX TRUE // If set to FALSE, Critical Capture % is based off of the National Pokedex estimated by enabled generations. #define B_CRITICAL_CAPTURE_IF_OWNED GEN_LATEST // In Gen9, a capture appear critical if the pokemon you are trying to catch already has a dex entry (has already been caught) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ef38192cf6..796d966050 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -14372,6 +14372,7 @@ static bool32 CriticalCapture(u32 odds) { u32 numCaught; u32 totalDexCount; + u32 charmBoost = 1; if (B_CRITICAL_CAPTURE == FALSE) return FALSE; @@ -14381,27 +14382,28 @@ static bool32 CriticalCapture(u32 odds) else totalDexCount = NATIONAL_DEX_COUNT; - numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); - - if (numCaught <= (totalDexCount * 30) / 650) - odds = 0; - else if (numCaught <= (totalDexCount * 150) / 650) - odds /= 2; - else if (numCaught <= (totalDexCount * 300) / 650) - ; // odds = (odds * 100) / 100; - else if (numCaught <= (totalDexCount * 450) / 650) - odds = (odds * 150) / 100; - else if (numCaught <= (totalDexCount * 600) / 650) - odds *= 2; - else - odds = (odds * 250) / 100; - if (CheckBagHasItem(ITEM_CATCHING_CHARM, 1)) - odds = (odds * (100 + B_CATCHING_CHARM_BOOST)) / 100; + charmBoost = (100 + B_CATCHING_CHARM_BOOST) / 100; + + numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); + if (numCaught > (totalDexCount * 600) / 650) + odds = (odds * (250 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 450) / 650) + odds = (odds * (200 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 300) / 650) + odds = (odds * (150 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 150) / 650) + odds = (odds * (100 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 30) / 650) + odds = (odds * (50 * charmBoost)) / 100; + else + return FALSE; + + if (odds > 255) + odds = 255; odds /= 6; - - if ((Random() % 255) < odds) + if ((Random() % 256) < odds) return TRUE; return FALSE; From 442e01cbd6611f4d8cdc6fabc33f118f25f58272 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:29:53 +0100 Subject: [PATCH 047/183] CheckForTrainersWantingBattle trainerObjects array now initialized to zero and loop now starts at zero (#7765) --- src/trainer_see.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/trainer_see.c b/src/trainer_see.c index 2fc033004d..3dbf07f8db 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -360,7 +360,7 @@ static const struct SpriteTemplate sSpriteTemplate_Emote = bool8 CheckForTrainersWantingBattle(void) { u8 i; - u8 trainerObjects[OBJECT_EVENTS_COUNT]; + u8 trainerObjects[OBJECT_EVENTS_COUNT] = {0}; u8 trainerObjectsCount = 0; if (FlagGet(OW_FLAG_NO_TRAINER_SEE)) @@ -392,7 +392,7 @@ bool8 CheckForTrainersWantingBattle(void) trainerObjects[j] = x; } - for (i = 1; i <= trainerObjectsCount; i++) + for (i = 0; i <= trainerObjectsCount; i++) { u8 numTrainers; numTrainers = CheckTrainer(trainerObjects[i]); From db7e062fe107a1bdfb17adddd39ec5a10497e6fd Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Sun, 21 Sep 2025 23:27:05 +0200 Subject: [PATCH 048/183] Add some missing move animations to the move animation tests (#7507) --- data/battle_anim_scripts.s | 1 + include/random.h | 2 + include/test/battle.h | 5 +- src/battle_script_commands.c | 4 +- test/battle/ability/sheer_force.c | 4 +- test/battle/move_animations/all_anims.c | 527 +++++++++++++++++++++--- test/test_runner_battle.c | 11 +- 7 files changed, 487 insertions(+), 67 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 1d05258dcf..de752be59b 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3361,6 +3361,7 @@ gBattleAnimMove_AquaJet:: visible ANIM_ATTACKER clearmonbg ANIM_DEF_PARTNER blendoff + setarg 7, 0x1000 end gBattleAnimMove_AttackOrder:: diff --git a/include/random.h b/include/random.h index de0f406fe5..0eb5c0f155 100644 --- a/include/random.h +++ b/include/random.h @@ -215,6 +215,8 @@ enum RandomTag RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, RNG_AI_APPLY_TAILWIND_ON_LAST_TURN_OF_TRICK_ROOM, RNG_WRAP, + RNG_PRESENT, + RNG_MAGNITUDE, }; #define RandomWeighted(tag, ...) \ diff --git a/include/test/battle.h b/include/test/battle.h index 28547f2614..21aa5c20ac 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -697,6 +697,7 @@ struct BattleTestData struct Pokemon *currentMon; u8 gender; u8 nature; + bool8 isShiny; u16 forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 chosenGimmick[NUM_BATTLE_SIDES][PARTY_SIZE]; @@ -881,7 +882,8 @@ struct moveWithPP { #define DynamaxLevel(dynamaxLevel) DynamaxLevel_(__LINE__, dynamaxLevel) #define GigantamaxFactor(gigantamaxFactor) GigantamaxFactor_(__LINE__, gigantamaxFactor) #define TeraType(teraType) TeraType_(__LINE__, teraType) -#define Shadow(isShadow) Shadow_(__LINE__, shadow) +#define Shadow(isShadow) Shadow_(__LINE__, isShadow) +#define Shiny(isShiny) Shiny_(__LINE__, isShiny) void SetFlagForTest(u32 sourceLine, u16 flagId); void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value); @@ -919,6 +921,7 @@ void DynamaxLevel_(u32 sourceLine, u32 dynamaxLevel); void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor); void TeraType_(u32 sourceLine, u32 teraType); void Shadow_(u32 sourceLine, bool32 isShadow); +void Shiny_(u32 sourceLine, bool32 isShiny); // Created for easy use of EXPECT_MOVES, so the user can provide 1, 2, 3 or 4 moves for AI which can pass the test. struct FourMoves diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 796d966050..af80d4468c 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11833,7 +11833,7 @@ static void Cmd_presentdamagecalculation(void) { CMD_ARGS(); - u32 rand = Random() & 0xFF; + u32 rand = RandomUniform(RNG_PRESENT, 0, 0xFF); /* Don't reroll present effect/power for the second hit of Parental Bond. * Not sure if this is the correct behaviour, but bulbapedia states @@ -11904,7 +11904,7 @@ static void Cmd_magnitudedamagecalculation(void) { CMD_ARGS(); - u32 magnitude = Random() % 100; + u32 magnitude = RandomUniform(RNG_MAGNITUDE, 0, 99); if (magnitude < 5) { diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index c6e84694ba..50f814f0e2 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -66,7 +66,9 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage) PLAYER(SPECIES_TAUROS) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_PRESENT); } + //Test will fail if present heals because the hp change would be 0 + //so we want a damaging version of present + TURN { MOVE(player, MOVE_PRESENT, WITH_RNG(RNG_PRESENT, 1)); } } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index c929921d3f..11b286084e 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -9,7 +9,7 @@ #define ANIM_TEST_END_MOVE MOVES_COUNT-1 // Last move to test -static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies) +static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies, u32 variation) { if (gMovesInfo[j].effect == EFFECT_DARK_VOID) // User needs to be Darkrai { @@ -41,11 +41,36 @@ static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies) *pMove = j; *pSpecies = SPECIES_JOLTEON; } + else if (gMovesInfo[j].effect == EFFECT_CURSE && variation == 1) // User needs to be Ghost-type + { + *pMove = j; + *pSpecies = SPECIES_GASTLY; + } else if (gMovesInfo[j].effect == EFFECT_MAGNETIC_FLUX || gMovesInfo[j].effect == EFFECT_GEAR_UP) // User needs to have Plus { *pMove = j; *pSpecies = SPECIES_KLINKLANG; } + else if (gMovesInfo[j].effect == EFFECT_IVY_CUDGEL && variation > 0) + { + *pMove = j; + if (variation == 1) + *pSpecies = SPECIES_OGERPON_WELLSPRING; + else if (variation == 2) + *pSpecies = SPECIES_OGERPON_HEARTHFLAME; + else + *pSpecies = SPECIES_OGERPON_CORNERSTONE; + } + else if (gMovesInfo[j].effect == EFFECT_DRAGON_DARTS && variation > 0) + { + *pMove = j; + *pSpecies = SPECIES_DRAGAPULT; + } + else if (gMovesInfo[j].effect == EFFECT_TERA_STARSTORM && variation == 1) + { + *pMove = j; + *pSpecies = SPECIES_TERAPAGOS_STELLAR; + } else if (gMovesInfo[j].effect == EFFECT_PLACEHOLDER) // Ignore placeholder *pMoves { *pMove = MOVE_POUND; @@ -58,6 +83,75 @@ static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies) } } +static u32 ParametrizeFriendship(u32 move, u32 variation) +{ + if (gMovesInfo[move].effect == EFFECT_FRUSTRATION + || gMovesInfo[move].effect == EFFECT_RETURN + ) + { + if (variation == 0) + return 1; + else if (variation == 1) + return 61; + else if (variation == 2) + return 101; + else if (variation == 3) + return 201; + } + return 0; +} + +static u32 GetParametrizedHP(u32 move, u32 variation) +{ + if (gMovesInfo[move].effect == EFFECT_POWER_BASED_ON_USER_HP && variation > 0) + { + if (variation == 1) + return 6000; + else if (variation == 2) + return 4000; + else if (variation == 3) + return 2000; + } + return 9997; +} + +static u32 GetParametrizedItem(u32 move, u32 variation) +{ + if ((move == MOVE_TECHNO_BLAST) && variation > 0) + { + if (variation == 1) + return ITEM_DOUSE_DRIVE; + else if (variation == 2) + return ITEM_SHOCK_DRIVE; + else if (variation == 3) + return ITEM_BURN_DRIVE; + else if (variation == 4) + return ITEM_CHILL_DRIVE; + } + return ITEM_ORAN_BERRY; +} + +static u32 GetParametrizedLevel(u32 move, u32 variation) +{ + if (gMovesInfo[move].effect == EFFECT_LEVEL_DAMAGE && variation > 0) + { + if (variation == 1) + return 50; + else if (variation == 2) + return 20; + } + return 100; +} + +static bool32 GetParametrizedShinyness(u32 move, u32 variation) +{ + if ((gMovesInfo[move].effect == EFFECT_DRAGON_DARTS && variation == 2) + || (move == MOVE_SYRUP_BOMB && variation == 1) + ) + return TRUE; + return FALSE; +} + static bool32 TargetHasToMove(u32 move) // Opponent needs to hit the player first { if (gMovesInfo[move].effect == EFFECT_COUNTER @@ -104,7 +198,37 @@ static bool32 UserHasToGoFirst(u32 move) // Player needs to go first return FALSE; } -static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *defender) +static u32 GetVariationsNumber(u32 move, bool8 isDouble) +{ + u32 variationsNumber; + + if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL + || gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE + || move == MOVE_TECHNO_BLAST) + variationsNumber = 5; + else if (gMovesInfo[move].effect == EFFECT_FRUSTRATION + || gMovesInfo[move].effect == EFFECT_RETURN + || gMovesInfo[move].effect == EFFECT_IVY_CUDGEL + || move == MOVE_WATER_SPOUT) //we don't use the effect because other moves with the water spout effect don't have animation variations + variationsNumber = 4; + else if (gMovesInfo[move].effect == EFFECT_SPIT_UP + || gMovesInfo[move].effect == EFFECT_SWALLOW + || gMovesInfo[move].effect == EFFECT_DRAGON_DARTS + || move == MOVE_SEISMIC_TOSS) + variationsNumber = 3; + else if (gMovesInfo[move].effect == EFFECT_CURSE + || gMovesInfo[move].effect == EFFECT_PRESENT + || gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM + || gMovesInfo[move].effect == EFFECT_FICKLE_BEAM + || gMovesInfo[move].effect == EFFECT_MAGNITUDE + || (isDouble && gMovesInfo[move].effect == EFFECT_TERA_STARSTORM) + || move == MOVE_SYRUP_BOMB) + variationsNumber = 2; + else + variationsNumber = 1; + return variationsNumber; +} +static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 variation) { // Setup turn if (gMovesInfo[move].effect == EFFECT_SNORE @@ -115,7 +239,10 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP else if (gMovesInfo[move].effect == EFFECT_SPIT_UP || gMovesInfo[move].effect == EFFECT_SWALLOW) { // attacker needs to have used Stockpile - TURN { MOVE(attacker, MOVE_STOCKPILE); } + for (u32 i = 0; i <= variation; i++) + { + TURN { MOVE(attacker, MOVE_STOCKPILE); } + } } else if ((gMovesInfo[move].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && gMovesInfo[move].argument.status == STATUS1_PARALYSIS)) { // defender needs to be paralyzed @@ -157,6 +284,32 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP { // Needs a terrain TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } } + else if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_SUNNY_DAY); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_RAIN_DANCE); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_SANDSTORM); } + else + TURN { MOVE(attacker, MOVE_HAIL); } + } + else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_GRASSY_TERRAIN); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_PSYCHIC_TERRAIN); } + else if (variation == 4) + TURN { MOVE(attacker, MOVE_MISTY_TERRAIN); } + } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + TURN { MOVE(attacker, move); } + } // Effective turn TURN { if (TargetHasToMove(move)) @@ -198,12 +351,62 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP { MOVE(attacker, move, target: attacker); } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + MOVE(defender, MOVE_HELPING_HAND); + SKIP_TURN(attacker); + } + else if (gMovesInfo[move].effect == EFFECT_PRESENT) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_PRESENT, 1)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_PRESENT, 254)); + } + else if (gMovesInfo[move].effect == EFFECT_MAGNITUDE) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 50)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 99)); + } + else if (gMovesInfo[move].effect == EFFECT_FICKLE_BEAM) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_FICKLE_BEAM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_FICKLE_BEAM, TRUE)); + } + else if (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_SHELL_SIDE_ARM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_SHELL_SIDE_ARM, TRUE)); + } else { // All other moves MOVE(defender, MOVE_HELPING_HAND); // Helping Hand, so there's no anim on the defender's side. MOVE(attacker, move); } } + if (gMovesInfo[move].effect == EFFECT_WISH) + { + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) + { + TURN {}; + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_ROLLOUT) + { + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, move);}; + TURN {MOVE(attacker, MOVE_HELPING_HAND);}; + } } static void SceneSingles(u32 move, struct BattlePokemon *mon) @@ -233,7 +436,7 @@ static void SceneSingles(u32 move, struct BattlePokemon *mon) } } -static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *target, struct BattlePokemon *ignore1, struct BattlePokemon *ignore2) +static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *target, struct BattlePokemon *ignore1, struct BattlePokemon *ignore2, u32 variation) { // Setup turn if (gMovesInfo[move].effect == EFFECT_SNORE @@ -244,7 +447,10 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP else if (gMovesInfo[move].effect == EFFECT_SPIT_UP || gMovesInfo[move].effect == EFFECT_SWALLOW) { // Player needs to have used Stockpile - TURN { MOVE(attacker, MOVE_STOCKPILE); } + for (u32 i = 0; i <= variation; i++) + { + TURN { MOVE(attacker, MOVE_STOCKPILE); } + } } else if ((gMovesInfo[move].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && gMovesInfo[move].argument.status == STATUS1_PARALYSIS)) { // Opponent needs to be paralyzed @@ -286,6 +492,32 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP { // Needs a terrain TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } } + else if (gMovesInfo[move].effect == EFFECT_WEATHER_BALL && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_SUNNY_DAY); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_RAIN_DANCE); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_SANDSTORM); } + else + TURN { MOVE(attacker, MOVE_HAIL); } + } + else if (gMovesInfo[move].effect == EFFECT_TERRAIN_PULSE && variation > 0) + { + if (variation == 1) + TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } + else if (variation == 2) + TURN { MOVE(attacker, MOVE_GRASSY_TERRAIN); } + else if (variation == 3) + TURN { MOVE(attacker, MOVE_PSYCHIC_TERRAIN); } + else if (variation == 4) + TURN { MOVE(attacker, MOVE_MISTY_TERRAIN); } + } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + TURN { MOVE(attacker, move, target: target); } + } // Effective turn TURN { if (TargetHasToMove(move)) @@ -330,6 +562,39 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(attacker, move, target: target); MOVE(target, MOVE_QUICK_ATTACK, target: attacker); } + else if (gBattleMoveEffects[gMovesInfo[move].effect].twoTurnEffect) + { + MOVE(target, MOVE_LAST_RESORT, target: attacker); + SKIP_TURN(attacker); + } + else if (gMovesInfo[move].effect == EFFECT_PRESENT) + { + if (variation == 0) + MOVE(attacker, move, target: target, WITH_RNG(RNG_PRESENT, 1)); + else if (variation == 1) + MOVE(attacker, move, target: target, WITH_RNG(RNG_PRESENT, 254)); + } + else if (gMovesInfo[move].effect == EFFECT_MAGNITUDE) + { + if (variation == 0) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 50)); + else if (variation == 1) + MOVE(attacker, move, WITH_RNG(RNG_MAGNITUDE, 99)); + } + else if (gMovesInfo[move].effect == EFFECT_FICKLE_BEAM) + { + if (variation == 0) + MOVE(attacker, move, target: target, WITH_RNG(RNG_FICKLE_BEAM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, target: target, WITH_RNG(RNG_FICKLE_BEAM, TRUE)); + } + else if (gMovesInfo[move].effect == EFFECT_SHELL_SIDE_ARM) + { + if (variation == 0) + MOVE(attacker, move, target: target, WITH_RNG(RNG_SHELL_SIDE_ARM, FALSE)); + else if (variation == 1) + MOVE(attacker, move, target: target, WITH_RNG(RNG_SHELL_SIDE_ARM, TRUE)); + } else { // All other moves MOVE(target, MOVE_LAST_RESORT, target: attacker); // Last Resort, so there's no anim on the opponent's side. @@ -342,6 +607,23 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(ignore2, MOVE_CELEBRATE); } } + if (gMovesInfo[move].effect == EFFECT_WISH) + { + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_FUTURE_SIGHT) + { + TURN {}; + TURN {}; + } + else if (gMovesInfo[move].effect == EFFECT_ROLLOUT) + { + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, move, target: target);}; + TURN {MOVE(attacker, MOVE_LAST_RESORT, target: attacker);}; + } } static void DoublesScene(u32 move, struct BattlePokemon *attacker) @@ -372,18 +654,27 @@ static void DoublesScene(u32 move, struct BattlePokemon *attacker) SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to opponent)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, FALSE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); @@ -396,7 +687,7 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to op } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - WhenSingles(move, player, opponent); + WhenSingles(move, player, opponent, variation); } SCENE { SceneSingles(move, player); } THEN { @@ -410,18 +701,27 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to op SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to player)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, FALSE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); @@ -434,7 +734,7 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - WhenSingles(move, opponent, player); + WhenSingles(move, opponent, player, variation); } SCENE { SceneSingles(move, opponent); } THEN { @@ -448,6 +748,8 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft to opponentLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerLeft; @@ -455,25 +757,35 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t struct BattlePokemon *ignore1 = playerRight; struct BattlePokemon *ignore2 = opponentRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { @@ -492,7 +804,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -506,6 +818,8 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft to playerLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentLeft; @@ -513,24 +827,34 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft struct BattlePokemon *ignore1 = opponentRight; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { @@ -551,7 +875,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -565,6 +889,8 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft to opponentRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerLeft; @@ -572,24 +898,34 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t struct BattlePokemon *ignore1 = playerRight; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { @@ -610,7 +946,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -624,6 +960,8 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRight to playerLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentRight; @@ -631,24 +969,34 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh struct BattlePokemon *ignore1 = opponentLeft; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { @@ -669,7 +1017,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -683,6 +1031,8 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight to opponentLeft)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerRight; @@ -690,24 +1040,34 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { @@ -728,7 +1088,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -742,6 +1102,8 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft to playerRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentLeft; @@ -749,24 +1111,34 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { @@ -787,7 +1159,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -801,6 +1173,8 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight to opponentRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = playerRight; @@ -808,24 +1182,34 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } PLAYER(SPECIES_WOBBUFFET) { @@ -846,7 +1230,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -860,6 +1244,8 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRight to playerRight)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); struct BattlePokemon *attacker = opponentRight; @@ -867,24 +1253,34 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, TRUE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } } OPPONENT(SPECIES_WOBBUFFET) { @@ -905,7 +1301,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - DoublesWhen(move, attacker, target, ignore1, ignore2); + DoublesWhen(move, attacker, target, ignore1, ignore2, variation); } SCENE { DoublesScene(move, attacker); } THEN { @@ -927,7 +1323,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t struct BattlePokemon *ignore1 = opponentRight; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -986,7 +1382,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight struct BattlePokemon *ignore1 = opponentRight; struct BattlePokemon *ignore2 = opponentLeft; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -1045,7 +1441,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -1104,7 +1500,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh struct BattlePokemon *ignore1 = playerLeft; struct BattlePokemon *ignore2 = playerRight; for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, 0); PARAMETRIZE { move = tempMove; species = tempSpecies; } } GIVEN { @@ -1157,18 +1553,27 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - Singles (player to opponent)") { u32 j = ANIM_TEST_START_MOVE, move = 0, species = 0; + u32 k = 0, variation = 0, variationsNumber; + u32 friendship = 0, tempFriendship; u32 tempMove, tempSpecies; FORCE_MOVE_ANIM(TRUE); for (; j <= ANIM_TEST_END_MOVE; j++) { - ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies); - PARAMETRIZE { move = tempMove; species = tempSpecies; } + variationsNumber = GetVariationsNumber(j, FALSE); + for (k = 0; k < variationsNumber; k++) { + ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); + tempFriendship = ParametrizeFriendship(j, k); + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + } } GIVEN { PLAYER(species) { - HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); + Level(GetParametrizedLevel(move, variation)); + HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); + if (friendship) Friendship(friendship); + if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); @@ -1181,7 +1586,7 @@ SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { - WhenSingles(move, player, opponent); + WhenSingles(move, player, opponent, variation); } SCENE { if (!(gMovesInfo[move].effect == EFFECT_RECYCLE || gMovesInfo[move].effect == EFFECT_BELCH diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index f2bb69fa91..95daa6ee9d 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -1574,6 +1574,7 @@ void OpenPokemon(u32 sourceLine, u32 side, u32 species) DATA.currentMon = &party[DATA.currentPartyIndex]; DATA.gender = 0xFF; // Male DATA.nature = NATURE_HARDY; + DATA.isShiny = FALSE; (*partySize)++; CreateMon(DATA.currentMon, species, 100, 0, TRUE, 0, OT_ID_PRESET, 0); @@ -1628,9 +1629,9 @@ void ClosePokemon(u32 sourceLine) INVALID_IF(GetMonData(DATA.currentMon, MON_DATA_HP) == 0, "Battlers cannot be fainted"); } } - data = FALSE; - SetMonData(DATA.currentMon, MON_DATA_IS_SHINY, &data); UpdateMonPersonality(&DATA.currentMon->box, GenerateNature(DATA.nature, DATA.gender % NUM_NATURES) | DATA.gender); + data = DATA.isShiny; + SetMonData(DATA.currentMon, MON_DATA_IS_SHINY, &data); DATA.currentMon = NULL; } @@ -1895,6 +1896,12 @@ void Shadow_(u32 sourceLine, bool32 isShadow) SetMonData(DATA.currentMon, MON_DATA_IS_SHADOW, &isShadow); } +void Shiny_(u32 sourceLine, bool32 isShiny) +{ + INVALID_IF(!DATA.currentMon, "Shiny outside of PLAYER/OPPONENT"); + DATA.isShiny = isShiny; +} + static const char *const sBattlerIdentifiersSingles[] = { "player", From 7172639bc07573013f34932126488cfa4afffcbc Mon Sep 17 00:00:00 2001 From: Estellar <137097857+estellarc@users.noreply.github.com> Date: Mon, 22 Sep 2025 10:21:00 -0300 Subject: [PATCH 049/183] Bugfix `setspeaker` Namebox not beign drawn correctly (#7771) --- src/field_message_box.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_message_box.c b/src/field_message_box.c index d0aa412d65..cfb48c8bd5 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -43,7 +43,7 @@ static void Task_DrawFieldMessage(u8 taskId) u32 nameboxWinId = GetNameboxWindowId(); DrawDialogueFrame(0, TRUE); if (nameboxWinId != WINDOW_NONE) - DrawNamebox(nameboxWinId, NAME_BOX_BASE_TILE_NUM, TRUE); + DrawNamebox(nameboxWinId, NAME_BOX_BASE_TILE_NUM - NAME_BOX_BASE_TILES_TOTAL, TRUE); task->tState++; break; case 2: From 780867611eccd3237ede56c8b30191c357c6b197 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 22 Sep 2025 15:57:47 +0200 Subject: [PATCH 050/183] Minor White Herb and Neutralizing Gas clean up (#7754) --- include/battle_util.h | 4 ++- src/battle_end_turn.c | 2 +- src/battle_main.c | 9 ++++-- src/battle_script_commands.c | 21 ++++---------- src/battle_util.c | 42 +++++++++++++++------------- test/battle/move_effect/skill_swap.c | 2 +- 6 files changed, 41 insertions(+), 39 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index b9652c1caf..cb8a23e929 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -49,6 +49,7 @@ enum { ABILITYEFFECT_ATK_SYNCHRONIZE, ABILITYEFFECT_MOVE_END_OTHER, ABILITYEFFECT_NEUTRALIZINGGAS, + ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, ABILITYEFFECT_ON_WEATHER, ABILITYEFFECT_ON_TERRAIN, ABILITYEFFECT_SWITCH_IN_TERRAIN, @@ -71,7 +72,8 @@ enum ItemCaseId ITEMEFFECT_ORBS, ITEMEFFECT_LIFEORB_SHELLBELL, ITEMEFFECT_USE_LAST_ITEM, // move end effects for just the battler, not whole field - ITEMEFFECT_STATS_CHANGED, // For White Herb and Eject Pack + ITEMEFFECT_WHITE_HERB, + ITEMEFFECT_WHITE_HERB_ENDTURN, }; enum ItemEffect diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 66dd1adf7c..038080b241 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -1443,7 +1443,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) effect = TRUE; break; case HOLD_EFFECT_WHITE_HERB: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) + if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB_ENDTURN, battler)) effect = TRUE; break; default: diff --git a/src/battle_main.c b/src/battle_main.c index 5eb147a517..4ae111357a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3851,8 +3851,13 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_NEUTRALIZING_GAS: - if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, 0, 0, 0, 0) != 0) - return; + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + i = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, i, gBattleMons[i].ability, 0, 0) != 0) + return; + } + gBattleStruct->switchInBattlerCounter = 0; gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index af80d4468c..62e2232f73 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6703,16 +6703,10 @@ static void Cmd_moveend(void) if (!IsBattlerAlive(i)) continue; - if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_WHITE_HERB - && RestoreWhiteHerbStats(i)) - { - BattleScriptCall(BattleScript_WhiteHerbRet); - effect = TRUE; - break; - } + if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB, i)) + return; } - if (!effect) - gBattleScripting.moveendState++; + gBattleScripting.moveendState++; break; case MOVEEND_THIRD_MOVE_BLOCK: // Special case for Steel Roller since it has to check the chosen move @@ -7687,13 +7681,10 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) u32 i = 0; u32 side = GetBattlerSide(battler); // Neutralizing Gas announces itself before hazards - if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS && gSpecialStatuses[battler].announceNeutralizingGas == 0) + if (!gSpecialStatuses[battler].announceNeutralizingGas + && AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, battler, gBattleMons[battler].ability, 0, 0)) { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; gSpecialStatuses[battler].announceNeutralizingGas = TRUE; - gDisableStructs[battler].neutralizingGas = TRUE; - gBattlerAbility = battler; - BattleScriptCall(BattleScript_SwitchInAbilityMsgRet); } // Healing Wish activates before hazards. // Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways. @@ -15272,7 +15263,7 @@ void BS_RunStatChangeItems(void) // Change instruction before calling ItemBattleEffects. gBattlescriptCurrInstr = cmd->nextInstr; - ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler)); + ItemBattleEffects(ITEMEFFECT_WHITE_HERB, GetBattlerForBattleScript(cmd->battler)); } static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) diff --git a/src/battle_util.c b/src/battle_util.c index 3d880b6f39..d6ad292682 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5535,20 +5535,18 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITYEFFECT_NEUTRALIZINGGAS: + case ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN: // Prints message only. separate from ABILITYEFFECT_ON_SWITCHIN bc activates before entry hazards - for (i = 0; i < gBattlersCount; i++) + if (ability == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[battler].neutralizingGas) { - if (gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[i].neutralizingGas) - { - gDisableStructs[i].neutralizingGas = TRUE; - gBattlerAbility = i; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; + gDisableStructs[battler].neutralizingGas = TRUE; + gBattlerAbility = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; + if (caseID == ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN) BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); - effect++; - } - - if (effect != 0) - break; + else + BattleScriptCall(BattleScript_SwitchInAbilityMsgRet); + effect++; } break; case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes. @@ -6873,7 +6871,12 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_WHITE_HERB: effect = RestoreWhiteHerbStats(battler); if (effect != 0) - BattleScriptExecute(BattleScript_WhiteHerbEnd2); + { + if (caseID == ITEMEFFECT_ON_SWITCH_IN) + BattleScriptCall(BattleScript_WhiteHerbRet); + else + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } break; case HOLD_EFFECT_CONFUSE_SPICY: if (B_BERRIES_INSTANT >= GEN_4) @@ -7071,11 +7074,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_RESTORE_PP: effect = ItemRestorePp(battler, gLastUsedItem, caseID); break; - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - break; case HOLD_EFFECT_BLACK_SLUDGE: if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { @@ -7579,13 +7577,19 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) } } break; - case ITEMEFFECT_STATS_CHANGED: + case ITEMEFFECT_WHITE_HERB: + case ITEMEFFECT_WHITE_HERB_ENDTURN: switch (battlerHoldEffect) { case HOLD_EFFECT_WHITE_HERB: effect = RestoreWhiteHerbStats(battler); if (effect != 0) - BattleScriptCall(BattleScript_WhiteHerbRet); + { + if (caseID == ITEMEFFECT_WHITE_HERB) + BattleScriptCall(BattleScript_WhiteHerbRet); + else + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } break; default: break; diff --git a/test/battle/move_effect/skill_swap.c b/test/battle/move_effect/skill_swap.c index c3c2ca91f4..2d47a01da3 100644 --- a/test/battle/move_effect/skill_swap.c +++ b/test/battle/move_effect/skill_swap.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Skill Swap swaps user and target's abilities") } THEN { EXPECT_EQ(player->ability, ABILITY_BLAZE); EXPECT_EQ(opponent->ability, ABILITY_TELEPATHY); - } + } } DOUBLE_BATTLE_TEST("Skill Swap only swaps user's ability with target's ability") From 1ca5b23f19da951893a83123eae1b99329e80ca9 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:47:23 -0400 Subject: [PATCH 051/183] Fix abusable two-turn-move switch behaviour (#7770) --- include/config/ai.h | 2 +- src/battle_ai_switch_items.c | 3 ++- test/battle/ai/ai_switching.c | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index 877b3da427..b834829edf 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -15,7 +15,7 @@ #define SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE 100 #define SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE 50 #define SHOULD_SWITCH_TRAPPER_PERCENTAGE 100 -#define SHOULD_SWITCH_FREE_TURN_PERCENTAGE 100 +#define SHOULD_SWITCH_FREE_TURN_PERCENTAGE 50 #define STAY_IN_ABSORBING_PERCENTAGE 66 // Chance to stay in if outgoing mon has super effective move against player, will prevent switching out for an absorber with this likelihood #define SHOULD_SWITCH_HASBADODDS_PERCENTAGE 50 #define SHOULD_SWITCH_ENCORE_STATUS_PERCENTAGE 100 diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 6340b921c6..391b40af98 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -621,6 +621,7 @@ static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; + // In a world with a unified ShouldSwitch function, also want to check whether we already win 1v1 and if we do don't switch; not worth doubling the HasBadOdds computation for now if (isOpposingBattlerChargingOrInvulnerable && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -658,7 +659,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && monAbility == ABILITY_TRACE)) { // If mon in slot i is the most suitable switchin candidate, then it's a trapper than wins 1v1 - if (i == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) + if (i == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_TRAPPER, GetSwitchChance(SHOULD_SWITCH_TRAPPER))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index b1aad9afb2..f6d7304a6b 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -748,15 +748,15 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee } } -AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is semi-invulnerable and it has an absorber") +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is semi-invulnerable and it has a good switchin") { PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); GIVEN { ASSUME(GetMoveType(MOVE_DIVE) == TYPE_WATER); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); - PLAYER(SPECIES_LUVDISC) { Moves(MOVE_DIVE); } + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_LUVDISC) { Level(1); Moves(MOVE_DIVE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } - OPPONENT(SPECIES_MANTINE) { Moves(MOVE_SCRATCH); Ability(ABILITY_WATER_ABSORB); } + OPPONENT(SPECIES_PIKACHU) { Moves(MOVE_THUNDERBOLT); } } WHEN { TURN { MOVE(player, MOVE_DIVE) ; EXPECT_MOVE(opponent, MOVE_SCRATCH); } TURN { SKIP_TURN(player); EXPECT_SWITCH(opponent, 1); } @@ -810,7 +810,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's mon is charging and it has a good switchin immunity (ability)") { - PASSES_RANDOMLY(SHOULD_SWITCH_FREE_TURN_PERCENTAGE, 100, RNG_AI_SWITCH_FREE_TURN); + PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING); GIVEN { ASSUME(GetMoveType(MOVE_DIG) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); From a00b16fd90e814370780a2db00ac6c871509c221 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 22 Sep 2025 23:47:44 +0200 Subject: [PATCH 052/183] Minor clean up for Lightning Rod / Storm Drain (#7778) --- include/battle.h | 7 +++---- src/battle_script_commands.c | 13 ++----------- src/battle_util.c | 14 +++++--------- test/battle/ability/lightning_rod.c | 2 ++ 4 files changed, 12 insertions(+), 24 deletions(-) diff --git a/include/battle.h b/include/battle.h index 16e8e83316..db3e69821e 100644 --- a/include/battle.h +++ b/include/battle.h @@ -183,13 +183,13 @@ struct SpecialStatus s32 specialDmg; u8 changedStatsBattlerId; // Battler that was responsible for the latest stat change. Can be self. u8 statLowered:1; - u8 lightningRodRedirected:1; + u8 abilityRedirected:1; u8 restoredBattlerSprite: 1; u8 faintedHasReplacement:1; u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects. u8 afterYou:1; u8 enduredDamage:1; - u8 stormDrainRedirected:1; + u8 dancerUsedMove:1; // End of byte u8 switchInAbilityDone:1; u8 switchInItemDone:1; @@ -208,9 +208,8 @@ struct SpecialStatus u8 teraShellAbilityDone:1; u8 criticalHit:1; // End of byte - u8 dancerUsedMove:1; u8 dancerOriginalTarget:3; - u8 unused:4; + u8 unused:5; // End of byte }; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 62e2232f73..98af3e07c0 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1249,19 +1249,10 @@ static void Cmd_attackcanceler(void) } } - if (gSpecialStatuses[gBattlerTarget].lightningRodRedirected) + if (gSpecialStatuses[gBattlerTarget].abilityRedirected) { - gSpecialStatuses[gBattlerTarget].lightningRodRedirected = FALSE; - gLastUsedAbility = ABILITY_LIGHTNING_ROD; + gSpecialStatuses[gBattlerTarget].abilityRedirected = FALSE; BattleScriptCall(BattleScript_TookAttack); - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else if (gSpecialStatuses[gBattlerTarget].stormDrainRedirected) - { - gSpecialStatuses[gBattlerTarget].stormDrainRedirected = FALSE; - gLastUsedAbility = ABILITY_STORM_DRAIN; - BattleScriptCall(BattleScript_TookAttack); - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) && (ctx.moveEffect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) diff --git a/src/battle_util.c b/src/battle_util.c index d6ad292682..0784a886bd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -367,17 +367,13 @@ bool32 HandleMoveTargetRedirection(void) redirectorOrderNum = GetBattlerTurnOrderNum(battler); } } - if (redirectorOrderNum != MAX_BATTLERS_COUNT) + if (redirectorOrderNum != MAX_BATTLERS_COUNT && gCurrentMove != MOVE_TEATIME) { u16 battlerAbility; battler = gBattlerByTurnOrder[redirectorOrderNum]; battlerAbility = GetBattlerAbility(battler); - - RecordAbilityBattle(battler, gBattleMons[battler].ability); - if (battlerAbility == ABILITY_LIGHTNING_ROD && gCurrentMove != MOVE_TEATIME) - gSpecialStatuses[battler].lightningRodRedirected = TRUE; - else if (battlerAbility == ABILITY_STORM_DRAIN) - gSpecialStatuses[battler].stormDrainRedirected = TRUE; + RecordAbilityBattle(battler, battlerAbility); + gSpecialStatuses[battler].abilityRedirected = TRUE; gBattlerTarget = battler; return TRUE; } @@ -7677,7 +7673,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) { targetBattler = battlerAbilityOnField - 1; RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); - gSpecialStatuses[targetBattler].lightningRodRedirected = TRUE; + gSpecialStatuses[targetBattler].abilityRedirected = TRUE; } } else if (moveType == TYPE_WATER && GetBattlerAbility(targetBattler) != ABILITY_STORM_DRAIN) @@ -7691,7 +7687,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) { targetBattler = battlerAbilityOnField - 1; RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); - gSpecialStatuses[targetBattler].lightningRodRedirected = TRUE; + gSpecialStatuses[targetBattler].abilityRedirected = TRUE; } } } diff --git a/test/battle/ability/lightning_rod.c b/test/battle/ability/lightning_rod.c index ab2f0d89a0..aec2e7fea4 100644 --- a/test/battle/ability/lightning_rod.c +++ b/test/battle/ability/lightning_rod.c @@ -28,6 +28,8 @@ SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the HP_BAR(opponent); } ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } THEN { + EXPECT_EQ(gBattleHistory->abilities[1], ABILITY_LIGHTNING_ROD); // Check if the correct ability has been recorded } } From 63d04947e445d8cd5f86b60245efb2b4ce12a1cb Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 23 Sep 2025 14:28:06 +0200 Subject: [PATCH 053/183] Added brackets where needed (#7781) Co-authored-by: Hedara --- src/field_message_box.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/field_message_box.c b/src/field_message_box.c index cfb48c8bd5..6cac521853 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -40,12 +40,14 @@ static void Task_DrawFieldMessage(u8 taskId) task->tState++; break; case 1: + { u32 nameboxWinId = GetNameboxWindowId(); DrawDialogueFrame(0, TRUE); if (nameboxWinId != WINDOW_NONE) DrawNamebox(nameboxWinId, NAME_BOX_BASE_TILE_NUM - NAME_BOX_BASE_TILES_TOTAL, TRUE); task->tState++; break; + } case 2: if (RunTextPrintersAndIsPrinter0Active() != TRUE) { From 82ab4fe98dbcae035a7f0fcd3aa1e6b3d4b9100a Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 24 Sep 2025 13:55:29 -0400 Subject: [PATCH 054/183] Z Status move handling: Conversion, Detect, Nature Power, Transform (#7721) --- include/config/ai.h | 3 +- src/battle_ai_main.c | 8 +- src/battle_ai_util.c | 50 ++++++++++- test/battle/ai/gimmick_z_move.c | 141 +++++++++++++++++++++++++------- 4 files changed, 166 insertions(+), 36 deletions(-) diff --git a/include/config/ai.h b/include/config/ai.h index b834829edf..5a7ce40783 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -112,6 +112,7 @@ // HP thresholds to use a status z-move. #define Z_EFFECT_FOLLOW_ME_THRESHOLD 30 -#define Z_EFFECT_RESTORE_HP_THRESHOLD 60 +#define Z_EFFECT_RESTORE_HP_LOWER_THRESHOLD ENABLE_RECOVERY_THRESHOLD // threshold used for moves you could conceivably use more than once +#define Z_EFFECT_RESTORE_HP_HIGHER_THRESHOLD 90 // these moves are one-time use or drop your HP #endif // GUARD_CONFIG_AI_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 8399f7f977..1ff97b39bc 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1986,7 +1986,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) ADJUST_SCORE(-10); - else if (aiData->hpPercents[battlerAtk] <= 60 && (GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE || GetMoveZEffect(move) == Z_EFFECT_NONE)) + else if (aiData->hpPercents[battlerAtk] <= 60 && !IsConsideringZMove(battlerAtk, battlerDef, move)) ADJUST_SCORE(-10); break; case EFFECT_FUTURE_SIGHT: @@ -4322,7 +4322,13 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru break; case EFFECT_CONVERSION: if (!IS_BATTLER_OF_TYPE(battlerAtk, GetMoveType(gBattleMons[battlerAtk].moves[0]))) + { ADJUST_SCORE(WEAK_EFFECT); + if (aiData->abilities[battlerAtk] == ABILITY_ADAPTABILITY) + ADJUST_SCORE(WEAK_EFFECT); + if (IsConsideringZMove(battlerAtk, battlerDef, move)) + ADJUST_SCORE(BEST_EFFECT); + } break; case EFFECT_SWALLOW: if (gDisableStructs[battlerAtk].stockpileCounter == 0) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 38e8d341a5..2c8e9fd0ce 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -4920,12 +4920,16 @@ bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move) { + if (GetMovePower(move) == 0 && GetMoveZEffect(move) == Z_EFFECT_NONE) + return FALSE; + return gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move); } //TODO - this could use some more sophisticated logic bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) { + // simple logic. just upgrades chosen move to z move if possible, unless regular move would kill opponent if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk) && !(GetBattlerMoveTargetType(battlerAtk, chosenMove) & MOVE_TARGET_ALLY)) return FALSE; // don't use z move on partner @@ -4934,6 +4938,39 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) if (IsViableZMove(battlerAtk, chosenMove)) { + enum BattleMoveEffects baseEffect = GetMoveEffect(chosenMove); + bool32 isEager = FALSE; // more likely to use a z move than typical + + u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 isSlower = AI_IsSlower(battlerAtk, battlerDef, chosenMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + + switch (baseEffect) + { + case EFFECT_BELLY_DRUM: + case EFFECT_FILLET_AWAY: + if (isSlower) + return TRUE; + isEager = TRUE; + break; + case EFFECT_PROTECT: + if (HasDamagingMoveOfType(battlerAtk, GetMoveType(gMovesInfo[chosenMove].type))) + return FALSE; + else + isEager = TRUE; + break; + case EFFECT_TELEPORT: + isEager = TRUE; + break; + case EFFECT_TRANSFORM: + if (IsBattlerTrapped(battlerDef, battlerAtk) && !HasDamagingMoveOfType(battlerDef, GetMoveType(gMovesInfo[chosenMove].type))) + return TRUE; + if (isSlower) + isEager = TRUE; + break; + default: + break; + } + u32 zMove = GetUsableZMove(battlerAtk, chosenMove); if (IsBattleMoveStatus(chosenMove)) @@ -4952,7 +4989,9 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) switch (zEffect) { case Z_EFFECT_NONE: - return FALSE; + if (GetMovePower(chosenMove) == 0) + return FALSE; + break; case Z_EFFECT_RESET_STATS: if (CountNegativeStatStages(battlerAtk) > 1) return TRUE; @@ -4965,7 +5004,11 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return HasPartnerIgnoreFlags(battlerAtk) && (GetHealthPercentage(battlerAtk) <= Z_EFFECT_FOLLOW_ME_THRESHOLD || GetBestNoOfHitsToKO(battlerDef, battlerAtk, AI_DEFENDING) == 1); break; case Z_EFFECT_RECOVER_HP: - return gAiLogicData->hpPercents[battlerAtk] <= Z_EFFECT_RESTORE_HP_THRESHOLD; + if (GetBestNoOfHitsToKO(battlerDef, battlerAtk, AI_DEFENDING) == 1 && GetHealthPercentage(battlerAtk) > Z_EFFECT_RESTORE_HP_HIGHER_THRESHOLD) + return TRUE; + if (isEager) + return GetHealthPercentage(battlerAtk) <= Z_EFFECT_RESTORE_HP_HIGHER_THRESHOLD; + return GetHealthPercentage(battlerAtk) <= Z_EFFECT_RESTORE_HP_LOWER_THRESHOLD; case Z_EFFECT_RESTORE_REPLACEMENT_HP: break; case Z_EFFECT_ACC_UP_1: @@ -5003,8 +5046,9 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return FALSE; } - if (statChange != 0 && IncreaseStatUpScore(battlerAtk, battlerDef, statChange) > 0) + if (statChange != 0 && (isEager || IncreaseStatUpScore(battlerAtk, battlerDef, statChange) > 0)) return TRUE; + } else if (GetMoveEffect(zMove) == EFFECT_EXTREME_EVOBOOST) { diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c index 1332abe6c0..6a2ed89101 100644 --- a/test/battle/ai/gimmick_z_move.c +++ b/test/battle/ai/gimmick_z_move.c @@ -32,37 +32,6 @@ AI_SINGLE_BATTLE_TEST("AI does not use damaging Z-moves if the player would fain TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_NONE); } } } - -AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Splash") -{ - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); - ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_SPLASH); } - } WHEN { - TURN { EXPECT_MOVE(opponent, MOVE_SPLASH, gimmick: GIMMICK_Z_MOVE); - SCORE_GT_VAL(opponent, MOVE_SPLASH, AI_SCORE_DEFAULT); } - TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); - SCORE_EQ_VAL(opponent, MOVE_SPLASH, 90); } - } -} - -AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Happy Hour") -{ - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); - ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_HAPPY_HOUR); } - } WHEN { - TURN { EXPECT_MOVE(opponent, MOVE_HAPPY_HOUR, gimmick: GIMMICK_Z_MOVE); - SCORE_GT_VAL(opponent, MOVE_HAPPY_HOUR, AI_SCORE_DEFAULT); } - TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); - SCORE_EQ_VAL(opponent, MOVE_HAPPY_HOUR, 90); } - } -} - AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") { GIVEN { @@ -88,6 +57,25 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- 10,000,000 Volt Thunderbolt") TURN { EXPECT_MOVE(opponent, MOVE_THUNDERBOLT, gimmick: GIMMICK_Z_MOVE); } } } +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Conversion") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_NONE; } + PARAMETRIZE { ability = ABILITY_OPPORTUNIST; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_CONVERSION) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Ability(ABILITY_ADAPTABILITY); Moves(MOVE_THUNDERBOLT, MOVE_CONVERSION); } + } WHEN { + if (ability == ABILITY_OPPORTUNIST) + TURN { EXPECT_MOVE(opponent, MOVE_CONVERSION, gimmick: GIMMICK_NONE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_CONVERSION, gimmick: GIMMICK_Z_MOVE); } + } +} + AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Destiny Bond is not used in singles") { @@ -120,3 +108,94 @@ AI_DOUBLE_BATTLE_TEST("AI uses Z-Moves -- Z-Destiny Bond is used when about to d } } +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Detect") +{ + u32 move; + PARAMETRIZE { move = MOVE_THUNDERBOLT; } + PARAMETRIZE { move = MOVE_CLOSE_COMBAT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE ); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_FAKE_OUT); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FIGHTINIUM_Z); Moves(MOVE_DETECT, move); } + } WHEN { + if (move == MOVE_CLOSE_COMBAT) + TURN { EXPECT_MOVE(opponent, MOVE_DETECT, gimmick: GIMMICK_NONE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_DETECT, gimmick: GIMMICK_Z_MOVE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Happy Hour") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_HAPPY_HOUR); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_HAPPY_HOUR, gimmick: GIMMICK_Z_MOVE); + SCORE_GT_VAL(opponent, MOVE_HAPPY_HOUR, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_EQ_VAL(opponent, MOVE_HAPPY_HOUR, 90); } + } +} + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Haze") + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Mirror Move") + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Nature Power") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_NATURE_POWER, MOVE_HEADBUTT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_NATURE_POWER, gimmick: GIMMICK_Z_MOVE); } + } +} + +// Requires handling for Wish passing/Healing Wish/other ways to determine what pokemon to heal via switching into. +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Parting Shot") + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Splash") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_SPLASH); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SPLASH, gimmick: GIMMICK_Z_MOVE); + SCORE_GT_VAL(opponent, MOVE_SPLASH, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); + SCORE_EQ_VAL(opponent, MOVE_SPLASH, 90); } + } +} + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Tailwind") + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Transform") +{ + u32 currentHP, move; + PARAMETRIZE { currentHP = 1; move = MOVE_HEADBUTT; } + PARAMETRIZE { currentHP = 1; move = MOVE_THUNDERBOLT; } + PARAMETRIZE { currentHP = 500; move = MOVE_HEADBUTT; } + PARAMETRIZE { currentHP = 500; move = MOVE_THUNDERBOLT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(SPECIES_WOBBUFFET) { Moves(move, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { HP(currentHP); Item(ITEM_NORMALIUM_Z); Moves(MOVE_TRANSFORM); } + } WHEN { + if (currentHP == 1 || move == MOVE_THUNDERBOLT) + TURN { EXPECT_MOVE(opponent, MOVE_TRANSFORM, gimmick: GIMMICK_Z_MOVE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_TRANSFORM, gimmick: GIMMICK_NONE); } + } +} + +TO_DO_BATTLE_TEST("TODO: AI uses Z-Moves -- Z-Trick Room") + + From 66b7a7bf1e0e12e724cb497e6827b4421e900f28 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 24 Sep 2025 20:35:12 +0200 Subject: [PATCH 055/183] Improve ability/heldEffect access for IsBattlerGrounded func (#7753) --- include/battle_ai_util.h | 1 + include/battle_util.h | 4 +- src/battle_ai_field_statuses.c | 32 +++++++------- src/battle_ai_main.c | 38 ++++++++-------- src/battle_ai_switch_items.c | 6 +-- src/battle_ai_util.c | 13 ++++-- src/battle_anim_new.c | 2 +- src/battle_end_turn.c | 7 +-- src/battle_main.c | 9 ++-- src/battle_script_commands.c | 29 +++++++----- src/battle_util.c | 81 +++++++++++++++++----------------- 11 files changed, 119 insertions(+), 103 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 1e5cb325e6..29ff4fa32c 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -79,6 +79,7 @@ bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, en bool32 AI_IsPartyMonFaster(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); bool32 AI_IsPartyMonSlower(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); bool32 AI_RandLessThan(u32 val); +bool32 AI_IsBattlerGrounded(u32 battler); u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, struct AiLogicData *aiData); bool32 IsAiVsAiBattle(void); bool32 BattlerHasAi(u32 battlerId); diff --git a/include/battle_util.h b/include/battle_util.h index cb8a23e929..0ce1a9b7d7 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -288,7 +288,7 @@ enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegati u32 GetBattlerHoldEffectParam(u32 battler); bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); -bool32 IsBattlerGrounded(u32 battler); +bool32 IsBattlerGrounded(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); @@ -373,7 +373,7 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef); bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef); bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); bool32 CanBeConfused(u32 battler); -bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); +bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); void TryToRevertMimicryAndFlags(void); bool32 BattleArenaTurnEnd(void); diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index 968bd31628..f844b03d34 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -312,11 +312,11 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) if (HasMoveWithEffect(battler, EFFECT_RISING_VOLTAGE)) return FIELD_EFFECT_POSITIVE; - if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(LEFT_FOE(battler))) - || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(RIGHT_FOE(battler)))) + if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(LEFT_FOE(battler))) + || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(RIGHT_FOE(battler)))) return FIELD_EFFECT_POSITIVE; - bool32 grounded = IsBattlerGrounded(battler); + bool32 grounded = AI_IsBattlerGrounded(battler); if (grounded && HasBattlerSideMoveWithAdditionalEffect(LEFT_FOE(battler), MOVE_EFFECT_SLEEP)) return FIELD_EFFECT_POSITIVE; @@ -343,7 +343,7 @@ static enum FieldEffectOutcome BenefitsFromGrassyTerrain(u32 battler) if (HasMoveWithAdditionalEffect(battler, MOVE_EFFECT_FLORAL_HEALING)) return FIELD_EFFECT_POSITIVE; - bool32 grounded = IsBattlerGrounded(battler); + bool32 grounded = AI_IsBattlerGrounded(battler); // Weaken spamming Earthquake, Magnitude, and Bulldoze. if (grounded && (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_EARTHQUAKE) @@ -369,21 +369,21 @@ static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) if (HasBattlerSideMoveWithEffect(battler, EFFECT_MISTY_EXPLOSION)) return FIELD_EFFECT_POSITIVE; - bool32 grounded = IsBattlerGrounded(battler); + bool32 grounded = AI_IsBattlerGrounded(battler); bool32 allyGrounded = FALSE; if (HasPartner(battler)) - allyGrounded = IsBattlerGrounded(BATTLE_PARTNER(battler)); + allyGrounded = AI_IsBattlerGrounded(BATTLE_PARTNER(battler)); - if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(LEFT_FOE(battler))) - || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && IsBattlerGrounded(RIGHT_FOE(battler)))) + if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(LEFT_FOE(battler))) + || (HasMoveWithEffect(RIGHT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(RIGHT_FOE(battler)))) return FIELD_EFFECT_POSITIVE; // harass dragons - if ((grounded || allyGrounded) + if ((grounded || allyGrounded) && (HasDamagingMoveOfType(LEFT_FOE(battler), TYPE_DRAGON) || HasDamagingMoveOfType(RIGHT_FOE(battler), TYPE_DRAGON))) return FIELD_EFFECT_POSITIVE; - if ((grounded || allyGrounded) + if ((grounded || allyGrounded) && (HasNonVolatileMoveEffect(LEFT_FOE(battler), MOVE_EFFECT_SLEEP) || HasNonVolatileMoveEffect(RIGHT_FOE(battler), MOVE_EFFECT_SLEEP))) return FIELD_EFFECT_POSITIVE; @@ -402,10 +402,10 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (HasMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) return FIELD_EFFECT_POSITIVE; - bool32 grounded = IsBattlerGrounded(battler); + bool32 grounded = AI_IsBattlerGrounded(battler); bool32 allyGrounded = FALSE; if (HasPartner(battler)) - allyGrounded = IsBattlerGrounded(BATTLE_PARTNER(battler)); + allyGrounded = AI_IsBattlerGrounded(BATTLE_PARTNER(battler)); // don't bother if we're not grounded if (grounded || allyGrounded) @@ -433,7 +433,7 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) static enum FieldEffectOutcome BenefitsFromGravity(u32 battler) { - if (!IsBattlerGrounded(battler)) + if (!AI_IsBattlerGrounded(battler)) return FIELD_EFFECT_NEGATIVE; if (HasBattlerSideAbility(battler, ABILITY_HUSTLE, gAiLogicData)) @@ -445,14 +445,14 @@ static enum FieldEffectOutcome BenefitsFromGravity(u32 battler) if (IsBattlerAlive(LEFT_FOE(battler))) { if (HasMoveWithLowAccuracy(battler, LEFT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) - || (!IsBattlerGrounded(LEFT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) + || (!AI_IsBattlerGrounded(LEFT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) return FIELD_EFFECT_POSITIVE; } if (IsBattlerAlive(RIGHT_FOE(battler))) { if (HasMoveWithLowAccuracy(battler, RIGHT_FOE(battler), LOW_ACCURACY_THRESHOLD, FALSE) - || (!IsBattlerGrounded(RIGHT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) + || (!AI_IsBattlerGrounded(RIGHT_FOE(battler)) && HasDamagingMoveOfType(battler, TYPE_GROUND))) return FIELD_EFFECT_POSITIVE; } @@ -469,7 +469,7 @@ static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) return FIELD_EFFECT_POSITIVE; // If we tie, we shouldn't change trick room state. else if (gAiLogicData->speedStats[battler] == gAiLogicData->speedStats[LEFT_FOE(battler)]) - return FIELD_EFFECT_NEUTRAL; + return FIELD_EFFECT_NEUTRAL; else return FIELD_EFFECT_NEGATIVE; } diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1ff97b39bc..2581cfa1ff 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1265,19 +1265,19 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); // terrain & effect checks - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsBattlerTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], STATUS_FIELD_ELECTRIC_TERRAIN)) { if (nonVolatileStatus == MOVE_EFFECT_SLEEP) RETURN_SCORE_MINUS(20); } - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) + if (IsBattlerTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], STATUS_FIELD_MISTY_TERRAIN)) { if (IsNonVolatileStatusMove(move) || IsConfusionMoveEffect(moveEffect)) RETURN_SCORE_MINUS(20); } - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) + if (IsBattlerTerrainAffected(battlerAtk, abilityAtk, aiData->holdEffects[battlerAtk], STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) { RETURN_SCORE_MINUS(20); } @@ -1501,10 +1501,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (hasPartner) { if (!(IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && IsBattlerGrounded(battlerAtk) + && AI_IsBattlerGrounded(battlerAtk) && (BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK))) && !(IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) - && IsBattlerGrounded(BATTLE_PARTNER(battlerAtk)) + && AI_IsBattlerGrounded(BATTLE_PARTNER(battlerAtk)) && aiData->abilities[BATTLE_PARTNER(battlerAtk)] != ABILITY_CONTRARY && (BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_ATK) || BattlerStatCanRise(BATTLE_PARTNER(battlerAtk), aiData->abilities[BATTLE_PARTNER(battlerAtk)], STAT_SPATK)))) @@ -1513,7 +1513,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } else if (!(IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) - && IsBattlerGrounded(battlerAtk) + && AI_IsBattlerGrounded(battlerAtk) && (BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPATK)))) { ADJUST_SCORE(-10); @@ -2840,7 +2840,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || gBattleMons[battlerAtk].volatiles.smackDown || gBattleMons[battlerAtk].volatiles.root || gBattleMons[battlerAtk].volatiles.magnetRise - || !IsBattlerGrounded(battlerAtk)) + || !AI_IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(-10); break; case EFFECT_CAMOUFLAGE: @@ -3162,7 +3162,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_MAGNET_RISE: - if (IsBattlerGrounded(battlerAtk) + if (AI_IsBattlerGrounded(battlerAtk) && (HasMoveWithEffect(battlerAtkPartner, EFFECT_EARTHQUAKE) || HasMoveWithEffect(battlerAtkPartner, EFFECT_MAGNITUDE)) && (AI_GetMoveEffectiveness(MOVE_EARTHQUAKE, battlerAtk, battlerAtkPartner) != UQ_4_12(0.0))) // Doesn't resist ground move { @@ -4249,24 +4249,24 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); break; case EFFECT_ROTOTILLER: - if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) && IsBattlerGrounded(battlerAtk)) + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GRASS) && AI_IsBattlerGrounded(battlerAtk)) { ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); } - if (hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(BATTLE_PARTNER(battlerAtk))) + if (hasPartner && IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerAtk), TYPE_GRASS) && AI_IsBattlerGrounded(BATTLE_PARTNER(battlerAtk))) { ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_SPATK)); } - if (IS_BATTLER_OF_TYPE(LEFT_FOE(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(LEFT_FOE(battlerAtk))) + if (IS_BATTLER_OF_TYPE(LEFT_FOE(battlerAtk), TYPE_GRASS) && AI_IsBattlerGrounded(LEFT_FOE(battlerAtk))) { if (aiData->abilities[LEFT_FOE(battlerAtk)] == ABILITY_CONTRARY) ADJUST_SCORE(WEAK_EFFECT); else ADJUST_SCORE(AWFUL_EFFECT); } - if (IS_BATTLER_OF_TYPE(RIGHT_FOE(battlerAtk), TYPE_GRASS) && IsBattlerGrounded(RIGHT_FOE(battlerAtk))) + if (IS_BATTLER_OF_TYPE(RIGHT_FOE(battlerAtk), TYPE_GRASS) && AI_IsBattlerGrounded(RIGHT_FOE(battlerAtk))) { if (aiData->abilities[RIGHT_FOE(battlerAtk)] == ABILITY_CONTRARY) ADJUST_SCORE(WEAK_EFFECT); @@ -4817,7 +4817,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SAFEGUARD: - if (!IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN) || !IsBattlerGrounded(battlerAtk)) + if (!IsBattlerTerrainAffected(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk], STATUS_FIELD_MISTY_TERRAIN) || !AI_IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); // TODO: check if opp has status move? //if (CountUsablePartyMons(battlerDef) != 0) //ADJUST_SCORE(8); @@ -4914,7 +4914,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (!HasMoveWithEffect(battlerDef, EFFECT_FLING) || !IsBattlerGrounded(battlerDef)) + if (!HasMoveWithEffect(battlerDef, EFFECT_FLING) || !AI_IsBattlerGrounded(battlerDef)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -5219,7 +5219,7 @@ case EFFECT_GUARD_SPLIT: if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN)) { ADJUST_SCORE(GOOD_EFFECT); - if (gBattleMons[battlerAtk].volatiles.yawn && IsBattlerGrounded(battlerAtk)) + if (gBattleMons[battlerAtk].volatiles.yawn && AI_IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(BEST_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) ADJUST_SCORE(WEAK_EFFECT); @@ -5229,7 +5229,7 @@ case EFFECT_GUARD_SPLIT: if (ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) { ADJUST_SCORE(GOOD_EFFECT); - if (gBattleMons[battlerAtk].volatiles.yawn && IsBattlerGrounded(battlerAtk)) + if (gBattleMons[battlerAtk].volatiles.yawn && AI_IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(BEST_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_TERRAIN_EXTENDER || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_TERRAIN_PULSE)) ADJUST_SCORE(WEAK_EFFECT); @@ -5351,7 +5351,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TELEKINESIS: - if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE) || !IsBattlerGrounded(battlerDef)) + if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, FALSE) || !AI_IsBattlerGrounded(battlerDef)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_HEAL_BLOCK: @@ -5437,7 +5437,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_MAGNET_RISE: - if (IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) + if (AI_IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) && !(effectiveness == UQ_4_12(0.0))) // Doesn't resist ground move { if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker goes first @@ -5519,7 +5519,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); break; case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND) && !CanTargetFaintAi(battlerDef, battlerAtk)) + if (!AI_IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND) && !CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_KNOCK_OFF: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 391b40af98..2567f1e2a5 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -708,7 +708,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) || HasMove(battler, MOVE_SLEEP_TALK) || (HasMoveWithEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) - || (IsBattlerGrounded(battler) + || (IsBattlerGrounded(battler, gAiLogicData->abilities[battler], gAiLogicData->holdEffects[battler]) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) switchMon = FALSE; @@ -1591,7 +1591,7 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon && status == 0 && !(gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) && !IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) - && !IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) + && !IsBattlerTerrainAffected(battler, ability, gAiLogicData->holdEffects[battler], STATUS_FIELD_MISTY_TERRAIN) && !IsAbilityStatusProtected(battler, ability) && heldItemEffect != HOLD_EFFECT_CURE_PSN && heldItemEffect != HOLD_EFFECT_CURE_STATUS && IsMonGrounded(heldItemEffect, ability, defType1, defType2))) @@ -2043,7 +2043,7 @@ static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) else return TRUE; } - else if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(opponent)) + else if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(opponent, gAiLogicData->abilities[opponent], gAiLogicData->holdEffects[opponent])) return TRUE; else if (ability == ABILITY_MAGNET_PULL && IS_BATTLER_OF_TYPE(opponent, TYPE_STEEL)) return TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 2c8e9fd0ce..26bf045031 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -65,6 +65,11 @@ static bool32 AI_IsDoubleSpreadMove(u32 battlerAtk, u32 move) return FALSE; } +bool32 AI_IsBattlerGrounded(u32 battler) +{ + return IsBattlerGrounded(battler, gAiLogicData->abilities[battler], gAiLogicData->holdEffects[battler]); +} + u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, struct AiLogicData *aiData) { if (calcContext == AI_ATTACKING && BattlerHasAi(battlerAtk)) @@ -497,7 +502,7 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) && (B_SHADOW_TAG_ESCAPE >= GEN_4 && gAiLogicData->abilities[battlerDef] != ABILITY_SHADOW_TAG)) return TRUE; if (AI_IsAbilityOnSide(battlerAtk, ABILITY_ARENA_TRAP) - && IsBattlerGrounded(battlerAtk)) + && AI_IsBattlerGrounded(battlerAtk)) return TRUE; if (AI_IsAbilityOnSide(battlerAtk, ABILITY_MAGNET_PULL) && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_STEEL)) @@ -3583,11 +3588,11 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, return TRUE; } -bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) +bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) { if (gBattleMons[battlerDef].volatiles.confusionTurns > 0 - || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) - || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) + || (abilityDef == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) + || IsBattlerTerrainAffected(battlerDef, abilityDef, gAiLogicData->holdEffects[battlerDef], STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) return FALSE; diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 1263632ab7..3360b305c0 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -9058,7 +9058,7 @@ void AnimTask_ShellSideArm(u8 taskId) void AnimTask_TerrainPulse(u8 taskId) { - if (IsBattlerTerrainAffected(gBattleAnimAttacker, STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker, TRUE), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) gBattleAnimArgs[0] = TYPE_ELECTRIC; diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 038080b241..f0382b3877 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -488,7 +488,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) && !IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock && !IsSemiInvulnerable(battler, CHECK_ALL) - && IsBattlerGrounded(battler)) + && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) { gBattlerAttacker = battler; gBattleStruct->moveDamage[battler] = -(GetNonDynamaxMaxHP(battler) / 16); @@ -1026,12 +1026,13 @@ static bool32 HandleEndTurnYawn(u32 battler) && !IsLeafGuardProtected(battler, ability)) { gEffectBattler = gBattlerTarget = battler; - if (IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; BattleScriptExecute(BattleScript_TerrainPreventsEnd2); } - else if (IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_MISTY; BattleScriptExecute(BattleScript_TerrainPreventsEnd2); diff --git a/src/battle_main.c b/src/battle_main.c index 4ae111357a..de7b9417f5 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3417,9 +3417,10 @@ const u8* FaintClearSetData(u32 battler) // If the released mon can be confused, do so. // Don't use CanBeConfused here, since it can cause issues in edge cases. - if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO + u32 ability = GetBattlerAbility(otherSkyDropper); + if (!(ability == ABILITY_OWN_TEMPO || gBattleMons[otherSkyDropper].volatiles.confusionTurns - || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper, TRUE), STATUS_FIELD_MISTY_TERRAIN))) { gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattlerAttacker = otherSkyDropper; @@ -4847,7 +4848,7 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) gProtectStructs[battler].pranksterElevated = 1; priority++; } - else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { priority++; } @@ -5991,7 +5992,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case EFFECT_TERRAIN_PULSE: if (state == MON_IN_BATTLE) { - if (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) return TYPE_ELECTRIC; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 98af3e07c0..66f65b9efd 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5702,7 +5702,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) } break; case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(gBattlerTarget) + if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget, TRUE)) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) @@ -7595,9 +7595,11 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) case HAZARDS_NONE: break; case HAZARDS_SPIKES: - if (GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD + { + u32 ability = GetBattlerAbility(battler); + if (ability != ABILITY_MAGIC_GUARD && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler)) + && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler, TRUE))) { u8 spikesDmg = (5 - gSideTimers[side].spikesAmount) * 2; gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); @@ -7606,8 +7608,9 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); } break; + } case HAZARDS_STICKY_WEB: - if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler)) + if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) { gBattleScripting.battler = battler; SET_STATCHANGER(STAT_SPEED, 1, TRUE); @@ -7615,7 +7618,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) } break; case HAZARDS_TOXIC_SPIKES: - if (!IsBattlerGrounded(battler)) + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) break; if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. @@ -9226,7 +9229,7 @@ static bool32 IsRototillerAffected(u32 battler) { if (!IsBattlerAlive(battler)) return FALSE; - if (!IsBattlerGrounded(battler)) + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) return FALSE; // Only grounded battlers affected if (!IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) return FALSE; // Only grass types affected @@ -9661,12 +9664,14 @@ static void Cmd_trysetrest(void) gBattlerTarget = gBattlerAttacker; gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); + u32 ability = GetBattlerAbility(gBattlerTarget); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); - if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) { gBattlescriptCurrInstr = BattleScript_MistyTerrainPrevents; } @@ -12683,19 +12688,21 @@ static void Cmd_setgastroacid(void) static void Cmd_setyawn(void) { CMD_ARGS(const u8 *failInstr); + u32 ability = GetBattlerAbility(gBattlerTarget); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); if (gBattleMons[gBattlerTarget].volatiles.yawn || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { // When Yawn is used while Electric Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: // "But it failed" will display first. gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; } - else if (IsBattlerTerrainAffected(gBattlerTarget, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) { // When Yawn is used while Misty Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: // "But it failed" will display first. @@ -14908,7 +14915,7 @@ void BS_JumpIfTerrainAffected(void) NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (IsBattlerTerrainAffected(battler, cmd->flags)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), cmd->flags)) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/src/battle_util.c b/src/battle_util.c index 0784a886bd..0ed081cf90 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1072,9 +1072,10 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) // If the target can be confused, confuse them. // Don't use CanBeConfused, can cause issues in edge cases. + u32 ability = GetBattlerAbility(otherSkyDropper); if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0 - || IsAbilityAndRecord(otherSkyDropper, GetBattlerAbility(otherSkyDropper), ABILITY_OWN_TEMPO) - || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN))) + || IsAbilityAndRecord(otherSkyDropper, ability, ABILITY_OWN_TEMPO) + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper, TRUE), STATUS_FIELD_MISTY_TERRAIN))) { // Set confused status gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; @@ -3377,7 +3378,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; } - else if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions && !IsBattlerAlly(battlerAtk, battlerDef) && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS && GetMoveTarget(move) != MOVE_TARGET_OPPONENTS_FIELD) @@ -5786,6 +5787,7 @@ u32 IsAbilityPreventingEscape(u32 battler) if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return 0; + bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE)); for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) @@ -5796,7 +5798,7 @@ u32 IsAbilityPreventingEscape(u32 battler) if (ability == ABILITY_SHADOW_TAG && (B_SHADOW_TAG_ESCAPE <= GEN_3 || GetBattlerAbility(battler) != ABILITY_SHADOW_TAG)) return battlerDef + 1; - if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(battler)) + if (ability == ABILITY_ARENA_TRAP && isBattlerGrounded) return battlerDef + 1; if (ability == ABILITY_MAGNET_PULL && IS_BATTLER_OF_TYPE(battler, TYPE_STEEL)) @@ -5843,14 +5845,14 @@ void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) gBattleMainFunc = RunBattleScriptCommands; } -bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag) +bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, u32 terrainFlag) { if (!(gFieldStatuses & terrainFlag)) return FALSE; if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; - return IsBattlerGrounded(battler); + return IsBattlerGrounded(battler, ability, holdEffect); } bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause) @@ -5928,7 +5930,7 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return FALSE; } -// Unused, technically also redundant +// Unused, technically also redundant because it is just a copy of CanBeFrozen bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) { if (CanSetNonVolatileStatus( @@ -6028,7 +6030,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { battleScript = BattleScript_SleepClauseBlocked; } - else if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_ELECTRIC_TERRAIN)) { battleScript = BattleScript_ElectricTerrainPrevents; } @@ -6076,7 +6078,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battleScript = BattleScript_AbilityProtectsDoesntAffect; } - else if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_MISTY_TERRAIN)) { battleScript = BattleScript_MistyTerrainPrevents; } @@ -6153,9 +6155,10 @@ static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum Func bool32 CanBeConfused(u32 battler) { + u32 ability = GetBattlerAbility(battler); if (gBattleMons[battler].volatiles.confusionTurns > 0 - || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) - || IsAbilityAndRecord(battler, GetBattlerAbility(battler),ABILITY_OWN_TEMPO)) + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_MISTY_TERRAIN) + || IsAbilityAndRecord(battler, ability, ABILITY_OWN_TEMPO)) return FALSE; return TRUE; } @@ -8006,11 +8009,9 @@ enum IronBallCheck }; // Only called directly when calculating damage type effectiveness, and Iron Ball's type effectiveness mechanics -static bool32 IsBattlerGroundedInverseCheck(u32 battler, u32 ability, enum InverseBattleCheck checkInverse, enum IronBallCheck checkIronBall) +bool32 IsBattlerGroundedInverseCheck(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, enum InverseBattleCheck checkInverse) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - - if (!(checkIronBall == IGNORE_IRON_BALL) && holdEffect == HOLD_EFFECT_IRON_BALL) + if (holdEffect == HOLD_EFFECT_IRON_BALL) return TRUE; if (gFieldStatuses & STATUS_FIELD_GRAVITY) return TRUE; @@ -8026,14 +8027,14 @@ static bool32 IsBattlerGroundedInverseCheck(u32 battler, u32 ability, enum Inver return FALSE; if (ability == ABILITY_LEVITATE) return FALSE; - if (IS_BATTLER_OF_TYPE(battler, TYPE_FLYING) && (!(checkInverse == INVERSE_BATTLE) || !FlagGet(B_FLAG_INVERSE_BATTLE))) + if (IS_BATTLER_OF_TYPE(battler, TYPE_FLYING) && (checkInverse != INVERSE_BATTLE || !FlagGet(B_FLAG_INVERSE_BATTLE))) return FALSE; return TRUE; } -bool32 IsBattlerGrounded(u32 battler) +bool32 IsBattlerGrounded(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) { - return IsBattlerGroundedInverseCheck(battler, GetBattlerAbility(battler), NOT_INVERSE_BATTLE, CHECK_IRON_BALL); + return IsBattlerGroundedInverseCheck(battler, ability, holdEffect, NOT_INVERSE_BATTLE); } u32 GetMoveSlot(u16 *moves, u32 move) @@ -8467,7 +8468,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower *= 2; break; case EFFECT_MISTY_EXPLOSION: - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN)) + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_MISTY_TERRAIN)) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_DYNAMAX_DOUBLE_DMG: @@ -8494,15 +8495,15 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_TERRAIN_PULSE: - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_TERRAIN_ANY)) basePower *= 2; break; case EFFECT_EXPANDING_FORCE: - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_RISING_VOLTAGE: - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsBattlerTerrainAffected(battlerDef, ctx->abilityDef, ctx->holdEffectDef, STATUS_FIELD_ELECTRIC_TERRAIN)) basePower *= 2; break; case EFFECT_BEAT_UP: @@ -8610,13 +8611,13 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (GetMoveEffect(gChosenMove) == EFFECT_ME_FIRST) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_GRASSY_TERRAIN) && moveType == TYPE_GRASS) + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_GRASSY_TERRAIN) && moveType == TYPE_GRASS) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) && moveType == TYPE_DRAGON) + if (IsBattlerTerrainAffected(battlerDef, ctx->abilityDef, ctx->holdEffectDef, STATUS_FIELD_MISTY_TERRAIN) && moveType == TYPE_DRAGON) modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_ELECTRIC_TERRAIN) && moveType == TYPE_ELECTRIC) + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_ELECTRIC_TERRAIN) && moveType == TYPE_ELECTRIC) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - if (IsBattlerTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && moveType == TYPE_PSYCHIC) + if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && moveType == TYPE_PSYCHIC) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); if (IsFieldMudSportAffected(ctx->moveType)) modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); @@ -9856,8 +9857,8 @@ s32 CalculateMoveDamage(struct DamageContext *ctx) ctx->weather = GetWeather(); ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); - ctx->holdEffectAtk = GetItemHoldEffect(ctx->battlerAtk); - ctx->holdEffectDef = GetItemHoldEffect(ctx->battlerDef); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(ctx); @@ -9904,7 +9905,7 @@ static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *m mod = UQ_4_12(1.0); if (GetMoveEffect(ctx->move) == EFFECT_SUPER_EFFECTIVE_ON_ARG && defType == GetMoveArgType(ctx->move)) mod = UQ_4_12(2.0); - if (ctx->moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(ctx->battlerDef) && mod == UQ_4_12(0.0)) + if (ctx->moveType == TYPE_GROUND && defType == TYPE_FLYING && IsBattlerGrounded(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef) && mod == UQ_4_12(0.0)) mod = UQ_4_12(1.0); if (ctx->moveType == TYPE_STELLAR && GetActiveGimmick(ctx->battlerDef) == GIMMICK_TERA) mod = UQ_4_12(2.0); @@ -10001,7 +10002,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont if (B_GLARE_GHOST < GEN_4 && ctx->move == MOVE_GLARE && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_GHOST)) modifier = UQ_4_12(0.0); } - else if (ctx->moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(ctx->battlerDef, ctx->abilityDef, INVERSE_BATTLE, CHECK_IRON_BALL) && !(MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move))) + else if (ctx->moveType == TYPE_GROUND && !IsBattlerGroundedInverseCheck(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef, INVERSE_BATTLE) && !(MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move))) { modifier = UQ_4_12(0.0); if (ctx->updateFlags && ctx->abilityDef == ABILITY_LEVITATE) @@ -10019,8 +10020,8 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont } // Thousand Arrows ignores type modifiers for flying mons - if (!IsBattlerGrounded(ctx->battlerDef) - && MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move) + if (MoveIgnoresTypeIfFlyingAndUngrounded(ctx->move) + && !IsBattlerGrounded(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef) && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING)) { modifier = UQ_4_12(1.0); @@ -10029,9 +10030,9 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont // Iron Ball ignores type modifiers for flying-type mons if it is the only source of grounding if (B_IRON_BALL >= GEN_5 && ctx->moveType == TYPE_GROUND + && ctx->holdEffectDef == HOLD_EFFECT_IRON_BALL && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING) - && GetBattlerHoldEffect(ctx->battlerDef, TRUE) == HOLD_EFFECT_IRON_BALL - && !IsBattlerGroundedInverseCheck(ctx->battlerDef, ctx->abilityAtk, NOT_INVERSE_BATTLE, IGNORE_IRON_BALL) + && !IsBattlerGrounded(ctx->battlerDef, ctx->abilityDef, HOLD_EFFECT_NONE) // We want to ignore Iron Ball so skip item check && !FlagGet(B_FLAG_INVERSE_BATTLE)) { modifier = UQ_4_12(1.0); @@ -11131,12 +11132,13 @@ bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) // Gets move target before redirection effects etc. are applied // Possible return values are defined in battle.h following MOVE_TARGET_SELECTED +// TODO: Add args: ability and hold effect u32 GetBattlerMoveTargetType(u32 battler, u32 move) { enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return MOVE_TARGET_USER; - if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) + if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_PSYCHIC_TERRAIN)) return MOVE_TARGET_BOTH; if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) return MOVE_TARGET_BOTH; @@ -11221,12 +11223,11 @@ void RemoveConfusionStatus(u32 battler) static bool32 CanBeInfinitelyConfused(u32 battler) { - if (GetBattlerAbility(battler) == ABILITY_OWN_TEMPO - || IsBattlerTerrainAffected(battler, STATUS_FIELD_MISTY_TERRAIN) - || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) - { + u32 ability = GetBattlerAbility(battler); + if (ability == ABILITY_OWN_TEMPO + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_MISTY_TERRAIN) + || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) return FALSE; - } return TRUE; } From 5e07d4a50997f65fdee4408f9fe65c4b3398871f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 25 Sep 2025 14:41:06 +0200 Subject: [PATCH 056/183] Use stored values for ai switch-in effectiveness checks (#7794) Co-authored-by: Bassoonian --- include/battle_ai_util.h | 3 ++- src/battle_ai_switch_items.c | 50 +++++++++++++++++------------------- src/battle_ai_util.c | 17 +++++++++--- 3 files changed, 39 insertions(+), 31 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 29ff4fa32c..9f76b7268d 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -172,6 +172,7 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); u16 *GetMovesArray(u32 battler); bool32 IsConfusionMoveEffect(enum BattleMoveEffects moveEffect); bool32 HasMove(u32 battlerId, u32 move); +u32 GetIndexInMoveArray(u32 battler, u32 move); bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive); bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category); bool32 HasMoveWithType(u32 battler, u32 type); @@ -292,7 +293,7 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, enum DamageCalcContext calcContext); +s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, uq4_12_t *effectiveness, enum DamageCalcContext calcContext); u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority ConsiderPriority); s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 2567f1e2a5..7d3c0ac4b0 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -276,7 +276,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) if (!IsBattleMoveStatus(aiMove) && !AI_DoesChoiceEffectBlockMove(battler, aiMove)) { // Check if mon has a super effective move - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) + if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) hasSuperEffectiveMove = TRUE; // Get maximum damage mon can deal @@ -408,9 +408,10 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if ((AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) - || AI_GetMoveEffectiveness(aiMove, battler, opposingPartner) > UQ_4_12(0.0)) - && aiMove != MOVE_NONE) + if (aiMove == MOVE_NONE) + continue; + if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] > UQ_4_12(0.0) + || gAiLogicData->effectiveness[battler][opposingPartner][moveIndex] > UQ_4_12(0.0)) return FALSE; } } @@ -419,7 +420,7 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) > UQ_4_12(0.0) && aiMove != MOVE_NONE + if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] > UQ_4_12(0.0) && aiMove != MOVE_NONE && !CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], aiMove, GetBattleMoveType(aiMove), AI_CHECK) && !CanAbilityBlockMove(battler, opposingBattler, gBattleMons[battler].ability, gAiLogicData->abilities[opposingBattler], aiMove, AI_CHECK) && (!ALL_MOVES_BAD_STATUS_MOVES_BAD || gMovesInfo[aiMove].power != 0)) // If using ALL_MOVES_BAD_STATUS_MOVES_BAD, then need power to be non-zero @@ -441,7 +442,7 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) static bool32 ShouldSwitchIfWonderGuard(u32 battler) { u32 opposingBattler = GetOppositeBattler(battler); - u32 i, move; + u32 i; if (IsDoubleBattle()) return FALSE; @@ -452,12 +453,8 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler) // Check if Pokémon has a super effective move. for (i = 0; i < MAX_MON_MOVES; i++) { - move = gBattleMons[battler].moves[i]; - if (move != MOVE_NONE) - { - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) - return FALSE; - } + if (gBattleMons[battler].moves[i] != MOVE_NONE && gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) + return FALSE; } if (RandomPercentage(RNG_AI_SWITCH_WONDER_GUARD, GetSwitchChance(SHOULD_SWITCH_WONDER_GUARD))) @@ -707,8 +704,8 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || monAbility == ABILITY_EARLY_BIRD) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) || HasMove(battler, MOVE_SLEEP_TALK) - || (HasMoveWithEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) - || (IsBattlerGrounded(battler, gAiLogicData->abilities[battler], gAiLogicData->holdEffects[battler]) + || (HasMove(battler, MOVE_SNORE) && gAiLogicData->effectiveness[battler][opposingBattler][GetIndexInMoveArray(battler, MOVE_SNORE)] >= UQ_4_12(2.0)) + || (IsBattlerGrounded(battler, monAbility, gAiLogicData->holdEffects[battler]) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) switchMon = FALSE; @@ -831,10 +828,8 @@ static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler) if (move == MOVE_NONE || AI_DoesChoiceEffectBlockMove(battler, move)) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) - { + if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) return TRUE; - } } } if (!IsDoubleBattle()) @@ -850,10 +845,8 @@ static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler) if (move == MOVE_NONE || AI_DoesChoiceEffectBlockMove(battler, move)) continue; - if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) - { + if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) return TRUE; - } } } @@ -1020,7 +1013,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); // Stay in if effective move - else if (AI_GetMoveEffectiveness(encoredMove, battler, opposingBattler) >= UQ_4_12(2.0)) + else if (gAiLogicData->effectiveness[battler][opposingBattler][GetIndexInMoveArray(battler, encoredMove)] >= UQ_4_12(2.0)) return FALSE; // Switch out 50% of the time otherwise @@ -1495,8 +1488,8 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva int i, j; int dmg, bestDmg = 0; int bestMonId = PARTY_SIZE; - u32 aiMove; + uq4_12_t effectiveness; // If we couldn't find the best mon in terms of typing, find the one that deals most damage. for (i = firstId; i < lastId; i++) @@ -1510,7 +1503,7 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j); - dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); + dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &effectiveness, AI_ATTACKING); if (bestDmg < dmg) { bestDmg = dmg; @@ -1987,13 +1980,14 @@ static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattle u32 playerMove; u16 *playerMoves = GetMovesArray(opposingBattler); s32 damageTaken = 0, maxDamageTaken = 0; + uq4_12_t effectiveness; for (i = 0; i < MAX_MON_MOVES; i++) { playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) { - damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, AI_DEFENDING); + damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, &effectiveness, AI_DEFENDING); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move return damageTaken; if (damageTaken > maxDamageTaken) @@ -2012,6 +2006,7 @@ static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposi u32 playerMove; u16 *playerMoves = GetMovesArray(opposingBattler); s32 damageTaken = 0, maxDamageTaken = 0; + uq4_12_t effectiveness = UQ_4_12(1.0); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2019,7 +2014,7 @@ static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposi if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 && playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) { - damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, AI_DEFENDING); + damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, &effectiveness, AI_DEFENDING); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move return damageTaken; if (damageTaken > maxDamageTaken) @@ -2119,6 +2114,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 bestResist = UQ_4_12(2.0), bestResistEffective = UQ_4_12(2.0), typeMatchup; // 2.0 is the default "Neutral" matchup from GetBattleMonTypeMatchup bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, isSwitchinFirstPriority, canSwitchinWin1v1; u32 invalidMons = 0; + uq4_12_t effectiveness = UQ_4_12(1.0); // Iterate through mons for (i = firstId; i < lastId; i++) @@ -2163,7 +2159,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, continue; aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; - damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); + damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &effectiveness, AI_ATTACKING); hitsToKOPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); // Offensive switchin decisions are based on which whether switchin moves first and whether it can win a 1v1 @@ -2204,7 +2200,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, { if (typeMatchup < bestResistEffective) { - if (AI_GetMoveEffectiveness(aiMove, battler, opposingBattler) >= UQ_4_12(2.0)) + if (effectiveness >= UQ_4_12(2.0)) { if (canSwitchinWin1v1) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 26bf045031..9f4ef700f4 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2313,6 +2313,18 @@ u16 *GetMovesArray(u32 battler) return gBattleHistory->usedMoves[battler]; } +u32 GetIndexInMoveArray(u32 battler, u32 move) +{ + u16 *moves = GetMovesArray(battler); + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] == move) + return i; + } + return MAX_MON_MOVES; +} + bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive) { u32 i; @@ -4319,10 +4331,9 @@ static void SetBattlerFieldStatusForSwitchin(u32 battler) } // party logic -s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, enum DamageCalcContext calcContext) +s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, uq4_12_t *effectiveness, enum DamageCalcContext calcContext) { struct SimulatedDamage dmg; - uq4_12_t effectiveness; struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); if (calcContext == AI_ATTACKING) @@ -4342,7 +4353,7 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl gAiThinkingStruct->saved[battlerAtk].saved = FALSE; } - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetSwitchinWeather(switchinCandidate)); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetSwitchinWeather(switchinCandidate)); // restores original gBattleMon struct FreeRestoreBattleMons(savedBattleMons); From f9a8a0251a886f0799dd4ef8eca751a8fa7bf136 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 25 Sep 2025 14:16:33 -0300 Subject: [PATCH 057/183] Added regional form evolution condition (#6990) --- include/constants/pokemon.h | 2 + .../pokemon/species_info/gen_1_families.h | 20 +++++----- .../pokemon/species_info/gen_2_families.h | 6 +-- .../pokemon/species_info/gen_5_families.h | 12 +++--- .../pokemon/species_info/gen_6_families.h | 8 ++-- .../pokemon/species_info/gen_7_families.h | 4 +- src/pokedex_plus_hgss.c | 38 ++++++++++++++++--- src/pokemon.c | 9 +++++ 8 files changed, 69 insertions(+), 30 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 20cff8a30f..9e0698b75d 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -300,6 +300,8 @@ enum EvolutionConditions { IF_PID_MODULO_100_LT, // The Pokémon's personality value's modulo by 100 is lower than the defined value. IF_MIN_OVERWORLD_STEPS, // The Player has taken a specific amount of steps in the overworld with the Pokémon following them or in the first slot of the party. IF_BAG_ITEM_COUNT, // The Player has the specific amount of an item in the bag. It then removes those items. + IF_REGION, // The Player is in the specific region. + IF_NOT_REGION, // The Player is NOT in the specific region. CONDITIONS_END }; diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 1b0e94aa13..a661147349 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -2949,8 +2949,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sPikachuTeachableLearnset, .formSpeciesIdTable = sPikachuFormSpeciesIdTable, .formChangeTable = sPikachuFormChangeTable, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, - {EVO_NONE, 0, SPECIES_RAICHU_ALOLA}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU, CONDITIONS({IF_NOT_REGION, REGION_ALOLA})}, + {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU_ALOLA, CONDITIONS({IF_REGION, REGION_ALOLA})}), }, #if P_COSPLAY_PIKACHU_FORMS @@ -13022,8 +13022,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sExeggcuteLevelUpLearnset, .teachableLearnset = sExeggcuteTeachableLearnset, .eggMoveLearnset = sExeggcuteEggMoveLearnset, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}, - {EVO_NONE, 0, SPECIES_EXEGGUTOR_ALOLA}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR, CONDITIONS({IF_NOT_REGION, REGION_ALOLA})}, + {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR_ALOLA, CONDITIONS({IF_REGION, REGION_ALOLA})}), }, #if P_UPDATED_EXP_YIELDS >= GEN_7 @@ -13249,8 +13249,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sCuboneLevelUpLearnset, .teachableLearnset = sCuboneTeachableLearnset, .eggMoveLearnset = sCuboneEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 28, SPECIES_MAROWAK}, - {EVO_NONE, 0, SPECIES_MAROWAK_ALOLA}, + .evolutions = EVOLUTION({EVO_LEVEL, 28, SPECIES_MAROWAK, CONDITIONS({IF_NOT_REGION, REGION_ALOLA})}, + {EVO_LEVEL, 28, SPECIES_MAROWAK_ALOLA, CONDITIONS({IF_REGION, REGION_ALOLA}, {IF_TIME, TIME_NIGHT})}, {EVO_NONE, 0, SPECIES_MAROWAK_ALOLA_TOTEM}), }, @@ -13982,8 +13982,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sKoffingLevelUpLearnset, .teachableLearnset = sKoffingTeachableLearnset, .eggMoveLearnset = sKoffingEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_WEEZING}, - {EVO_NONE, 0, SPECIES_WEEZING_GALAR}), + .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_WEEZING, CONDITIONS({IF_NOT_REGION, REGION_GALAR})}, + {EVO_LEVEL, 35, SPECIES_WEEZING_GALAR, CONDITIONS({IF_REGION, REGION_GALAR})}), }, [SPECIES_WEEZING] = @@ -15555,8 +15555,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sMimeJrLevelUpLearnset, .teachableLearnset = sMimeJrTeachableLearnset, .eggMoveLearnset = sMimeJrEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MR_MIME, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC})}, - {EVO_NONE, 0, SPECIES_MR_MIME_GALAR}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MR_MIME, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC}, {IF_NOT_REGION, REGION_GALAR})}, + {EVO_LEVEL, 0, SPECIES_MR_MIME_GALAR, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC}, {IF_REGION, REGION_GALAR})}), }, #endif //P_GEN_4_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index f95197332a..98e856aae5 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -364,8 +364,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sQuilavaLevelUpLearnset, .teachableLearnset = sQuilavaTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_TYPHLOSION}, - {EVO_NONE, 0, SPECIES_TYPHLOSION_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_TYPHLOSION, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 36, SPECIES_TYPHLOSION_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, #if P_UPDATED_EXP_YIELDS >= GEN_8 @@ -5916,7 +5916,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sUrsaringLevelUpLearnset, .teachableLearnset = sUrsaringTeachableLearnset, #if P_GEN_8_CROSS_EVOS - .evolutions = EVOLUTION({EVO_ITEM, ITEM_PEAT_BLOCK, SPECIES_URSALUNA, CONDITIONS({IF_TIME, TIME_NIGHT})}, + .evolutions = EVOLUTION({EVO_ITEM, ITEM_PEAT_BLOCK, SPECIES_URSALUNA, CONDITIONS({IF_REGION, REGION_HISUI}, {IF_TIME, TIME_NIGHT})}, {EVO_NONE, 0, SPECIES_URSALUNA_BLOODMOON}), #endif }, diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 6b46006a58..1b5e484ab8 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -656,8 +656,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sDewottLevelUpLearnset, .teachableLearnset = sDewottTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_SAMUROTT}, - {EVO_NONE, 0, SPECIES_SAMUROTT_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_SAMUROTT, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 36, SPECIES_SAMUROTT_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_SAMUROTT] = @@ -4158,8 +4158,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sPetililLevelUpLearnset, .teachableLearnset = sPetililTeachableLearnset, .eggMoveLearnset = sPetililEggMoveLearnset, - .evolutions = EVOLUTION({EVO_ITEM, ITEM_SUN_STONE, SPECIES_LILLIGANT}, - {EVO_NONE, 0, SPECIES_LILLIGANT_HISUI}), + .evolutions = EVOLUTION({EVO_ITEM, ITEM_SUN_STONE, SPECIES_LILLIGANT, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_ITEM, ITEM_SUN_STONE, SPECIES_LILLIGANT_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_LILLIGANT] = @@ -11316,8 +11316,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sRuffletLevelUpLearnset, .teachableLearnset = sRuffletTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 54, SPECIES_BRAVIARY}, - {EVO_NONE, 0, SPECIES_BRAVIARY_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 54, SPECIES_BRAVIARY, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 54, SPECIES_BRAVIARY_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_BRAVIARY] = diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 411ef400f6..03bfc713f2 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -4441,8 +4441,8 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sGoomyLevelUpLearnset, .teachableLearnset = sGoomyTeachableLearnset, .eggMoveLearnset = sGoomyEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_SLIGGOO}, - {EVO_NONE, 0, SPECIES_SLIGGOO_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_SLIGGOO, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 40, SPECIES_SLIGGOO_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_SLIGGOO] = @@ -5546,8 +5546,8 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sBergmiteLevelUpLearnset, .teachableLearnset = sBergmiteTeachableLearnset, .eggMoveLearnset = sBergmiteEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_AVALUGG}, - {EVO_NONE, 0, SPECIES_AVALUGG_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_AVALUGG, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 37, SPECIES_AVALUGG_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_AVALUGG] = diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index d264f830ad..3877ee2705 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -137,8 +137,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .levelUpLearnset = sDartrixLevelUpLearnset, .teachableLearnset = sDartrixTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 34, SPECIES_DECIDUEYE}, - {EVO_NONE, 0, SPECIES_DECIDUEYE_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 34, SPECIES_DECIDUEYE, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, + {EVO_LEVEL, 36, SPECIES_DECIDUEYE_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, [SPECIES_DECIDUEYE] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 49e1016d32..04eaa90310 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6585,7 +6585,8 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringAppend(gStringVar4, COMPOUND_STRING(", ")); } - switch((enum EvolutionConditions)evolutions[i].params[j].condition) + enum EvolutionConditions condition = evolutions[i].params[j].condition; + switch(condition) { // Gen 2 case IF_GENDER: @@ -6642,10 +6643,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept case IF_PID_UPPER_MODULO_10_EQ: case IF_PID_UPPER_MODULO_10_LT: arg = evolutions[i].params[j].arg1; - if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_GT + if (condition == IF_PID_UPPER_MODULO_10_GT && arg < 10 && arg >= 0) arg = 9 - arg; - else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_EQ + else if (condition == IF_PID_UPPER_MODULO_10_EQ && arg < 10 && arg >= 0) arg = 1; ConvertIntToDecimalStringN(gStringVar2, arg * 10, STR_CONV_MODE_LEFT_ALIGN, 3); @@ -6704,6 +6705,33 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); StringAppend(gStringVar4, COMPOUND_STRING(" move")); break; + case IF_REGION: + case IF_NOT_REGION: + { + if (condition == IF_REGION) + StringAppend(gStringVar4, COMPOUND_STRING("in ")); + else if (condition == IF_NOT_REGION) + StringAppend(gStringVar4, COMPOUND_STRING("out of ")); + + switch ((enum Region)evolutions[i].params[j].arg1) + { + case REGION_NONE: + case REGIONS_COUNT: + StringAppend(gStringVar4, COMPOUND_STRING("???")); + break; + case REGION_KANTO: StringAppend(gStringVar4, COMPOUND_STRING("Kanto")); break; + case REGION_JOHTO: StringAppend(gStringVar4, COMPOUND_STRING("Johto")); break; + case REGION_HOENN: StringAppend(gStringVar4, COMPOUND_STRING("Hoenn")); break; + case REGION_SINNOH: StringAppend(gStringVar4, COMPOUND_STRING("Sinnoh")); break; + case REGION_UNOVA: StringAppend(gStringVar4, COMPOUND_STRING("Unova")); break; + case REGION_KALOS: StringAppend(gStringVar4, COMPOUND_STRING("Kalos")); break; + case REGION_ALOLA: StringAppend(gStringVar4, COMPOUND_STRING("Alola")); break; + case REGION_GALAR: StringAppend(gStringVar4, COMPOUND_STRING("Galar")); break; + case REGION_HISUI: StringAppend(gStringVar4, COMPOUND_STRING("Hisui")); break; + case REGION_PALDEA: StringAppend(gStringVar4, COMPOUND_STRING("Paldea")); break; + } + break; + } // Gen 8 case IF_NATURE: StringCopy(gStringVar2, gNaturesInfo[evolutions[i].params[j].arg1].name); @@ -6755,10 +6783,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept case IF_PID_MODULO_100_EQ: case IF_PID_MODULO_100_LT: arg = evolutions[i].params[j].arg1; - if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_GT + if (condition == IF_PID_MODULO_100_GT && arg < 100 && arg >= 0) arg = 99 - arg; - else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_EQ + else if (condition == IF_PID_MODULO_100_EQ && arg < 100 && arg >= 0) arg = 1; ConvertIntToDecimalStringN(gStringVar2, arg, STR_CONV_MODE_LEFT_ALIGN, 3); diff --git a/src/pokemon.c b/src/pokemon.c index 745c761356..ee04d88bcf 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -37,6 +37,7 @@ #include "pokemon_storage_system.h" #include "random.h" #include "recorded_battle.h" +#include "regions.h" #include "rtc.h" #include "sound.h" #include "string_util.h" @@ -4723,6 +4724,14 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti *canStopEvo = FALSE; } break; + case IF_REGION: + if (GetCurrentRegion() == params[i].arg1) + currentCondition = TRUE; + break; + case IF_NOT_REGION: + if (GetCurrentRegion() != params[i].arg1) + currentCondition = TRUE; + break; case CONDITIONS_END: break; } From 3c9f05b3670934e40b012232bde1ddacc6243778 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 27 Sep 2025 18:47:10 +0200 Subject: [PATCH 058/183] Fixes activation order for a couple abilities (#7732) --- asm/macros/battle_script.inc | 3 +- data/battle_scripts_1.s | 68 +++-- include/battle.h | 8 +- include/battle_main.h | 4 +- include/battle_scripts.h | 2 + include/battle_util.h | 5 + include/constants/battle_script_commands.h | 8 +- src/battle_end_turn.c | 29 +-- src/battle_main.c | 38 +-- src/battle_message.c | 2 +- src/battle_script_commands.c | 127 +++++++--- src/battle_util.c | 274 ++++++++++++--------- test/battle/ability/anger_shell.c | 20 ++ test/battle/ability/berserk.c | 61 +++++ test/battle/ability/color_change.c | 13 + test/battle/ability/opportunist.c | 21 ++ 16 files changed, 464 insertions(+), 219 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 798c8d1bd4..4cb30b27f1 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1011,8 +1011,9 @@ .4byte \jumpInstr .endm - .macro tryrestorehpberry + .macro tryrestorehpberry battler:req .byte 0xbb + .byte \battler .endm .macro halvehp failInstr:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f85a077c8a..4953b48aae 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4966,7 +4966,7 @@ BattleScript_MagicRoomEnds:: setbyte gBattlerTarget, 0 BattleScript_MagicRoomHealingItemsLoop: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattlerTarget, 1 - tryrestorehpberry + tryrestorehpberry BS_ATTACKER addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MagicRoomHealingItemsLoop end2 @@ -5404,27 +5404,36 @@ BattleScript_SeedSowerActivates:: call BattleScript_ActivateTerrainEffects return -BattleScript_AngerShellActivates:: +BattleScript_BerserkActivates:: saveattacker - copybyte gBattlerAttacker, gBattlerTarget + copybyte gBattlerAttacker, gEffectBattler call BattleScript_AbilityPopUp - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_AngerShellTryDef - jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_RestoreAttackerButItFailed -BattleScript_AngerShellTryDef:: - modifybattlerstatstage BS_ATTACKER, STAT_DEF, DECREASE, 1, BattleScript_AngerShellTrySpDef, ANIM_ON -BattleScript_AngerShellTrySpDef: - modifybattlerstatstage BS_ATTACKER, STAT_SPDEF, DECREASE, 1, BattleScript_AngerShellTryAttack, ANIM_ON -BattleScript_AngerShellTryAttack: - modifybattlerstatstage BS_ATTACKER, STAT_ATK, INCREASE, 1, BattleScript_AngerShellTrySpAtk, ANIM_ON -BattleScript_AngerShellTrySpAtk: - modifybattlerstatstage BS_ATTACKER, STAT_SPATK, INCREASE, 1, BattleScript_AngerShellTrySpeed, ANIM_ON -BattleScript_AngerShellTrySpeed: - modifybattlerstatstage BS_ATTACKER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON -BattleScript_AngerShellRet: + statbuffchange BS_EFFECT_BATTLER, STAT_CHANGE_CERTAIN, BattleScript_BerserkActivatesTryBerry + call BattleScript_StatUp +BattleScript_BerserkActivatesTryBerry: restoreattacker + tryrestorehpberry BS_EFFECT_BATTLER + return + +BattleScript_AngerShellActivates:: + call BattleScript_AbilityPopUp + jumpifstat BS_EFFECT_BATTLER, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_LESS_THAN, STAT_SPEED, MAX_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_AngerShellTryDef + jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_RestoreAttackerButItFailed +BattleScript_AngerShellTryDef:: + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_DEF, DECREASE, 1, BattleScript_AngerShellTrySpDef, ANIM_ON +BattleScript_AngerShellTrySpDef: + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_SPDEF, DECREASE, 1, BattleScript_AngerShellTryAttack, ANIM_ON +BattleScript_AngerShellTryAttack: + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_ATK, INCREASE, 1, BattleScript_AngerShellTrySpAtk, ANIM_ON +BattleScript_AngerShellTrySpAtk: + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_SPATK, INCREASE, 1, BattleScript_AngerShellTrySpeed, ANIM_ON +BattleScript_AngerShellTrySpeed: + modifybattlerstatstage BS_EFFECT_BATTLER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON +BattleScript_AngerShellRet: + tryrestorehpberry BS_EFFECT_BATTLER return BattleScript_WindPowerActivates:: @@ -5557,8 +5566,10 @@ BattleScript_DoFutureAttackResult: tryfaintmon BS_TARGET checkteamslost BattleScript_FutureAttackEnd BattleScript_FutureAttackEnd:: + moveendcase MOVEEND_SET_VALUES moveendcase MOVEEND_RAGE moveendcase MOVEEND_ABILITIES + moveendcase MOVEEND_COLOR_CHANGE moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES setmoveresultflags 0 end2 @@ -6142,7 +6153,7 @@ BattleScript_DoTurnDmg: datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd - tryrestorehpberry + tryrestorehpberry BS_ATTACKER BattleScript_DoTurnDmgEnd: end2 @@ -6384,7 +6395,7 @@ BattleScript_YawnEnd: BattleScript_EmbargoEndTurn:: printstring STRINGID_EMBARGOENDS waitmessage B_WAIT_TIME_LONG - tryrestorehpberry + tryrestorehpberry BS_ATTACKER end2 BattleScript_TelekinesisEndTurn:: @@ -6674,7 +6685,7 @@ BattleScript_PickupActivates:: call BattleScript_AbilityPopUp printstring STRINGID_XFOUNDONEY waitmessage B_WAIT_TIME_LONG - tryrestorehpberry + tryrestorehpberry BS_ATTACKER BattleScript_PickupActivatesEnd: end2 @@ -6684,7 +6695,7 @@ BattleScript_HarvestActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HARVESTBERRY waitmessage B_WAIT_TIME_LONG - tryrestorehpberry + tryrestorehpberry BS_ATTACKER BattleScript_HarvestActivatesEnd: end2 @@ -8174,6 +8185,10 @@ BattleScript_OpportunistStartCopyStats: goto BattleScript_OpportunistStartCopyStats BattleScript_OpportunistCopyStatChangeEnd: setbyte sSTAT_ANIM_PLAYED, FALSE + return + +BattleScript_OpportunistCopyStatChangeEnd3:: + call BattleScript_OpportunistCopyStatChange end3 BattleScript_TotemVar:: @@ -8593,14 +8608,13 @@ BattleScript_SymbiosisActivates:: return BattleScript_TargetAbilityStatRaiseRet:: - copybyte sSAVED_BATTLER, gBattlerAttacker - copybyte gBattlerAbility, gEffectBattler - copybyte gBattlerAttacker, gBattlerTarget + saveattacker + copybyte gBattlerAttacker, gEffectBattler call BattleScript_AbilityPopUp statbuffchange BS_ATTACKER, STAT_CHANGE_CERTAIN, BattleScript_TargetAbilityStatRaiseRet_End call BattleScript_StatUp BattleScript_TargetAbilityStatRaiseRet_End: - copybyte gBattlerAttacker, sSAVED_BATTLER + restoreattacker return @@@ MAX MOVES @@@ diff --git a/include/battle.h b/include/battle.h index db3e69821e..3d3b38a407 100644 --- a/include/battle.h +++ b/include/battle.h @@ -607,8 +607,9 @@ struct BattleStruct struct BattlerState battlerState[MAX_BATTLERS_COUNT]; struct PartyState partyState[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 eventBlockCounter; - u8 turnEffectsBattlerId; u8 endTurnEventsCounter; + u8 turnEffectsBattlerId:4; + u8 moveEndBattlerId:4; u16 wrappedMove[MAX_BATTLERS_COUNT]; u16 moveTarget[MAX_BATTLERS_COUNT]; u32 expShareExpValue; @@ -779,7 +780,8 @@ struct BattleStruct u8 numHazards[NUM_BATTLE_SIDES]; u8 hazardsCounter:4; // Counter for applying hazard on switch in enum SubmoveState submoveAnnouncement:2; - u8 padding2:2; + u8 toxicChainPriority:1; // If Toxic Chain will trigger on target, all other non volatiles will be blocked + u8 padding2:1; }; struct AiBattleData @@ -901,7 +903,7 @@ struct BattleScripting s32 savedDmg; u16 savedMoveEffect; // For moves hitting multiple targets. u16 moveEffect; - u16 multihitMoveEffect; + u16 unused_0x30; u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. bool8 fixedPopup; // Force ability popup to stick until manually called back u16 abilityPopupOverwrite; diff --git a/include/battle_main.h b/include/battle_main.h index bf8e88fc5d..70934124e0 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -57,9 +57,9 @@ enum FirstTurnEventsStates FIRST_TURN_EVENTS_TOTEM_BOOST, FIRST_TURN_EVENTS_NEUTRALIZING_GAS, FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES, - FIRST_TURN_EVENTS_OPPORTUNIST_1, FIRST_TURN_EVENTS_ITEM_EFFECTS, - FIRST_TURN_EVENTS_OPPORTUNIST_2, + FIRST_TURN_EVENTS_OPPORTUNIST, + FIRST_TURN_EVENTS_MIRROR_HERB, FIRST_TURN_EVENTS_EJECT_PACK, FIRST_TURN_EVENTS_END, }; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index c1b83c5f70..de01888a6d 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -3,6 +3,7 @@ extern const u8 BattleScript_SupersweetSyrupActivates[]; extern const u8 BattleScript_OpportunistCopyStatChange[]; +extern const u8 BattleScript_OpportunistCopyStatChangeEnd3[]; extern const u8 BattleScript_MirrorHerbCopyStatChange[]; extern const u8 BattleScript_MirrorHerbCopyStatChangeEnd2[]; extern const u8 BattleScript_NotAffected[]; @@ -461,6 +462,7 @@ extern const u8 BattleScript_RemoveFireType[]; extern const u8 BattleScript_TargetAbilityStatRaiseRet[]; extern const u8 BattleScript_RemoveElectricType[]; extern const u8 BattleScript_SeedSowerActivates[]; +extern const u8 BattleScript_BerserkActivates[]; extern const u8 BattleScript_AngerShellActivates[]; extern const u8 BattleScript_WellBakedBodyActivates[]; extern const u8 BattleScript_WindRiderActivatesMoveEnd[]; diff --git a/include/battle_util.h b/include/battle_util.h index 0ce1a9b7d7..b06619e6ba 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -43,6 +43,7 @@ enum { ABILITYEFFECT_ON_SWITCHIN, ABILITYEFFECT_ENDTURN, ABILITYEFFECT_MOVE_END_ATTACKER, + ABILITYEFFECT_COLOR_CHANGE, // Color Change, Berserk, Anger Shell ABILITYEFFECT_MOVE_END, ABILITYEFFECT_IMMUNITY, ABILITYEFFECT_SYNCHRONIZE, @@ -55,6 +56,7 @@ enum { ABILITYEFFECT_SWITCH_IN_TERRAIN, ABILITYEFFECT_SWITCH_IN_WEATHER, ABILITYEFFECT_OPPORTUNIST, + ABILITYEFFECT_OPPORTUNIST_FIRST_TURN, ABILITYEFFECT_SWITCH_IN_STATUSES, }; @@ -64,6 +66,7 @@ enum ItemCaseId ITEMEFFECT_NONE, ITEMEFFECT_ON_SWITCH_IN, ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, + ITEMEFFECT_LEFTOVERS, // Leftovers, Black Sludge ITEMEFFECT_NORMAL, ITEMEFFECT_TRY_HEALING, ITEMEFFECT_MOVE_END, @@ -74,6 +77,8 @@ enum ItemCaseId ITEMEFFECT_USE_LAST_ITEM, // move end effects for just the battler, not whole field ITEMEFFECT_WHITE_HERB, ITEMEFFECT_WHITE_HERB_ENDTURN, + ITEMEFFECT_MIRROR_HERB, + ITEMEFFECT_MIRROR_HERB_FIRST_TURN, }; enum ItemEffect diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 78c2200018..06115abe88 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -33,7 +33,7 @@ #define sSAVED_DMG (gBattleScripting + 0x28) // savedDmg #define sSAVED_MOVE_EFFECT (gBattleScripting + 0x2C) // savedMoveEffect #define sMOVE_EFFECT (gBattleScripting + 0x2E) // moveEffect -#define sMULTIHIT_EFFECT (gBattleScripting + 0x30) // multihitMoveEffect +#define sUNUSED_0x30 (gBattleScripting + 0x30) // unused_0x30 #define sILLUSION_NICK_HACK (gBattleScripting + 0x32) // illusionNickHack #define sFIXED_ABILITY_POPUP (gBattleScripting + 0x33) // fixedPopup #define sABILITY_OVERWRITE (gBattleScripting + 0x34) // abilityPopupOverwrite @@ -128,7 +128,7 @@ enum CmdVarious // cases for Cmd_moveend - Order matters! enum MoveEndEffects { - MOVEEND_SUM_DAMAGE, + MOVEEND_SET_VALUES, MOVEEND_PROTECT_LIKE_EFFECT, MOVEEND_ABSORB, MOVEEND_RAGE, @@ -155,14 +155,16 @@ enum MoveEndEffects MOVEEND_ITEM_EFFECTS_ATTACKER, MOVEEND_ABILITY_BLOCK, MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip until Opportunist + MOVEEND_COLOR_CHANGE, // Color Change / Berserk / Anger Shell MOVEEND_RED_CARD, // Red Card triggers before Eject Pack MOVEEND_EJECT_BUTTON, - MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc + MOVEEND_LIFEORB_SHELLBELL, // Shell Bell / Life Orb / Throat Spray MOVEEND_FORM_CHANGE, MOVEEND_EMERGENCY_EXIT, MOVEEND_EJECT_PACK, MOVEEND_HIT_ESCAPE, MOVEEND_OPPORTUNIST, // Occurs after other stat change items/abilities to try and copy the boosts + MOVEEND_MIRROR_HERB, MOVEEND_PICKPOCKET, MOVEEND_WHITE_HERB, MOVEEND_THIRD_MOVE_BLOCK, diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index f0382b3877..e7485da64d 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -425,17 +425,22 @@ static bool32 HandleEndTurnWish(u32 battler) static bool32 HandleEndTurnFirstEventBlock(u32 battler) { bool32 effect = FALSE; - u32 side; + if (!IsBattlerAlive(battler)) + { + gBattleStruct->eventBlockCounter = 0; + gBattleStruct->turnEffectsBattlerId++; + return effect; + } + switch (gBattleStruct->eventBlockCounter) { case FIRST_EVENT_BLOCK_GMAX_MOVE_RESIDUAL: // TODO: Has to be split into 3 statuses and needs a queue side = GetBattlerSide(battler); if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES) { - if (IsBattlerAlive(battler) - && !IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType) + if (!IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { gBattlerAttacker = battler; @@ -448,7 +453,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) gBattleStruct->eventBlockCounter++; break; case FIRST_EVENT_BLOCK_SEA_OF_FIRE_DAMAGE: - if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE && IsBattlerAlive(battler)) + if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) { gBattlerAttacker = battler; gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; @@ -484,7 +489,6 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) break; case FIRST_EVENT_BLOCK_GRASSY_TERRAIN_HEAL: if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN - && IsBattlerAlive(battler) && !IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock && !IsSemiInvulnerable(battler, CHECK_ALL) @@ -515,23 +519,12 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) break; } case FIRST_EVENT_BLOCK_HEAL_ITEMS: - { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); - switch (holdEffect) - { - case HOLD_EFFECT_LEFTOVERS: - case HOLD_EFFECT_BLACK_SLUDGE: - if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) - effect = TRUE; - break; - default: - break; - } + if (ItemBattleEffects(ITEMEFFECT_LEFTOVERS, battler)) + effect = TRUE; gBattleStruct->eventBlockCounter = 0; gBattleStruct->turnEffectsBattlerId++; break; } - } return effect; } diff --git a/src/battle_main.c b/src/battle_main.c index de7b9417f5..27f414e6ec 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3864,23 +3864,18 @@ static void TryDoEventsBeforeFirstTurn(void) case FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { - i = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - if (TryPrimalReversion(i)) + if (TryPrimalReversion(battler)) return; - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0) != 0) + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0)) return; - if (TryClearIllusion(i, ABILITYEFFECT_ON_SWITCHIN)) + if (TryClearIllusion(battler, ABILITYEFFECT_ON_SWITCHIN)) return; } gBattleStruct->switchInBattlerCounter = 0; gBattleStruct->eventsBeforeFirstTurnState++; break; - case FIRST_TURN_EVENTS_OPPORTUNIST_1: - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, 0, 0, 0, 0)) - return; - gBattleStruct->eventsBeforeFirstTurnState++; - break; case FIRST_TURN_EVENTS_ITEM_EFFECTS: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { @@ -3890,9 +3885,23 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->switchInBattlerCounter = 0; gBattleStruct->eventsBeforeFirstTurnState++; break; - case FIRST_TURN_EVENTS_OPPORTUNIST_2: - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, 0, 0, 0, 0)) - return; + case FIRST_TURN_EVENTS_OPPORTUNIST: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST_FIRST_TURN, battler, GetBattlerAbility(battler), 0, 0)) + return; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventsBeforeFirstTurnState++; + break; + case FIRST_TURN_EVENTS_MIRROR_HERB: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++])) + return; + } + gBattleStruct->switchInBattlerCounter = 0; gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_EJECT_PACK: @@ -3925,8 +3934,8 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[i]; } - *(&gBattleStruct->eventBlockCounter) = 0; - *(&gBattleStruct->turnEffectsBattlerId) = 0; + gBattleStruct->eventBlockCounter = 0; + gBattleStruct->turnEffectsBattlerId = 0; gBattleScripting.moveendState = 0; gBattleStruct->faintedActionsState = 0; gBattleStruct->endTurnEventsCounter = 0; @@ -5354,7 +5363,6 @@ static void CheckChangingTurnOrderEffects(void) gBattleMainFunc = RunTurnActionsFunctions; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; - gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; } diff --git a/src/battle_message.c b/src/battle_message.c index d79e7bf573..d3ba9427ef 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -352,7 +352,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNPROTECTEDBY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was protected by {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSUSAGE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents {B_ATK_NAME_WITH_PREFIX2} from using {B_CURRENT_MOVE}!"), //I don't see this in SV text [STRINGID_PKMNRESTOREDHPUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} restored HP using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup - [STRINGID_PKMNCHANGEDTYPEWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made it the {B_BUFF1} type!"), //not in gen 5+, ability popup + [STRINGID_PKMNCHANGEDTYPEWITH] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} made it the {B_BUFF1} type!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSROMANCEWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents romance!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSCONFUSIONWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents confusion!"), //not in gen 5+, ability popup [STRINGID_PKMNRAISEDFIREPOWERWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised the power of Fire-type moves!"), //not in gen 5+, ability popup diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 66f65b9efd..36638b8aac 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -962,6 +962,26 @@ static const struct PickupItem sPickupTable[] = #undef _ +static void ValidateSavedBattlerCounts(void) +{ + if (gBattleStruct->savedAttackerCount > 0) + { + // #if TESTING + // Test_ExitWithResult(TEST_RESULT_ERROR, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); + // #else + DebugPrintfLevel(MGBA_LOG_WARN, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); + // #endif + } + if (gBattleStruct->savedTargetCount > 0) + { + // #if TESTING + // Test_ExitWithResult(TEST_RESULT_ERROR, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); + // #else + DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); + // #endif + } +} + static bool32 NoTargetPresent(u8 battler, u32 move) { if (!IsBattlerAlive(gBattlerTarget)) @@ -4005,6 +4025,10 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai static bool32 CanApplyAdditionalEffect(const struct AdditionalEffect *additionalEffect) { + // If Toxic Chain will activate it blocks all other non volatile effects + if (gBattleStruct->toxicChainPriority && additionalEffect->moveEffect <= MOVE_EFFECT_FROSTBITE) + return FALSE; + if (additionalEffect->self && NumAffectedSpreadMoveTargets() > 1 && GetNextTarget(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), TRUE) != MAX_BATTLERS_COUNT) @@ -4021,6 +4045,20 @@ static bool32 CanApplyAdditionalEffect(const struct AdditionalEffect *additional return TRUE; } +static void SetToxicChainPriority(void) +{ + if (gBattleStruct->toxicChainPriority) + return; + + u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + if (abilityAtk == ABILITY_TOXIC_CHAIN + && IsBattlerAlive(gBattlerTarget) + && CanBePoisoned(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerAbility(gBattlerTarget)) + && IsBattlerTurnDamaged(gBattlerTarget) + && RandomWeighted(RNG_TOXIC_CHAIN, 7, 3)) + gBattleStruct->toxicChainPriority = TRUE; +} + static void Cmd_setadditionaleffects(void) { CMD_ARGS(); @@ -4028,6 +4066,7 @@ static void Cmd_setadditionaleffects(void) if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) { u32 numAdditionalEffects = GetMoveAdditionalEffectCount(gCurrentMove); + SetToxicChainPriority(); if (numAdditionalEffects > gBattleStruct->additionalEffectsCounter) { u32 percentChance; @@ -4076,8 +4115,6 @@ static void Cmd_setadditionaleffects(void) gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr = cmd->nextInstr; } - - gBattleScripting.multihitMoveEffect = 0; } static void Cmd_seteffectprimary(void) @@ -4111,7 +4148,6 @@ static void Cmd_clearvolatile(void) gProtectStructs[battler].chargingTurn = FALSE; gBattlescriptCurrInstr = cmd->nextInstr; - gBattleScripting.multihitMoveEffect = 0; } static void Cmd_tryfaintmon(void) @@ -5849,8 +5885,9 @@ static void Cmd_moveend(void) { switch (gBattleScripting.moveendState) { - case MOVEEND_SUM_DAMAGE: // Sum and store damage dealt for multi strike recoil + case MOVEEND_SET_VALUES: gBattleScripting.savedDmg += gBattleStruct->moveDamage[gBattlerTarget]; + gBattleStruct->moveEndBattlerId = 0; gBattleScripting.moveendState++; break; case MOVEEND_PROTECT_LIKE_EFFECT: @@ -6417,6 +6454,18 @@ static void Cmd_moveend(void) else gBattleScripting.moveendState++; break; + case MOVEEND_COLOR_CHANGE: + while (gBattleStruct->moveEndBattlerId < gBattlersCount) + { + u32 battler = gBattleStruct->moveEndBattlerId++; + if (battler == gBattlerAttacker) + continue; + if (AbilityBattleEffects(ABILITYEFFECT_COLOR_CHANGE, battler, GetBattlerAbility(battler), 0, 0)) + return; + } + gBattleStruct->moveEndBattlerId = 0; + gBattleScripting.moveendState++; + break; case MOVEEND_RED_CARD: { u32 redCardBattlers = 0, i; @@ -6648,10 +6697,24 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_OPPORTUNIST: - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, 0, 0, 0, 0)) - effect = TRUE; // it loops through all battlers, so we increment after its done with all battlers - else - gBattleScripting.moveendState++; + while (gBattleStruct->moveEndBattlerId < gBattlersCount) + { + u32 battler = gBattleStruct->moveEndBattlerId++; + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, GetBattlerAbility(battler), 0, 0)) + return; + } + gBattleStruct->moveEndBattlerId = 0; + gBattleScripting.moveendState++; + break; + case MOVEEND_MIRROR_HERB: + while (gBattleStruct->moveEndBattlerId < gBattlersCount) + { + u32 battler = gBattleStruct->moveEndBattlerId++; + if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, battler)) + return; + } + gBattleStruct->moveEndBattlerId = 0; + gBattleScripting.moveendState++; break; case MOVEEND_PICKPOCKET: if (IsBattlerAlive(gBattlerAttacker) @@ -6782,25 +6845,7 @@ static void Cmd_moveend(void) && gBattleMons[gBattlerAttacker].volatiles.lockConfusionTurns != 1) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); // Cancel it - if (gBattleStruct->savedAttackerCount > 0) - { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); - // #endif - } - if (gBattleStruct->savedTargetCount > 0) - { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); - // #endif - } - - if (gBattleMons[gBattlerAttacker].volatiles.destinyBond > 0) - gBattleMons[gBattlerAttacker].volatiles.destinyBond--; + ValidateSavedBattlerCounts(); gProtectStructs[gBattlerAttacker].shellTrap = FALSE; gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE; gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; @@ -6814,12 +6859,15 @@ static void Cmd_moveend(void) gBattleStruct->fickleBeamBoosted = FALSE; gBattleStruct->battlerState[gBattlerAttacker].usedMicleBerry = FALSE; gBattleStruct->noTargetPresent = FALSE; + gBattleStruct->toxicChainPriority = FALSE; if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) gBattleMons[gBattlerAttacker].volatiles.charge = FALSE; + if (gBattleMons[gBattlerAttacker].volatiles.destinyBond > 0) + gBattleMons[gBattlerAttacker].volatiles.destinyBond--; // check if Stellar type boost should be used up if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA && GetBattlerTeraType(gBattlerAttacker) == TYPE_STELLAR @@ -7732,25 +7780,24 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler)) return TRUE; - else if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0)) - return TRUE; for (i = 0; i < gBattlersCount; i++) { if (i == battler) continue; - switch (GetBattlerAbility(i)) + u32 ability = GetBattlerAbility(i); + switch (ability) { case ABILITY_TRACE: case ABILITY_COMMANDER: - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0)) + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, ability, 0, 0)) return TRUE; break; case ABILITY_FORECAST: case ABILITY_FLOWER_GIFT: case ABILITY_PROTOSYNTHESIS: - if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, 0, 0, 0)) + if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, ability, 0, 0)) return TRUE; break; } @@ -7758,6 +7805,17 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) return TRUE; } + for (i = 0; i < gBattlersCount; i++) + { + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, i, GetBattlerAbility(i), 0, 0)) + return TRUE; + } + for (i = 0; i < gBattlersCount; i++) + { + if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, battler)) + return TRUE; + } + for (i = 0; i < gBattlersCount; i++) { if (gBattlerByTurnOrder[i] == battler) @@ -11988,8 +12046,9 @@ static void Cmd_jumpifnopursuitswitchdmg(void) static void Cmd_tryrestorehpberry(void) { - CMD_ARGS(); - if (TryRestoreHPBerries(gBattlerAttacker, ITEMEFFECT_TRY_HEALING)) + CMD_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (TryRestoreHPBerries(battler, ITEMEFFECT_TRY_HEALING)) return; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index 0ed081cf90..ef3799e28b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -910,7 +910,6 @@ void HandleAction_ActionFinished(void) gBattleScripting.moveendState = 0; gBattleCommunication[3] = 0; gBattleCommunication[4] = 0; - gBattleScripting.multihitMoveEffect = 0; gBattleResources->battleScriptsStack->size = 0; gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; @@ -4727,6 +4726,48 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } } break; + case ABILITYEFFECT_COLOR_CHANGE: + switch (gLastUsedAbility) + { + case ABILITY_COLOR_CHANGE: + if (IsBattlerTurnDamaged(battler) + && IsBattlerAlive(battler) + && !IS_BATTLER_OF_TYPE(battler, moveType) + && move != MOVE_STRUGGLE + && moveType != TYPE_STELLAR + && moveType != TYPE_MYSTERY) + { + gEffectBattler = gBattlerAbility = battler; + SET_BATTLER_TYPE(battler, moveType); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); + BattleScriptCall(BattleScript_ColorChangeActivates); + effect++; + } + break; + case ABILITY_BERSERK: + if (IsBattlerTurnDamaged(battler) + && IsBattlerAlive(battler) + && HadMoreThanHalfHpNowDoesnt(battler) + && CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gEffectBattler = gBattlerAbility = battler; + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptCall(BattleScript_BerserkActivates); + effect++; + } + break; + case ABILITY_ANGER_SHELL: + if (IsBattlerTurnDamaged(battler) + && IsBattlerAlive(battler) + && HadMoreThanHalfHpNowDoesnt(battler)) + { + gEffectBattler = gBattlerAbility = battler; + BattleScriptCall(BattleScript_AngerShellActivates); + effect++; + } + break; + } + break; case ABILITYEFFECT_MOVE_END: // Think contact abilities. switch (gLastUsedAbility) { @@ -4746,7 +4787,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && moveType == TYPE_DARK && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; @@ -4758,7 +4799,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && (moveType == TYPE_DARK || moveType == TYPE_BUG || moveType == TYPE_GHOST) && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_SPEED, 1, FALSE); BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; @@ -4770,7 +4811,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && moveType == TYPE_WATER && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_DEF, 2, FALSE); BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; @@ -4782,26 +4823,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && IsBattlerAlive(battler) && CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_DEF, 1, FALSE); BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; - case ABILITY_BERSERK: - if (IsBattlerTurnDamaged(battler) - && IsBattlerAlive(battler) - && HadMoreThanHalfHpNowDoesnt(battler) - && (gMultiHitCounter == 0 || gMultiHitCounter == 1) - && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) - && CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - gEffectBattler = battler; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); - effect++; - } - break; case ABILITY_WEAK_ARMOR: if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) @@ -4894,21 +4921,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; - case ABILITY_COLOR_CHANGE: - if (move != MOVE_STRUGGLE - && !IsBattleMoveStatus(move) - && IsBattlerTurnDamaged(battler) - && !IS_BATTLER_OF_TYPE(battler, moveType) - && moveType != TYPE_STELLAR - && moveType != TYPE_MYSTERY - && IsBattlerAlive(battler)) - { - SET_BATTLER_TYPE(battler, moveType); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); - BattleScriptCall(BattleScript_ColorChangeActivates); - effect++; - } - break; case ABILITY_GOOEY: case ABILITY_TANGLING_HAIR: if (IsBattlerAlive(gBattlerAttacker) @@ -5123,7 +5135,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) && (moveType == TYPE_FIRE || moveType == TYPE_WATER)) { - gEffectBattler = battler; + gEffectBattler = gBattlerAbility = battler; SET_STATCHANGER(STAT_SPEED, 6, FALSE); BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; @@ -5209,24 +5221,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN) && moveType == TYPE_FIRE) { - gEffectBattler = gBattlerTarget; + gEffectBattler = gBattlerAbility = gBattlerTarget; SET_STATCHANGER(STAT_ATK, 1, FALSE); BattleScriptCall(BattleScript_TargetAbilityStatRaiseRet); effect++; } break; - case ABILITY_ANGER_SHELL: - if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg - && IsBattlerTurnDamaged(gBattlerTarget) - && (gMultiHitCounter == 0 || gMultiHitCounter == 1) // Activates after all hits from a multi-hit move. - && IsBattlerAlive(gBattlerTarget) - && HadMoreThanHalfHpNowDoesnt(gBattlerTarget) - && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove))) - { - BattleScriptCall(BattleScript_AngerShellActivates); - effect++; - } - break; case ABILITY_WIND_POWER: if (!IsWindMove(gCurrentMove)) break; @@ -5274,13 +5274,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_TOXIC_CHAIN: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && IsBattlerAlive(gBattlerTarget) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && CanBePoisoned(gBattlerAttacker, gBattlerTarget, gLastUsedAbility, GetBattlerAbility(gBattlerTarget)) - && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target - && RandomWeighted(RNG_TOXIC_CHAIN, 7, 3)) + if (gBattleStruct->toxicChainPriority) { + gBattleStruct->toxicChainPriority = FALSE; gEffectBattler = gBattlerTarget; gBattleScripting.battler = gBattlerAttacker; gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; @@ -5356,25 +5352,22 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITYEFFECT_OPPORTUNIST: - /* Similar to ABILITYEFFECT_IMMUNITY in that it loops through all battlers. - * Is called after ABILITYEFFECT_ON_SWITCHIN to copy any boosts - * from switch in abilities e.g. intrepid sword, as - */ - for (battler = 0; battler < gBattlersCount; battler++) + case ABILITYEFFECT_OPPORTUNIST_FIRST_TURN: + switch (ability) { - switch (GetBattlerAbility(battler)) + case ABILITY_OPPORTUNIST: + if (gProtectStructs[battler].activateOpportunist == 2) { - case ABILITY_OPPORTUNIST: - if (gProtectStructs[battler].activateOpportunist == 2) - { - gBattleScripting.battler = battler; - gProtectStructs[battler].activateOpportunist--; - ChooseStatBoostAnimation(battler); - BattleScriptPushCursorAndCallback(BattleScript_OpportunistCopyStatChange); - effect = 1; - } - break; + gBattleScripting.battler = battler; + gProtectStructs[battler].activateOpportunist--; + ChooseStatBoostAnimation(battler); + if (caseID == ABILITYEFFECT_OPPORTUNIST_FIRST_TURN) + BattleScriptPushCursorAndCallback(BattleScript_OpportunistCopyStatChangeEnd3); + else + BattleScriptCall(BattleScript_OpportunistCopyStatChange); + effect = 1; } + break; } break; case ABILITYEFFECT_IMMUNITY: @@ -6527,7 +6520,7 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) gBattleScripting.battler = battler; gProtectStructs[battler].eatMirrorHerb = 0; ChooseStatBoostAnimation(battler); - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) + if (caseID == ITEMEFFECT_MIRROR_HERB_FIRST_TURN) BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); else BattleScriptCall(BattleScript_MirrorHerbCopyStatChange); @@ -6767,9 +6760,6 @@ static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) case HOLD_EFFECT_BERSERK_GENE: effect = ConsumeBerserkGene(battler, ITEMEFFECT_NONE); break; - case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(battler, ITEMEFFECT_NONE); - break; default: break; } @@ -6832,6 +6822,43 @@ static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) return effect; } +// This is hacky and could potentially be improved because ideally this function wouldn't exist but there is some inconsitency with timings. +static bool32 ShouldWaitWithActivation(u32 battler, enum ItemHoldEffect holdEffect) +{ + if (holdEffect != HOLD_EFFECT_RESTORE_HP + && holdEffect != HOLD_EFFECT_RESTORE_PCT_HP + && holdEffect != HOLD_EFFECT_RESTORE_PP + && holdEffect != HOLD_EFFECT_CONFUSE_SPICY + && holdEffect != HOLD_EFFECT_CONFUSE_DRY + && holdEffect != HOLD_EFFECT_CONFUSE_SWEET + && holdEffect != HOLD_EFFECT_CONFUSE_BITTER + && holdEffect != HOLD_EFFECT_CONFUSE_SOUR) + return FALSE; + + // Restore HP berries can be knocked off + if (gBattleStruct->battlerState[battler].itemCanBeKnockedOff) + return TRUE; + + if (IsBattlerTurnDamaged(battler) + && gMultiHitCounter == 0 // Non multi hit moves don't wait for Berserk / Anger Shell activation + && IsBattlerAlive(battler) + && !TestIfSheerForceAffected(battler, gCurrentMove) + && HadMoreThanHalfHpNowDoesnt(battler)) + { + switch (GetBattlerAbility(battler)) + { + case ABILITY_BERSERK: + return CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN); + case ABILITY_ANGER_SHELL: + return TRUE; + default: + return FALSE; + } + } + + return FALSE; +} + u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) { u32 moveType = 0; @@ -7037,9 +7064,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_BERSERK_GENE: effect = ConsumeBerserkGene(battler, caseID); break; - case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(battler, caseID); - break; case HOLD_EFFECT_BOOSTER_ENERGY: effect = TryBoosterEnergy(battler, GetBattlerAbility(battler), caseID); break; @@ -7058,9 +7082,48 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) } } break; + case ITEMEFFECT_LEFTOVERS: + switch (battlerHoldEffect) + { + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) + { + goto LEFTOVERS; + } + else if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) + { + gBattleScripting.battler = battler; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + BattleScriptExecute(BattleScript_ItemHurtEnd2); + effect = ITEM_HP_CHANGE; + RecordItemEffectBattle(battler, battlerHoldEffect); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); + } + break; + case HOLD_EFFECT_LEFTOVERS: + LEFTOVERS: + if (gBattleMons[battler].hp < gBattleMons[battler].maxHP + && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) + { + gBattleScripting.battler = battler; + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; + BattleScriptExecute(BattleScript_ItemHealHP_End2); + effect = ITEM_HP_CHANGE; + RecordItemEffectBattle(battler, battlerHoldEffect); + } + break; + default: + break; + } + break; case ITEMEFFECT_NORMAL: case ITEMEFFECT_TRY_HEALING: - if (gBattleMons[battler].hp) + if (IsBattlerAlive(battler)) { switch (battlerHoldEffect) { @@ -7073,35 +7136,10 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_RESTORE_PP: effect = ItemRestorePp(battler, gLastUsedItem, caseID); break; - case HOLD_EFFECT_BLACK_SLUDGE: - if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) - { - goto LEFTOVERS; - } - else if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_ItemHurtEnd2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - } - break; - case HOLD_EFFECT_LEFTOVERS: - LEFTOVERS: - if (gBattleMons[battler].hp < gBattleMons[battler].maxHP - && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - BattleScriptExecute(BattleScript_ItemHealHP_End2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - } + case HOLD_EFFECT_WHITE_HERB: + effect = RestoreWhiteHerbStats(battler); + if (effect != 0) + BattleScriptExecute(BattleScript_WhiteHerbEnd2); break; case HOLD_EFFECT_CONFUSE_SPICY: effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); @@ -7220,9 +7258,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_BERSERK_GENE: effect = ConsumeBerserkGene(battler, caseID); break; - case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(battler, caseID); - break; default: break; } @@ -7255,14 +7290,12 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case ITEMEFFECT_MOVE_END: for (battler = 0; battler < gBattlersCount; battler++) { - // If item can be knocked off berry activation will be blocked, but not other items - if (gBattleStruct->battlerState[battler].itemCanBeKnockedOff - && (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES - || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP)) + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + if (ShouldWaitWithActivation(battler, holdEffect)) continue; gLastUsedItem = gBattleMons[battler].item; - effect = ItemEffectMoveEnd(battler, GetBattlerHoldEffect(battler, TRUE)); + effect = ItemEffectMoveEnd(battler, holdEffect); if (effect) { gPotentialItemEffectBattler = gBattleScripting.battler = battler; @@ -7594,6 +7627,17 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; } break; + case ITEMEFFECT_MIRROR_HERB: + case ITEMEFFECT_MIRROR_HERB_FIRST_TURN: + switch (battlerHoldEffect) + { + case HOLD_EFFECT_MIRROR_HERB: + effect = TryConsumeMirrorHerb(battler, caseID); + break; + default: + break; + } + break; } // Berry was successfully used on a Pokemon. diff --git a/test/battle/ability/anger_shell.c b/test/battle/ability/anger_shell.c index 875088c945..6c9064ee0d 100644 --- a/test/battle/ability/anger_shell.c +++ b/test/battle/ability/anger_shell.c @@ -93,3 +93,23 @@ SINGLE_BATTLE_TEST("Anger Shell activates after all hits from a multi-hit move") EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); } } + +SINGLE_BATTLE_TEST("Anger Shell does not activate if move is boosted by Sheer Force") +{ + u16 maxHp = 500; + GIVEN { + PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(maxHp / 2 + 1); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + NOT ABILITY_POPUP(player, ABILITY_ANGER_SHELL); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/ability/berserk.c b/test/battle/ability/berserk.c index 80e418e3c5..fe356bc671 100644 --- a/test/battle/ability/berserk.c +++ b/test/battle/ability/berserk.c @@ -73,3 +73,64 @@ SINGLE_BATTLE_TEST("Berserk activates after all hits from a multi-hit move") EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); } } + +SINGLE_BATTLE_TEST("Berserk does not activate if move is boosted by Sheer Force") +{ + u16 maxHp = 500; + GIVEN { + PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(maxHp / 2 + 1); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + NOT ABILITY_POPUP(player, ABILITY_BERSERK); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Berserk will not activate if the last multi hit move activates a restore berry") +{ + u32 j; + GIVEN { + ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); + PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); Item(ITEM_SITRUS_BERRY); MaxHP(100); HP(90); } + OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times. + } WHEN { + TURN { MOVE(opponent, MOVE_DOUBLE_SLAP); } + } SCENE { + for (j = 0; j < 4; j++) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SLAP, opponent); + NOT ABILITY_POPUP(player, ABILITY_BERSERK); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_SLAP, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + NOT ABILITY_POPUP(player, ABILITY_BERSERK); + + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Berserk activates before the hp can be restored on non multi hit moves") +{ + u16 maxHp = 500; + GIVEN { + ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); + PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); Item(ITEM_SITRUS_BERRY); MaxHP(maxHp); HP(maxHp / 2 + 1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + ABILITY_POPUP(player, ABILITY_BERSERK); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/ability/color_change.c b/test/battle/ability/color_change.c index e097035f62..4c07926502 100644 --- a/test/battle/ability/color_change.c +++ b/test/battle/ability/color_change.c @@ -153,3 +153,16 @@ SINGLE_BATTLE_TEST("Color Change changes the type to Normal when a Pokemon is hi MESSAGE("The opposing Kecleon's Color Change made it the Normal type!"); } } + +SINGLE_BATTLE_TEST("Color Change does not activate if move is boosted by Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + NOT ABILITY_POPUP(player, ABILITY_COLOR_CHANGE); + } +} diff --git a/test/battle/ability/opportunist.c b/test/battle/ability/opportunist.c index 3fac02b5b7..8695f2d00e 100644 --- a/test/battle/ability/opportunist.c +++ b/test/battle/ability/opportunist.c @@ -294,3 +294,24 @@ SINGLE_BATTLE_TEST("Opportunist and Mirror Herb stack stat increases") EXPECT_EQ(opponent->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE); } } + +DOUBLE_BATTLE_TEST("Opportunist and Mirror Herb resolve correctly") +{ + GIVEN { + PLAYER(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + PLAYER(SPECIES_ESPATHRA) { Ability(ABILITY_OPPORTUNIST); } + OPPONENT(SPECIES_MEOWSCARADA) { Item(ITEM_MIRROR_HERB); } + OPPONENT(SPECIES_ESPATHRA) { Ability(ABILITY_OPPORTUNIST); Item(ITEM_MIRROR_HERB); } + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_INTREPID_SWORD); + ABILITY_POPUP(opponentRight, ABILITY_OPPORTUNIST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} From b2c5a82003f451ab9cc13d74d48e2e76a7c7caaa Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 28 Sep 2025 00:25:57 +0200 Subject: [PATCH 059/183] Add func GetChosenMoveFromPosition (#7810) --- include/battle.h | 5 +++++ src/battle_ai_util.c | 2 +- src/battle_controller_player.c | 2 +- src/battle_main.c | 6 +++--- src/battle_script_commands.c | 2 +- src/battle_util.c | 8 ++++---- src/recorded_battle.c | 2 +- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/include/battle.h b/include/battle.h index fcbaa71c19..13f372b4e6 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1246,4 +1246,9 @@ static inline bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDe || (battlerDef == BATTLE_PARTNER(battlerAtk) && (moveTarget == MOVE_TARGET_BOTH)); } +static inline u32 GetChosenMoveFromPosition(u32 battler) +{ + return gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; +} + #endif // GUARD_BATTLE_H diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 9f4ef700f4..7cd7c6996f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3983,7 +3983,7 @@ u32 GetAllyChosenMove(u32 battlerId) else if (partnerBattler > battlerId) // Battler with the lower id chooses the move first. return gLastMoves[partnerBattler]; else - return gBattleMons[partnerBattler].moves[gBattleStruct->chosenMovePositions[partnerBattler]]; + return GetChosenMoveFromPosition(partnerBattler); } bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 partnerMove) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index d8d6b84ad9..b08a3ee574 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1990,7 +1990,7 @@ static void PlayerHandleChooseAction(u32 battler) if (B_SHOW_PARTNER_TARGET && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) { StringCopy(gStringVar1, COMPOUND_STRING("Partner will use:\n")); - u32 move = gBattleMons[B_POSITION_PLAYER_RIGHT].moves[gBattleStruct->chosenMovePositions[B_POSITION_PLAYER_RIGHT]]; + u32 move = GetChosenMoveFromPosition(B_POSITION_PLAYER_RIGHT); StringAppend(gStringVar1, GetMoveName(move)); u32 moveTarget = GetBattlerMoveTargetType(B_POSITION_PLAYER_RIGHT, move); if (moveTarget == MOVE_TARGET_SELECTED) diff --git a/src/battle_main.c b/src/battle_main.c index ff85b7ed25..44dc25ec8a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4500,7 +4500,7 @@ static void HandleTurnActionSelectionState(void) // Get the chosen move position (and thus the chosen move) and target from the returned buffer. gBattleStruct->chosenMovePositions[battler] = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; - gChosenMoveByBattler[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + gChosenMoveByBattler[battler] = GetChosenMoveFromPosition(battler); gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; if (IsBattleMoveStatus(gChosenMoveByBattler[battler]) && GetBattlerAbility(battler) == ABILITY_MYCELIUM_MIGHT) gProtectStructs[battler].myceliumMight = TRUE; @@ -4514,7 +4514,7 @@ static void HandleTurnActionSelectionState(void) // Max Move check if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { - gBattleStruct->dynamax.baseMoves[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + gBattleStruct->dynamax.baseMoves[battler] = GetChosenMoveFromPosition(battler); } gBattleCommunication[battler]++; @@ -4824,7 +4824,7 @@ s32 GetChosenMovePriority(u32 battler, u32 ability) if (gProtectStructs[battler].noValidMoves) move = MOVE_STRUGGLE; else - move = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + move = GetChosenMoveFromPosition(battler); return GetBattleMovePriority(battler, ability, move); } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b8274cb1cc..f5e849f4bc 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15084,7 +15084,7 @@ void BS_SetPledge(void) NATIVE_ARGS(const u8 *jumpInstr); u32 partner = BATTLE_PARTNER(gBattlerAttacker); - u32 partnerMove = gBattleMons[partner].moves[gBattleStruct->chosenMovePositions[partner]]; + u32 partnerMove = GetChosenMoveFromPosition(partner); u32 i = 0; u32 k = 0; diff --git a/src/battle_util.c b/src/battle_util.c index c2bed2ffc5..45b7bb8d83 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1905,7 +1905,7 @@ static inline bool32 TryFormChangeBeforeMove(void) static inline bool32 TryActivatePowderStatus(u32 move) { - u32 partnerMove = gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].moves[gBattleStruct->chosenMovePositions[BATTLE_PARTNER(gBattlerAttacker)]]; + u32 partnerMove = GetChosenMoveFromPosition(BATTLE_PARTNER(gBattlerAttacker)); if (!gBattleMons[gBattlerAttacker].volatiles.powder) return FALSE; if (GetBattleMoveType(move) == TYPE_FIRE && !gBattleStruct->pledgeMove) @@ -2641,7 +2641,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) break; case EFFECT_SUCKER_PUNCH: if (HasBattlerActedThisTurn(ctx->battlerDef) - || (IsBattleMoveStatus(gBattleMons[ctx->battlerDef].moves[gBattleStruct->chosenMovePositions[ctx->battlerDef]]) && !gProtectStructs[ctx->battlerDef].noValidMoves)) + || (IsBattleMoveStatus(GetChosenMoveFromPosition(ctx->battlerDef)) && !gProtectStructs[ctx->battlerDef].noValidMoves)) battleScript = BattleScript_ButItFailed; break; case EFFECT_SNORE: @@ -8565,7 +8565,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_MAX_MOVE: - basePower = GetMaxMovePower(gBattleMons[battlerAtk].moves[gBattleStruct->chosenMovePositions[battlerAtk]]); + basePower = GetMaxMovePower(GetChosenMoveFromPosition(battlerAtk)); break; case EFFECT_RAGE_FIST: basePower += 50 * GetBattlerPartyState(battlerAtk)->timesGotHit; @@ -12355,7 +12355,7 @@ static u32 GetCopyCatMove(void) static u32 GetMeFirstMove(void) { - u32 move = gBattleMons[gBattlerTarget].moves[gBattleStruct->chosenMovePositions[gBattlerTarget]]; + u32 move = GetChosenMoveFromPosition(gBattlerTarget); if (IsBattleMoveStatus(move) || IsMoveMeFirstBanned(move) diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 500a83e888..10db58a53c 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -779,7 +779,7 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonusSet); } - gChosenMoveByBattler[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; + gChosenMoveByBattler[battler] = GetChosenMoveFromPosition(battler); } } } From a818b97732314db42cf153eb646bde2d4b6cb5af Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:16:15 +0200 Subject: [PATCH 060/183] GetBattlerHoldEffect clean up (#7819) Co-authored-by: Bassoonian --- include/battle_util.h | 7 +- src/battle_ai_switch_items.c | 4 +- src/battle_ai_util.c | 2 +- src/battle_anim_effects_3.c | 2 +- src/battle_anim_new.c | 2 +- src/battle_controller_player.c | 4 +- src/battle_dynamax.c | 2 +- src/battle_end_turn.c | 14 +-- src/battle_main.c | 26 +++--- src/battle_script_commands.c | 106 +++++++++++------------ src/battle_terastal.c | 2 +- src/battle_util.c | 154 +++++++++++++++++---------------- src/battle_z_move.c | 6 +- 13 files changed, 169 insertions(+), 162 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index b06619e6ba..ef8f51809d 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -287,9 +287,10 @@ void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); u32 GetBattleMoveTarget(u16 move, u8 setTarget); u8 GetAttackerObedienceForAction(); -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating); -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility); +enum ItemHoldEffect GetBattlerHoldEffect(u32 battler); +enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler); +enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler); +enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability); u32 GetBattlerHoldEffectParam(u32 battler); bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 7d3c0ac4b0..34844fdbab 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -165,7 +165,7 @@ static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, u32 move) { // Choice locked into something else if (gAiLogicData->lastUsedMove[battler] != MOVE_NONE && gAiLogicData->lastUsedMove[battler] != move - && ((IsHoldEffectChoice(GetBattlerHoldEffect(battler, FALSE)) && IsBattlerItemEnabled(battler)) + && (IsHoldEffectChoice(GetBattlerHoldEffect(battler) && IsBattlerItemEnabled(battler)) || gBattleMons[battler].ability == ABILITY_GORILLA_TACTICS)) return TRUE; return FALSE; @@ -1025,7 +1025,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); u32 lastUsedMove = gAiLogicData->lastUsedMove[battler]; u32 opposingBattler = GetOppositeBattler(battler); bool32 moveAffectsTarget = TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 7cd7c6996f..ab0be71483 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1705,7 +1705,7 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) if (!IsAiBattlerAware(battlerId)) holdEffect = gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect; else - holdEffect = GetBattlerHoldEffect(battlerId, FALSE); + holdEffect = GetBattlerHoldEffectIgnoreNegation(battlerId); if (gAiThinkingStruct->aiFlags[battlerId] & AI_FLAG_NEGATE_UNAWARE) return holdEffect; diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 65de36237b..4d41156623 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -5785,7 +5785,7 @@ static void AnimRecycle_Step(struct Sprite *sprite) void AnimTask_GetWeather(u8 taskId) { - bool32 utilityUmbrellaAffected = GetBattlerHoldEffect(gBattleAnimAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA; + bool32 utilityUmbrellaAffected = GetBattlerHoldEffect(gBattleAnimAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA; gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_NONE; if (gWeatherMoveAnim & B_WEATHER_SUN && !utilityUmbrellaAffected) diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 3360b305c0..58e6a17dc8 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -9058,7 +9058,7 @@ void AnimTask_ShellSideArm(u8 taskId) void AnimTask_TerrainPulse(u8 taskId) { - if (IsBattlerTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker, TRUE), STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) gBattleAnimArgs[0] = TYPE_ELECTRIC; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index b08a3ee574..f98b3ca3d6 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2356,8 +2356,8 @@ static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef) ctx.updateFlags = FALSE; ctx.abilityAtk = GetBattlerAbility(battlerAtk); ctx.abilityDef = GetBattlerAbility(battlerDef); - ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); uq4_12_t modifier = CalcTypeEffectivenessMultiplier(&ctx); diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 33a7d5ee28..1ddc2b2b01 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -74,7 +74,7 @@ static const struct GMaxMove sGMaxMoveTable[] = bool32 CanDynamax(u32 battler) { u16 species = GetBattlerVisualSpecies(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Prevents Zigzagoon from dynamaxing in vanilla. if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && !IsOnPlayerSide(battler)) diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index e7485da64d..3f6f0db2ca 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -235,7 +235,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && !IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; @@ -260,7 +260,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE) && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; @@ -492,7 +492,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) && !IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock && !IsSemiInvulnerable(battler, CHECK_ALL) - && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) { gBattlerAttacker = battler; gBattleStruct->moveDamage[battler] = -(GetNonDynamaxMaxHP(battler) / 16); @@ -766,7 +766,7 @@ static bool32 HandleEndTurnWrap(u32 battler) gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); BattleScriptExecute(BattleScript_WrapTurnDmg); - if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler], TRUE) == HOLD_EFFECT_BINDING_BAND) + if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler]) == HOLD_EFFECT_BINDING_BAND) gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); @@ -1019,7 +1019,7 @@ static bool32 HandleEndTurnYawn(u32 battler) && !IsLeafGuardProtected(battler, ability)) { gEffectBattler = gBattlerTarget = battler; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; @@ -1427,7 +1427,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) } case THIRD_EVENT_BLOCK_ITEMS: { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); switch (holdEffect) { case HOLD_EFFECT_FLAME_ORB: @@ -1492,7 +1492,7 @@ static bool32 HandleEndTurnFourthEventBlock(u32 battler) } case FOURTH_EVENT_BLOCK_EJECT_PACK: { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (holdEffect == HOLD_EFFECT_EJECT_PACK) { if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) diff --git a/src/battle_main.c b/src/battle_main.c index 44dc25ec8a..9b2555ba21 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3420,7 +3420,7 @@ const u8* FaintClearSetData(u32 battler) u32 ability = GetBattlerAbility(otherSkyDropper); if (!(ability == ABILITY_OWN_TEMPO || gBattleMons[otherSkyDropper].volatiles.confusionTurns - || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper, TRUE), STATUS_FIELD_MISTY_TERRAIN))) + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) { gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattlerAttacker = otherSkyDropper; @@ -4504,7 +4504,7 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; if (IsBattleMoveStatus(gChosenMoveByBattler[battler]) && GetBattlerAbility(battler) == ABILITY_MYCELIUM_MIGHT) gProtectStructs[battler].myceliumMight = TRUE; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LAGGING_TAIL) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LAGGING_TAIL) gProtectStructs[battler].laggingTail = TRUE; // Check to see if any gimmicks need to be prepared. @@ -4812,7 +4812,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h u32 GetBattlerTotalSpeedStat(u32 battler) { u32 ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); } @@ -4857,7 +4857,7 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) gProtectStructs[battler].pranksterElevated = 1; priority++; } - else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { priority++; } @@ -4937,9 +4937,9 @@ s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenM s32 priority1 = 0, priority2 = 0; u32 ability1 = GetBattlerAbility(battler1); u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); + enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); u32 ability2 = GetBattlerAbility(battler2); if (!ignoreChosenMoves) @@ -5277,8 +5277,8 @@ static void TryChangeTurnOrder(void) static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) { u32 ability1 = GetBattlerAbility(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); + enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); u32 ability2 = GetBattlerAbility(battler2); // Battler 1 @@ -5323,14 +5323,14 @@ static void CheckChangingTurnOrderEffects(void) { gLastUsedItem = gBattleMons[battler].item; PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_CUSTAP_BERRY) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_CUSTAP_BERRY) { // don't record berry since its gone now BattleScriptExecute(BattleScript_CustapBerryActivation); } else { - RecordItemEffectBattle(battler, GetBattlerHoldEffect(battler, FALSE)); + RecordItemEffectBattle(battler, GetBattlerHoldEffect(battler)); BattleScriptExecute(BattleScript_QuickClawActivation); } } @@ -5858,7 +5858,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState { species = gBattleMons[battler].species; heldItem = gBattleMons[battler].item; - holdEffect = GetBattlerHoldEffect(battler, TRUE); + holdEffect = GetBattlerHoldEffect(battler); ability = GetBattlerAbility(battler); type1 = gBattleMons[battler].types[0]; type2 = gBattleMons[battler].types[1]; @@ -6000,7 +6000,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case EFFECT_TERRAIN_PULSE: if (state == MON_IN_BATTLE) { - if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) return TYPE_ELECTRIC; @@ -6083,7 +6083,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) { u32 moveType; u32 heldItem = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); gBattleStruct->dynamicMoveType = 0; gBattleStruct->battlerState[battler].ateBoost = FALSE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f5e849f4bc..8db823c8c3 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1073,7 +1073,7 @@ bool32 IsMovePowderBlocked(struct BattleContext *ctx) RecordAbilityBattle(ctx->battlerDef, ABILITY_OVERCOAT); effect = TRUE; } - else if (GetBattlerHoldEffect(ctx->battlerDef, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) + else if (GetBattlerHoldEffect(ctx->battlerDef) == HOLD_EFFECT_SAFETY_GOGGLES) { RecordItemEffectBattle(ctx->battlerDef, HOLD_EFFECT_SAFETY_GOGGLES); gLastUsedItem = gBattleMons[ctx->battlerDef].item; @@ -1281,7 +1281,7 @@ static void Cmd_attackcanceler(void) && ctx.moveEffect != EFFECT_COUNTER && ctx.moveEffect != EFFECT_UPPER_HAND) { - if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove)) + if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; @@ -1297,7 +1297,7 @@ static void Cmd_attackcanceler(void) gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; gBattlescriptCurrInstr = cmd->nextInstr; } - else if (gProtectStructs[gBattlerTarget].beakBlastCharge && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove)) + else if (gProtectStructs[gBattlerTarget].beakBlastCharge && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; @@ -1365,7 +1365,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u enum BattleMoveEffects effect = GetMoveEffect(move); u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); if (move == NO_ACC_CALC_CHECK_LOCK_ON) { @@ -1421,7 +1421,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u || CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, move, RUN_SCRIPT)) continue; - u32 holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + u32 holdEffectDef = GetBattlerHoldEffect(battlerDef); u32 accuracy = GetTotalAccuracy(gBattlerAttacker, battlerDef, move, @@ -1680,7 +1680,7 @@ static void Cmd_critcalc(void) abilityAtk = GetBattlerAbility(gBattlerAttacker), battlerDef; bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); gPotentialItemEffectBattler = gBattlerAttacker; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -1799,8 +1799,8 @@ static void Cmd_typecalc(void) ctx.updateFlags = TRUE; ctx.abilityAtk = GetBattlerAbility(gBattlerAttacker); ctx.abilityDef = GetBattlerAbility(gBattlerTarget); - ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget); CalcTypeEffectivenessMultiplier(&ctx); } @@ -1858,7 +1858,7 @@ static void Cmd_adjustdamage(void) if (gBattleMons[gBattlerTarget].hp > gBattleStruct->moveDamage[battlerDef]) continue; - holdEffect = GetBattlerHoldEffect(battlerDef, TRUE); + holdEffect = GetBattlerHoldEffect(battlerDef); param = GetBattlerHoldEffectParam(battlerDef); affectionScore = GetBattlerAffectionHearts(battlerDef); @@ -2820,7 +2820,7 @@ static inline bool32 TrySetReflect(u32 battler) if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) { gSideStatuses[side] |= SIDE_STATUS_REFLECT; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[side].reflectTimer = gBattleTurnCounter + 8; else gSideTimers[side].reflectTimer = gBattleTurnCounter + 5; @@ -2841,7 +2841,7 @@ static inline bool32 TrySetLightScreen(u32 battler) if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) { gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8; else gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5; @@ -3134,7 +3134,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai else { gBattleMons[gEffectBattler].volatiles.wrapped = TRUE; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; else gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? RandomUniform(RNG_WRAP, 4, 5) : RandomUniform(RNG_WRAP, 2, 5); @@ -3397,7 +3397,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; case MOVE_EFFECT_INCINERATE: if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) - || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler, FALSE) == HOLD_EFFECT_GEMS)) + || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_GEMS)) { gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; @@ -3410,7 +3410,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_BUG_BITE: - if (GetBattlerHoldEffect(gEffectBattler, TRUE) == HOLD_EFFECT_JABOCA_BERRY) + if (GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_JABOCA_BERRY) { // jaboca berry triggers instead of being stolen gBattlescriptCurrInstr++; @@ -3815,7 +3815,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai { gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_TERRAIN_EXTENDER) gFieldTimers.terrainTimer = gBattleTurnCounter + 8; else gFieldTimers.terrainTimer = gBattleTurnCounter + 5; @@ -3864,7 +3864,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) { gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; else gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; @@ -3894,7 +3894,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai if (!gBattleMons[battler].volatiles.wrapped) { gBattleMons[battler].volatiles.wrapped = TRUE; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; else gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; @@ -5507,7 +5507,7 @@ static inline bool32 IsProtectivePadsProtected(u32 battler, enum ItemHoldEffect static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { - if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_BUTTON + if (GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_BUTTON && battlerAtk != battlerDef && IsBattlerTurnDamaged(battlerDef) && IsBattlerAlive(battlerDef) @@ -5521,7 +5521,7 @@ static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { if (gDisableStructs[battlerDef].tryEjectPack - && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_PACK + && GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_PACK && IsBattlerAlive(battlerDef) && CountUsablePartyMons(battlerDef) > 0 && !gProtectStructs[battlerDef].disableEjectPack @@ -5750,7 +5750,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) } break; case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget, TRUE)) + if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget)) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) @@ -5914,7 +5914,7 @@ static void Cmd_moveend(void) { case PROTECT_SPIKY_SHIELD: if (moveEffect != EFFECT_COUNTER - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; @@ -5927,7 +5927,7 @@ static void Cmd_moveend(void) } break; case PROTECT_KINGS_SHIELD: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -5942,7 +5942,7 @@ static void Cmd_moveend(void) } break; case PROTECT_BANEFUL_BUNKER: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; @@ -5953,7 +5953,7 @@ static void Cmd_moveend(void) } break; case PROTECT_BURNING_BULWARK: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) { gEffectBattler = @@ -5967,7 +5967,7 @@ static void Cmd_moveend(void) case PROTECT_OBSTRUCT: if (moveEffect != EFFECT_SUCKER_PUNCH // Why??? && moveEffect != EFFECT_UPPER_HAND // Why??? - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -5979,7 +5979,7 @@ static void Cmd_moveend(void) } break; case PROTECT_SILK_TRAP: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -6489,7 +6489,7 @@ static void Cmd_moveend(void) { if (i == gBattlerAttacker) continue; - if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_RED_CARD) + if (GetBattlerHoldEffect(i) == HOLD_EFFECT_RED_CARD) redCardBattlers |= (1u << i); } if (redCardBattlers && IsBattlerAlive(gBattlerAttacker)) @@ -6736,7 +6736,7 @@ static void Cmd_moveend(void) if (IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerAttacker].item != ITEM_NONE // Attacker must be holding an item && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off - && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove) // Pickpocket requires contact + && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) // Pickpocket requires contact && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked { u8 battlers[4] = {0, 1, 2, 3}; @@ -7663,7 +7663,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) u32 ability = GetBattlerAbility(battler); if (ability != ABILITY_MAGIC_GUARD && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler, TRUE))) + && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler))) { u8 spikesDmg = (5 - gSideTimers[side].spikesAmount) * 2; gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); @@ -7674,7 +7674,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) break; } case HAZARDS_STICKY_WEB: - if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) { gBattleScripting.battler = battler; SET_STATCHANGER(STAT_SPEED, 1, TRUE); @@ -7682,7 +7682,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) } break; case HAZARDS_TOXIC_SPIKES: - if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) break; if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. @@ -8598,8 +8598,8 @@ static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd) { if (!gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen && gBattleStruct->changedItems[battler] == ITEM_NONE - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_BUTTON - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_PACK + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_BUTTON + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_PACK && (B_SYMBIOSIS_GEMS < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) && GetMoveEffect(gCurrentMove) != EFFECT_FLING //Fling and damage-reducing berries are handled separately. && !gSpecialStatuses[battler].berryReduced @@ -8638,7 +8638,7 @@ static void Cmd_removeitem(void) // Popped Air Balloon cannot be restored by any means. // Corroded items cannot be restored either. - if (GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_AIR_BALLOON + if (GetBattlerHoldEffect(battler) != HOLD_EFFECT_AIR_BALLOON && GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS) gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = itemId; // Remember if switched out @@ -9303,7 +9303,7 @@ static bool32 IsRototillerAffected(u32 battler) { if (!IsBattlerAlive(battler)) return FALSE; - if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) return FALSE; // Only grounded battlers affected if (!IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) return FALSE; // Only grass types affected @@ -9741,7 +9741,7 @@ static void Cmd_trysetrest(void) gBattlerTarget = gBattlerAttacker; gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); u32 ability = GetBattlerAbility(gBattlerTarget); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { @@ -10071,7 +10071,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan u32 index, battlerAbility; enum ItemHoldEffect battlerHoldEffect; battlerAbility = GetBattlerAbility(battler); - battlerHoldEffect = GetBattlerHoldEffect(battler, TRUE); + battlerHoldEffect = GetBattlerHoldEffect(battler); gSpecialStatuses[battler].changedStatsBattlerId = gBattlerAttacker; if (battlerAbility == ABILITY_CONTRARY) @@ -10290,7 +10290,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan { gProtectStructs[index].activateOpportunist = 2; // set stats to copy } - if (GetBattlerHoldEffect(index, TRUE) == HOLD_EFFECT_MIRROR_HERB) + if (GetBattlerHoldEffect(index) == HOLD_EFFECT_MIRROR_HERB) { gProtectStructs[index].eatMirrorHerb = 1; } @@ -10770,7 +10770,7 @@ static void Cmd_tryKO(void) CMD_ARGS(const u8 *failInstr); enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); u16 targetAbility = GetBattlerAbility(gBattlerTarget); u32 rand = Random() % 100; u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); @@ -12180,7 +12180,7 @@ static void Cmd_recoverbasedonsunlight(void) } else if (GetGenConfig(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) { - if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else if (gBattleWeather & B_WEATHER_SUN) gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; @@ -12212,7 +12212,7 @@ static void Cmd_recoverbasedonsunlight(void) break; } - if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 4; else if (gBattleWeather & B_WEATHER_SUN) gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 2; @@ -12669,7 +12669,7 @@ static void Cmd_tryswapitems(void) static bool32 CanAbilityShieldActivateForBattler(u32 battler) { - if (GetBattlerHoldEffectIgnoreAbility(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD) return FALSE; RecordItemEffectBattle(battler, HOLD_EFFECT_ABILITY_SHIELD); @@ -12757,7 +12757,7 @@ static void Cmd_setgastroacid(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + else if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); gBattlescriptCurrInstr = cmd->failInstr; @@ -12776,7 +12776,7 @@ static void Cmd_setyawn(void) { CMD_ARGS(const u8 *failInstr); u32 ability = GetBattlerAbility(gBattlerTarget); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (gBattleMons[gBattlerTarget].volatiles.yawn || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) @@ -14993,7 +14993,7 @@ void BS_SetTerrain(void) default: break; } - enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker); gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; @@ -15006,7 +15006,7 @@ void BS_JumpIfTerrainAffected(void) NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), cmd->flags)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), cmd->flags)) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -16306,7 +16306,7 @@ void BS_TryBoosterEnergy(void) for (u32 orderNum = 0; orderNum < gBattlersCount; orderNum++) { u32 battlerByTurnOrder = gBattlerByTurnOrder[orderNum]; - if (GetBattlerHoldEffect(battlerByTurnOrder, TRUE) != HOLD_EFFECT_BOOSTER_ENERGY) + if (GetBattlerHoldEffect(battlerByTurnOrder) != HOLD_EFFECT_BOOSTER_ENERGY) continue; u32 ability = GetBattlerAbility(battlerByTurnOrder); @@ -16417,7 +16417,7 @@ void BS_JumpIfHoldEffect(void) { NATIVE_ARGS(u8 battler, u8 holdEffect, const u8 *jumpInstr, u8 equal); u32 battler = GetBattlerForBattleScript(cmd->battler); - if ((GetBattlerHoldEffect(battler, TRUE) == cmd->holdEffect) == cmd->equal) + if ((GetBattlerHoldEffect(battler) == cmd->holdEffect) == cmd->equal) { if (cmd->equal) gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM @@ -16502,7 +16502,7 @@ void BS_TryFriskMessage(void) && gBattleMons[gBattlerTarget].item != ITEM_NONE) { gLastUsedItem = gBattleMons[gBattlerTarget].item; - RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE)); + RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffectIgnoreNegation(gBattlerTarget)); // If Frisk identifies two mons' items, show the pop-up only once. if (gBattleStruct->friskedAbility) { @@ -16956,7 +16956,7 @@ void BS_TryActivateReceiver(void) u32 partnerAbility = GetBattlerAbility(gBattlerAbility); if (IsBattlerAlive(gBattlerAbility) && (partnerAbility == ABILITY_RECEIVER || partnerAbility == ABILITY_POWER_OF_ALCHEMY) - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_ABILITY_SHIELD && !gAbilitiesInfo[gBattleMons[battler].ability].cantBeCopied) { gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[battler].ability; // re-using the variable for trace @@ -17412,7 +17412,7 @@ void BS_SetAuroraVeil(void) else { gSideStatuses[side] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; else gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; @@ -17499,7 +17499,7 @@ void BS_TryRoomService(void) { NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) { BattleScriptCall(BattleScript_ConsumableStatRaiseRet); } @@ -17513,7 +17513,7 @@ void BS_TryTerrainSeed(void) { NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SEEDS) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_SEEDS) { enum ItemEffect effect = ITEM_NO_EFFECT; u16 item = gBattleMons[battler].item; diff --git a/src/battle_terastal.c b/src/battle_terastal.c index c083ca0575..05b27a48ff 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -62,7 +62,7 @@ void ApplyBattlerVisualsForTeraAnim(u32 battler) // Returns whether a battler can Terastallize. bool32 CanTerastallize(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); if (gBattleMons[battler].volatiles.transformed && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) return FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 45b7bb8d83..f104d75bed 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -225,8 +225,8 @@ static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u3 ctx.updateFlags = recordAbilities; ctx.abilityAtk = abilityAtk; ctx.abilityDef = abilityDef; - ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); return CalcTypeEffectivenessMultiplier(&ctx); } @@ -319,7 +319,7 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) if (effect == EFFECT_PURSUIT && IsPursuitTargetSet()) return FALSE; - if (gSideTimers[defSide].followmePowder && !IsAffectedByPowder(battlerAtk, ability, GetBattlerHoldEffect(battlerAtk, TRUE))) + if (gSideTimers[defSide].followmePowder && !IsAffectedByPowder(battlerAtk, ability, GetBattlerHoldEffect(battlerAtk))) return FALSE; return TRUE; @@ -1074,7 +1074,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) u32 ability = GetBattlerAbility(otherSkyDropper); if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0 || IsAbilityAndRecord(otherSkyDropper, ability, ABILITY_OWN_TEMPO) - || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper, TRUE), STATUS_FIELD_MISTY_TERRAIN))) + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) { // Set confused status gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; @@ -1337,7 +1337,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 limitations = 0; u8 moveId = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; u32 move = gBattleMons[battler].moves[moveId]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -1599,7 +1599,7 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) { u32 move; enum BattleMoveEffects moveEffect; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; s32 i; @@ -1770,7 +1770,7 @@ bool32 BattleArenaTurnEnd(void) // Ingrain, Leech Seed, Strength Sap and Aqua Ring s32 GetDrainedBigRootHp(u32 battler, s32 hp) { - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_BIG_ROOT) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_BIG_ROOT) hp = (hp * 1300) / 1000; if (hp == 0) hp = 1; @@ -2326,7 +2326,7 @@ static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) { u16 *choicedMoveAtk = &gBattleStruct->choicedMove[ctx->battlerAtk]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk); if (gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) @@ -2811,7 +2811,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) } else if (GetMoveStrikeCount(ctx->currentMove) > 1) { - if (ctx->moveEffect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk, TRUE) == HOLD_EFFECT_LOADED_DICE) + if (ctx->moveEffect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk) == HOLD_EFFECT_LOADED_DICE) { gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); } @@ -3150,7 +3150,7 @@ bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbilit gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; if (gBattleWeather & B_WEATHER_PRIMAL_ANY) gWishFutureKnock.weatherDuration = 0; - else if (rock != 0 && GetBattlerHoldEffect(battler, TRUE) == rock) + else if (rock != 0 && GetBattlerHoldEffect(battler) == rock) gWishFutureKnock.weatherDuration = 8; else gWishFutureKnock.weatherDuration = 5; @@ -3168,7 +3168,7 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u16 *timer) gFieldStatuses |= statusFlag; gDisableStructs[battler].terrainAbilityDone = FALSE; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_TERRAIN_EXTENDER) *timer = gBattleTurnCounter + 8; else *timer = gBattleTurnCounter + 5; @@ -3377,7 +3377,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions && !IsBattlerAlly(battlerAtk, battlerDef) && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS && GetMoveTarget(move) != MOVE_TARGET_OPPONENTS_FIELD) @@ -3832,7 +3832,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gSpecialStatuses[battler].switchInAbilityDone) break; - if (GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD) break; side = (BATTLE_OPPOSITE(GetBattlerPosition(battler))) & BIT_SIDE; @@ -4864,13 +4864,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_MUMMY: if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && gDisableStructs[gBattlerAttacker].overwrittenAbility != GetBattlerAbility(gBattlerTarget) && gBattleMons[gBattlerAttacker].ability != ABILITY_MUMMY && gBattleMons[gBattlerAttacker].ability != ABILITY_LINGERING_AROMA && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSuppressed) { - if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; @@ -4887,16 +4887,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_WANDERING_SPIRIT: if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !(GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSwapped) { - if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; } - if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); break; @@ -4928,7 +4928,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { SET_STATCHANGER(STAT_SPEED, 1, TRUE); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); @@ -4942,7 +4942,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) @@ -4956,7 +4956,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { if ((battler = IsAbilityOnField(ABILITY_DAMP))) { @@ -4994,7 +4994,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); if ((!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) || B_POWDER_GRASS < GEN_6) && abilityAtk != ABILITY_OVERCOAT - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) + && GetBattlerHoldEffect(gBattlerAttacker) != HOLD_EFFECT_SAFETY_GOGGLES) { u32 poison, paralysis, sleep; @@ -5021,7 +5021,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBeSlept(gBattlerTarget, gBattlerAttacker, abilityAtk, NOT_BLOCKED_BY_SLEEP_CLAUSE) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { if (IsSleepClauseEnabled()) gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; @@ -5045,7 +5045,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, abilityAtk) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -5067,7 +5067,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, abilityAtk) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -5082,7 +5082,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_FLAME_BODY: if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) @@ -5104,7 +5104,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !(gBattleMons[gBattlerAttacker].volatiles.infatuation) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_OBLIVIOUS) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL)) { gBattleMons[gBattlerAttacker].volatiles.infatuation = INFATUATED_WITH(gBattlerTarget); @@ -5164,7 +5164,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !gBattleMons[gBattlerAttacker].volatiles.perishSong) { if (!gBattleMons[battler].volatiles.perishSong) @@ -5262,7 +5262,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, gLastUsedAbility, GetBattlerAbility(gBattlerTarget)) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target && RandomPercentage(RNG_POISON_TOUCH, 30)) { @@ -5634,7 +5634,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 bool32 TryPrimalReversion(u32 battler) { - if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_PRIMAL_ORB + if (GetBattlerHoldEffectIgnoreNegation(battler) == HOLD_EFFECT_PRIMAL_ORB && GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != gBattleMons[battler].species) { gBattleScripting.battler = battler; @@ -5704,7 +5704,7 @@ u32 GetBattlerAbility(u32 battler) u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield) { - bool32 hasAbilityShield = !noAbilityShield && GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD; + bool32 hasAbilityShield = !noAbilityShield && GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD; bool32 abilityCantBeSuppressed = gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed; if (abilityCantBeSuppressed) @@ -5781,7 +5781,7 @@ u32 IsAbilityPreventingEscape(u32 battler) if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return 0; - bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE)); + bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)); for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) @@ -5806,7 +5806,7 @@ bool32 CanBattlerEscape(u32 battler) // no ability check { if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) return FALSE; - else if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SHED_SHELL) + else if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_SHED_SHELL) return TRUE; else if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; @@ -6024,7 +6024,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { battleScript = BattleScript_SleepClauseBlocked; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_ELECTRIC_TERRAIN)) { battleScript = BattleScript_ElectricTerrainPrevents; } @@ -6072,7 +6072,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battleScript = BattleScript_AbilityProtectsDoesntAffect; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_MISTY_TERRAIN)) { battleScript = BattleScript_MistyTerrainPrevents; } @@ -6151,7 +6151,7 @@ bool32 CanBeConfused(u32 battler) { u32 ability = GetBattlerAbility(battler); if (gBattleMons[battler].volatiles.confusionTurns > 0 - || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_MISTY_TERRAIN) + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) || IsAbilityAndRecord(battler, ability, ABILITY_OWN_TEMPO)) return FALSE; return TRUE; @@ -6887,11 +6887,11 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) if (caseID != ITEMEFFECT_USE_LAST_ITEM) { gLastUsedItem = gBattleMons[battler].item; - battlerHoldEffect = GetBattlerHoldEffect(battler, TRUE); + battlerHoldEffect = GetBattlerHoldEffect(battler); } atkItem = gBattleMons[gBattlerAttacker].item; - atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker); atkHoldEffectParam = GetBattlerHoldEffectParam(gBattlerAttacker); switch (caseID) @@ -7310,7 +7310,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case ITEMEFFECT_MOVE_END: for (battler = 0; battler < gBattlersCount; battler++) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (ShouldWaitWithActivation(battler, holdEffect)) continue; @@ -7427,7 +7427,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; case HOLD_EFFECT_ROCKY_HELMET: if (IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) && IsBattlerAlive(gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { @@ -7551,7 +7551,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_STICKY_BARB: if (IsBattlerTurnDamaged(gBattlerTarget) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && IsBattlerAlive(gBattlerAttacker) && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) @@ -7884,27 +7884,24 @@ u8 GetAttackerObedienceForAction() } } -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating) +enum ItemHoldEffect GetBattlerHoldEffect(u32 battler) { - return GetBattlerHoldEffectInternal(battler, checkNegating, TRUE); + return GetBattlerHoldEffectInternal(battler, GetBattlerAbility(battler)); } -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating) +enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler) { - return GetBattlerHoldEffectInternal(battler, checkNegating, FALSE); + return GetBattlerHoldEffectInternal(battler, ABILITY_NONE); } -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility) +enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability) { - if (checkNegating) - { - if (gBattleMons[battler].volatiles.embargo) - return HOLD_EFFECT_NONE; - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) - return HOLD_EFFECT_NONE; - if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) - return HOLD_EFFECT_NONE; - } + if (gBattleMons[battler].volatiles.embargo) + return HOLD_EFFECT_NONE; + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) + return HOLD_EFFECT_NONE; + if (ability == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) + return HOLD_EFFECT_NONE; gPotentialItemEffectBattler = battler; @@ -7914,6 +7911,15 @@ enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegati return GetItemHoldEffect(gBattleMons[battler].item); } +enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler) +{ + gPotentialItemEffectBattler = battler; + if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) + return gEnigmaBerries[battler].holdEffect; + else + return GetItemHoldEffect(gBattleMons[battler].item); +} + static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item) { if (item == ITEM_ENIGMA_BERRY_E_READER) @@ -7978,7 +7984,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) if (IsZMove(move) || IsMaxMove(move)) return FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). if (GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST - && IsMoveMakingContact(battlerAtk, battlerDef, ABILITY_UNSEEN_FIST, GetBattlerHoldEffect(battlerAtk, TRUE), move)) + && IsMoveMakingContact(battlerAtk, battlerDef, ABILITY_UNSEEN_FIST, GetBattlerHoldEffect(battlerAtk), move)) return FALSE; } @@ -8104,7 +8110,7 @@ u32 GetBattlerWeight(u32 battler) u32 i; u32 weight = GetSpeciesWeight(gBattleMons[battler].species); u32 ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (ability == ABILITY_HEAVY_METAL) weight *= 2; @@ -8432,7 +8438,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) case EFFECT_ACROBATICS: if (gBattleMons[battlerAtk].item == ITEM_NONE // Edge case, because removal of items happens after damage calculation. - || (gSpecialStatuses[battlerAtk].gemBoost && GetBattlerHoldEffect(battlerAtk, FALSE) == HOLD_EFFECT_GEMS)) + || (gSpecialStatuses[battlerAtk].gemBoost && GetBattlerHoldEffect(battlerAtk) == HOLD_EFFECT_GEMS)) basePower *= 2; break; case EFFECT_LOW_KICK: @@ -9819,8 +9825,8 @@ static inline s32 DoMoveDamageCalc(struct DamageContext *ctx) ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); - ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); - ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); return DoMoveDamageCalcVars(ctx); } @@ -9908,8 +9914,8 @@ s32 CalculateMoveDamage(struct DamageContext *ctx) ctx->weather = GetWeather(); ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); - ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); - ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(ctx); @@ -9995,8 +10001,8 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, ctx.updateFlags = FALSE; ctx.abilityAtk = GetBattlerAbility(battlerAtk); ctx.abilityDef = ABILITY_ILLUSION; - ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); MulByTypeEffectiveness(&ctx, &presumedModifier, GetSpeciesType(illusionSpecies, 0)); if (GetSpeciesType(illusionSpecies, 1) != GetSpeciesType(illusionSpecies, 0)) @@ -10296,7 +10302,7 @@ bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) bool32 CanMegaEvolve(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has a Mega Ring. if (!TESTING @@ -10334,7 +10340,7 @@ bool32 CanMegaEvolve(u32 battler) bool32 CanUltraBurst(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has a Z-Ring if (!TESTING && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT @@ -11037,7 +11043,7 @@ void TrySaveExchangedItem(u32 battler, u16 stolenItem) bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) { bool32 ret = TRUE; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { ret = FALSE; @@ -11173,7 +11179,7 @@ bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) if (gBattleWeather & weatherFlags && HasWeatherEffect()) { // given weather is active -> check if its sun, rain against utility umbrella (since only 1 weather can be active at once) - if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler) == HOLD_EFFECT_UTILITY_UMBRELLA) return FALSE; // utility umbrella blocks sun, rain effects return TRUE; @@ -11189,7 +11195,7 @@ u32 GetBattlerMoveTargetType(u32 battler, u32 move) enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return MOVE_TARGET_USER; - if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_PSYCHIC_TERRAIN)) + if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_PSYCHIC_TERRAIN)) return MOVE_TARGET_BOTH; if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) return MOVE_TARGET_BOTH; @@ -11212,7 +11218,7 @@ bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) static void SetRandomMultiHitCounter() { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LOADED_DICE) gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); else if (GetGenConfig(GEN_CONFIG_MULTI_HIT_CHANCE) >= GEN_5) gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. @@ -11276,7 +11282,7 @@ static bool32 CanBeInfinitelyConfused(u32 battler) { u32 ability = GetBattlerAbility(battler); if (ability == ABILITY_OWN_TEMPO - || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_MISTY_TERRAIN) + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) return FALSE; return TRUE; @@ -11664,7 +11670,7 @@ bool32 IsMoveEffectBlockedByTarget(u32 ability) RecordAbilityBattle(gBattlerTarget, ability); return TRUE; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_COVERT_CLOAK) + else if (GetBattlerHoldEffect(gBattlerTarget) == HOLD_EFFECT_COVERT_CLOAK) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_COVERT_CLOAK); return TRUE; @@ -11756,7 +11762,7 @@ void UpdateStallMons(void) bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) { if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES - || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice + || GetBattlerHoldEffect(battler) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice { if (ItemBattleEffects(caseId, battler)) return TRUE; @@ -11773,7 +11779,7 @@ bool32 TrySwitchInEjectPack(enum ItemCaseId caseID) for (u32 i = 0; i < gBattlersCount; i++) { if (gDisableStructs[i].tryEjectPack - && GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_EJECT_PACK + && GetBattlerHoldEffect(i) == HOLD_EFFECT_EJECT_PACK && IsBattlerAlive(i) && CountUsablePartyMons(i) > 0) { diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 1c5a6118a8..78d4ddc60f 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -113,7 +113,7 @@ bool32 IsZMove(u32 move) bool32 CanUseZMove(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has Z-Power Ring. if (!TESTING && (battler == B_POSITION_PLAYER_LEFT @@ -144,7 +144,7 @@ bool32 CanUseZMove(u32 battler) u32 GetUsableZMove(u32 battler, u32 move) { u32 item = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) { @@ -167,7 +167,7 @@ void ActivateZMove(u32 battler) bool32 IsViableZMove(u32 battler, u32 move) { u32 item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); int moveSlotIndex; item = gBattleMons[battler].item; From f856f0cb662b8ed76e06de4ccf58d281a00da4fa Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Mon, 29 Sep 2025 18:09:30 +0200 Subject: [PATCH 061/183] Remove unused gBattleStruct fields (#7822) --- include/battle.h | 6 ++---- src/battle_script_commands.c | 3 --- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/include/battle.h b/include/battle.h index 13f372b4e6..378a54bd77 100644 --- a/include/battle.h +++ b/include/battle.h @@ -685,10 +685,10 @@ struct BattleStruct u8 terrainDone:1; u8 overworldWeatherDone:1; u8 battlerKOAnimsRunning:3; - u8 isAtkCancelerForCalledMove:1; // Certain cases in atk canceler should only be checked once, when the original move is called, however others need to be checked the twice. u8 friskedAbility:1; // If identifies two mons, show the ability pop-up only once. u8 fickleBeamBoosted:1; u8 poisonPuppeteerConfusion:1; + u8 toxicChainPriority:1; // If Toxic Chain will trigger on target, all other non volatiles will be blocked u16 startingStatusTimer; u8 atkCancellerTracker; struct BattleTvMovePoints tvMovePoints; @@ -702,7 +702,6 @@ struct BattleStruct u8 debugBattler; u8 magnitudeBasePower; u8 presentBasePower; - u8 roostTypes[MAX_BATTLERS_COUNT][NUM_BATTLE_SIDES]; u8 savedBattlerTarget[5]; u8 savedBattlerAttacker[5]; u8 savedTargetCount:4; @@ -780,8 +779,7 @@ struct BattleStruct u8 numHazards[NUM_BATTLE_SIDES]; u8 hazardsCounter:4; // Counter for applying hazard on switch in enum SubmoveState submoveAnnouncement:2; - u8 toxicChainPriority:1; // If Toxic Chain will trigger on target, all other non volatiles will be blocked - u8 padding2:1; + u8 padding2:2; }; struct AiBattleData diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8db823c8c3..7da08b3722 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5355,9 +5355,6 @@ static void Cmd_setroost(void) CMD_ARGS(); gDisableStructs[gBattlerAttacker].roostActive = TRUE; - gBattleStruct->roostTypes[gBattlerAttacker][0] = gBattleMons[gBattlerAttacker].types[0]; - gBattleStruct->roostTypes[gBattlerAttacker][1] = gBattleMons[gBattlerAttacker].types[1]; - gBattlescriptCurrInstr = cmd->nextInstr; } From e385c7f59f5b6adaad9a16f155ba0a6262ee174d Mon Sep 17 00:00:00 2001 From: khbsd Date: Mon, 29 Sep 2025 14:35:09 -0500 Subject: [PATCH 062/183] feat: change defines in `constants/abilities.h` to an enum (#7006) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle.h | 13 +- include/battle_ai_switch_items.h | 2 +- include/battle_ai_util.h | 62 +- include/battle_interface.h | 2 +- include/battle_main.h | 8 +- include/battle_message.h | 5 +- include/battle_script_commands.h | 14 +- include/battle_util.h | 66 +- include/constants/abilities.h | 661 +++++++++--------- include/data.h | 4 +- include/pokemon.h | 18 +- include/test/battle.h | 8 +- include/test_runner.h | 2 +- src/battle_ai_field_statuses.c | 10 +- src/battle_ai_main.c | 26 +- src/battle_ai_switch_items.c | 37 +- src/battle_ai_util.c | 124 ++-- src/battle_anim_effects_1.c | 2 +- src/battle_debug.c | 4 +- src/battle_dome.c | 5 +- src/battle_end_turn.c | 24 +- src/battle_interface.c | 6 +- src/battle_main.c | 27 +- src/battle_pike.c | 4 +- src/battle_script_commands.c | 87 +-- src/battle_tower.c | 3 +- src/battle_util.c | 189 +++-- src/data/abilities.h | 2 +- .../battle_pyramid_wild_requirements.h | 2 +- src/daycare.c | 6 +- src/debug.c | 6 +- src/egg_hatch.c | 2 +- src/event_object_movement.c | 2 +- src/field_player_avatar.c | 2 +- src/fldeff_cut.c | 2 +- src/pokedex_plus_hgss.c | 12 +- src/pokemon.c | 10 +- src/pokemon_summary_screen.c | 4 +- src/rom_header_rhh.c | 2 +- src/wild_encounter.c | 14 +- test/battle/ability/adaptability.c | 2 +- test/battle/ability/battle_armor.c | 2 +- test/battle/ability/clear_body.c | 37 +- test/battle/ability/cloud_nine.c | 3 +- test/battle/ability/contrary.c | 12 +- test/battle/ability/curious_medicine.c | 2 +- test/battle/ability/dazzling.c | 12 +- test/battle/ability/defiant.c | 4 +- test/battle/ability/download.c | 8 +- test/battle/ability/dragons_maw.c | 2 +- test/battle/ability/drizzle.c | 2 +- test/battle/ability/dry_skin.c | 2 +- test/battle/ability/embody_aspect.c | 3 +- test/battle/ability/filter.c | 2 +- test/battle/ability/flower_gift.c | 3 +- test/battle/ability/fluffy.c | 10 +- test/battle/ability/forecast.c | 16 +- test/battle/ability/galvanize.c | 8 +- test/battle/ability/grim_neigh.c | 9 +- test/battle/ability/guard_dog.c | 2 +- test/battle/ability/gulp_missile.c | 5 +- test/battle/ability/ice_scales.c | 2 +- test/battle/ability/intimidate.c | 4 +- test/battle/ability/keen_eye.c | 12 +- test/battle/ability/levitate.c | 2 +- test/battle/ability/liquid_ooze.c | 2 +- test/battle/ability/minds_eye.c | 2 +- test/battle/ability/moxie.c | 12 +- test/battle/ability/mummy.c | 8 +- test/battle/ability/neuroforce.c | 2 +- test/battle/ability/neutralizing_gas.c | 8 +- test/battle/ability/normalize.c | 19 +- test/battle/ability/opportunist.c | 4 +- test/battle/ability/parental_bond.c | 3 +- test/battle/ability/pixilate.c | 8 +- test/battle/ability/prankster.c | 2 +- test/battle/ability/prism_armor.c | 2 +- test/battle/ability/protosynthesis.c | 3 +- test/battle/ability/purifying_salt.c | 4 +- test/battle/ability/refrigerate.c | 8 +- test/battle/ability/rivalry.c | 12 +- test/battle/ability/rocky_payload.c | 2 +- test/battle/ability/sharpness.c | 2 +- test/battle/ability/sheer_force.c | 36 +- test/battle/ability/solid_rock.c | 2 +- test/battle/ability/stalwart.c | 3 +- test/battle/ability/stamina.c | 2 +- test/battle/ability/steelworker.c | 2 +- test/battle/ability/trace.c | 2 +- test/battle/ability/transistor.c | 4 +- test/battle/ability/unnerve.c | 10 +- test/battle/ability/water_compaction.c | 2 +- test/battle/ability/wind_power.c | 4 +- test/battle/ai/ai.c | 29 +- test/battle/ai/ai_check_viability.c | 19 +- test/battle/ai/ai_choice.c | 16 +- test/battle/ai/ai_doubles.c | 34 +- test/battle/ai/ai_switching.c | 5 +- test/battle/ai/check_bad_move.c | 3 +- test/battle/ai/gimmick_z_move.c | 2 +- test/battle/gimmick/dynamax.c | 3 +- test/battle/hold_effect/booster_energy.c | 4 +- test/battle/hold_effect/protective_pads.c | 2 +- test/battle/hold_effect/restore_stats.c | 4 +- test/battle/hold_effect/seeds.c | 17 +- test/battle/move_effect/ally_switch.c | 4 +- test/battle/move_effect/charge.c | 3 +- test/battle/move_effect/doodle.c | 3 +- test/battle/move_effect/dragon_darts.c | 4 +- test/battle/move_effect/fling.c | 2 +- test/battle/move_effect/gastro_acid.c | 3 +- test/battle/move_effect/heal_bell.c | 6 +- test/battle/move_effect/ion_deluge.c | 2 +- test/battle/move_effect/lash_out.c | 2 +- test/battle/move_effect/octolock.c | 2 +- test/battle/move_effect/recoil_if_miss.c | 2 +- test/battle/move_effect/role_play.c | 6 +- test/battle/move_effect/simple_beam.c | 5 +- test/battle/move_effect/skill_swap.c | 3 +- test/battle/move_effect/solar_beam.c | 2 +- test/battle/move_effect/speed_down.c | 2 +- test/battle/move_effect/speed_swap.c | 7 +- test/battle/move_effect/spicy_extract.c | 4 +- test/battle/move_effect/toxic.c | 3 +- test/battle/move_effect/worry_seed.c | 5 +- test/battle/move_effect_secondary/dire_claw.c | 3 +- test/battle/move_effect_secondary/order_up.c | 2 +- .../move_effect_secondary/remove_status.c | 4 +- .../battle/move_effect_secondary/syrup_bomb.c | 2 +- .../battle/move_effect_secondary/tri_attack.c | 3 +- .../move_effects_combined/triple_arrows.c | 4 +- .../move_flags/ignores_target_ability.c | 8 +- test/battle/sleep_clause.c | 10 +- test/battle/status1/burn.c | 3 +- test/battle/status1/paralysis.c | 3 +- test/battle/status1/sleep.c | 3 +- test/test_runner_battle.c | 7 +- test/text.c | 8 +- 138 files changed, 1130 insertions(+), 953 deletions(-) mode change 100755 => 100644 src/battle_script_commands.c diff --git a/include/battle.h b/include/battle.h index 378a54bd77..dcd680b584 100644 --- a/include/battle.h +++ b/include/battle.h @@ -2,6 +2,7 @@ #define GUARD_BATTLE_H // should they be included here or included individually by every file? +#include "constants/abilities.h" #include "constants/battle.h" #include "constants/form_change_types.h" #include "battle_main.h" @@ -264,7 +265,7 @@ struct WishFutureKnock struct AI_SavedBattleMon { - u16 ability; + enum Ability ability; u16 moves[MAX_MON_MOVES]; u16 heldItem; u16 species:15; @@ -277,7 +278,7 @@ struct AiPartyMon u16 species; u16 item; u16 heldEffect; - u16 ability; + enum Ability ability; u16 level; u16 moves[MAX_MON_MOVES]; u32 status; @@ -310,7 +311,7 @@ struct SimulatedDamage // Ai Data used when deciding which move to use, computed only once before each turn's start. struct AiLogicData { - u16 abilities[MAX_BATTLERS_COUNT]; + enum Ability abilities[MAX_BATTLERS_COUNT]; u16 items[MAX_BATTLERS_COUNT]; u16 holdEffects[MAX_BATTLERS_COUNT]; u8 holdEffectParams[MAX_BATTLERS_COUNT]; @@ -354,7 +355,7 @@ struct AiThinkingStruct struct BattleHistory { - u16 abilities[MAX_BATTLERS_COUNT]; + enum Ability abilities[MAX_BATTLERS_COUNT]; u8 itemEffects[MAX_BATTLERS_COUNT]; u16 usedMoves[MAX_BATTLERS_COUNT][MAX_MON_MOVES]; u16 moveHistory[MAX_BATTLERS_COUNT][AI_MOVE_HISTORY_COUNT]; // 3 last used moves for each battler @@ -714,7 +715,7 @@ struct BattleStruct enum BattleIntroStates introState:8; u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct - u16 tracedAbility[MAX_BATTLERS_COUNT]; + enum Ability tracedAbility[MAX_BATTLERS_COUNT]; u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk and Anger Shell. struct Illusion illusion[MAX_BATTLERS_COUNT]; u8 soulheartBattlerId; @@ -1048,7 +1049,7 @@ extern u16 gChosenMove; extern u16 gCalledMove; extern s32 gBideDmg[MAX_BATTLERS_COUNT]; extern u16 gLastUsedItem; -extern u16 gLastUsedAbility; +extern enum Ability gLastUsedAbility; extern u8 gBattlerAttacker; extern u8 gBattlerTarget; extern u8 gBattlerFainted; diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index b91d452097..8fcd7ba353 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -45,7 +45,7 @@ void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(u32 battler); u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType); bool32 ShouldSwitch(u32 battler); -bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2); +bool32 IsMonGrounded(u16 heldItemEffect, enum Ability ability, u8 type1, u8 type2); void ModifySwitchAfterMoveScoring(u32 battler); #endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 9f76b7268d..415c4fb938 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -92,7 +92,7 @@ void ClearBattlerMoveHistory(u32 battlerId); void RecordLastUsedMoveBy(u32 battlerId, u32 move); void RecordAllMoves(u32 battler); void RecordKnownMove(u32 battlerId, u32 move); -void RecordAbilityBattle(u32 battlerId, u32 abilityId); +void RecordAbilityBattle(u32 battlerId, enum Ability abilityId); void ClearBattlerAbilityHistory(u32 battlerId); void RecordItemEffectBattle(u32 battlerId, u32 itemEffect); void ClearBattlerItemEffectHistory(u32 battlerId); @@ -114,9 +114,9 @@ u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcCon u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext calcContext); bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits); bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod); -s32 AI_DecideKnownAbilityForTurn(u32 battlerId); +enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId); enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); -bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move); +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move); u32 AI_GetWeather(void); u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon); enum WeatherState IsWeatherActive(u32 flags); @@ -125,21 +125,21 @@ bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, enum D bool32 HasDamagingMove(u32 battler); bool32 HasDamagingMoveOfType(u32 battler, u32 type); u32 GetBattlerSecondaryDamage(u32 battlerId); -bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability); -bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability); -bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move); +bool32 BattlerWillFaintFromWeather(u32 battler, enum Ability ability); +bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability); +bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move); bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex); bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage); bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent); bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect); -enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex); +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex); bool32 IsRecycleEncouragedItem(u32 item); bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item); bool32 IsStatBoostingBerry(u32 item); bool32 CanKnockOffItem(u32 battler, u32 item); -bool32 IsAbilityOfRating(u32 ability, s8 rating); -bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); -bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move); +bool32 IsAbilityOfRating(enum Ability ability, s8 rating); +bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability); +bool32 AI_MoveMakesContact(enum Ability ability, enum ItemHoldEffect holdEffect, u32 move); bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); @@ -150,14 +150,14 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, u32 stat); -bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat); +bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, u32 stat); bool32 AreBattlersStatsMaxed(u32 battler); u32 CountPositiveStatStages(u32 battlerId); u32 CountNegativeStatStages(u32 battlerId); // move checks bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); -bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); +bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category); enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); @@ -192,7 +192,7 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect); bool32 IsNonVolatileStatusMove(u32 moveEffect); -bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility); +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility); bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); bool32 IsBattlerDamagedByStatus(u32 battler); @@ -223,32 +223,32 @@ bool32 IsHazardClearingMove(u32 move); bool32 IsSubstituteEffect(enum BattleMoveEffects effect); // status checks -bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability); -bool32 IsBattlerIncapacitated(u32 battler, u32 ability); -bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove); +bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability ability); +bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability); +bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef); -bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove); -bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove); -bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility); +bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); +bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); +bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbility); bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof); -u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move); +u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move); bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsWakeupTurn(u32 battler); bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId); // ability logic -bool32 IsMoxieTypeAbility(u32 ability); -bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability); -bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, u32 ability); +bool32 IsMoxieTypeAbility(enum Ability ability); +bool32 DoesAbilityRaiseStatsWhenLowered(enum Ability ability); +bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability); bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct AiLogicData *aiData); void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, struct AiLogicData *aiData); -s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData *aiData); +s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct AiLogicData *aiData); // partner logic bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef); @@ -305,7 +305,7 @@ bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); -bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); +bool32 HasBattlerSideAbility(u32 battlerDef, enum Ability ability, struct AiLogicData *aiData); bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); // These are for the purpose of not doubling up on moves during double battles. diff --git a/include/battle_interface.h b/include/battle_interface.h index 5bc1e10aa7..ea5559d165 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -126,7 +126,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem s32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 unused); u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); u8 GetHPBarLevel(s16 hp, s16 maxhp); -void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle); +void CreateAbilityPopUp(u8 battlerId, enum Ability ability, bool32 isDoubleBattle); void DestroyAbilityPopUp(u8 battlerId); bool32 CanThrowLastUsedBall(void); void TryHideLastUsedBall(void); diff --git a/include/battle_main.h b/include/battle_main.h index 70934124e0..5c8a71a26e 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -96,11 +96,11 @@ u8 IsRunningFromBattleImpossible(u32 battler); void SwitchTwoBattlersInParty(u32 battler, u32 battler2); void SwitchPartyOrder(u32 battler); void SwapTurnOrder(u8 id1, u8 id2); -u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); +u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect); u32 GetBattlerTotalSpeedStat(u32 battler); -s32 GetChosenMovePriority(u32 battler, u32 ability); -s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move); -s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2, +s32 GetChosenMovePriority(u32 battler, enum Ability ability); +s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move); +s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2, enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); diff --git a/include/battle_message.h b/include/battle_message.h index 1ce67ee17c..ade0a0826e 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -1,6 +1,7 @@ #ifndef GUARD_BATTLE_MESSAGE_H #define GUARD_BATTLE_MESSAGE_H +#include "constants/abilities.h" #include "constants/battle.h" #include "constants/battle_string_ids.h" @@ -238,13 +239,13 @@ struct BattleMsgData u16 currentMove; u16 originallyUsedMove; u16 lastItem; - u16 lastAbility; + enum Ability lastAbility; u8 scrActive; u8 bakScriptPartyIdx; u8 hpScale; u8 itemEffectBattler; u8 moveType; - u16 abilities[MAX_BATTLERS_COUNT]; + enum Ability abilities[MAX_BATTLERS_COUNT]; u8 textBuffs[3][TEXT_BUFF_ARRAY_COUNT]; }; diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 3b1dab00ee..17ccb58c59 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -40,10 +40,10 @@ union TRANSPARENT StatChangeFlags }; }; -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk); +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk); s32 GetCritHitOdds(s32 critChanceIndex); -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 HasBattlerActedThisTurn(u32 battler); u32 GetBattlerTurnOrderNum(u32 battler); bool32 NoAliveMonsForBattlerSide(u32 battler); @@ -60,15 +60,15 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move); bool32 DoesDisguiseBlockMove(u32 battler, u32 move); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); -u32 IsLeafGuardProtected(u32 battler, u32 ability); -bool32 IsShieldsDownProtected(u32 battler, u32 ability); -u32 IsAbilityStatusProtected(u32 battler, u32 ability); +u32 IsLeafGuardProtected(u32 battler, enum Ability ability); +bool32 IsShieldsDownProtected(u32 battler, enum Ability ability); +u32 IsAbilityStatusProtected(u32 battler, enum Ability ability); bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); void StealTargetItem(u8 battlerStealer, u8 battlerItem); u8 GetCatchingBattler(void); u32 GetHighestStatId(u32 battlerId); -bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType); +bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, u32 moveType); bool32 IsMoveNotAllowedInSkyBattles(u32 move); bool32 DoSwitchInAbilities(u32 battlerId); u8 GetFirstFaintedPartyIndex(u8 battlerId); diff --git a/include/battle_util.h b/include/battle_util.h index ef8f51809d..c3641ea042 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -181,8 +181,8 @@ struct DamageContext u32 fixedBasePower:8; u32 padding2:8; uq4_12_t typeEffectivenessModifier; - u32 abilityAtk:16; - u32 abilityDef:16; + enum Ability abilityAtk; + enum Ability abilityDef; enum ItemHoldEffect holdEffectAtk:16; enum ItemHoldEffect holdEffectDef:16; }; @@ -193,7 +193,7 @@ struct BattleContext u32 battlerDef:3; u32 currentMove:16; enum BattleMoveEffects moveEffect:10; - u16 ability[MAX_BATTLERS_COUNT]; + enum Ability ability[MAX_BATTLERS_COUNT]; }; enum SleepClauseBlock @@ -240,7 +240,7 @@ void MarkBattlerForControllerExec(u32 battler); void MarkBattlerReceivedLinkData(u32 battler); const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState); bool32 WasUnableToUseMove(u32 battler); -bool32 ShouldDefiantCompetitiveActivate(u32 battler, u32 ability); +bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability); void PrepareStringBattle(enum StringID stringId, u32 battler); void ResetSentPokesToOpponentValue(void); void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler); @@ -254,27 +254,27 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); bool32 AreAllMovesUnusable(u32 battler); u8 GetImprisonedMovesCount(u32 battler, u16 move); s32 GetDrainedBigRootHp(u32 battler, s32 hp); -bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck); +bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck); u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option); -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum FunctionCallOption option); -u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg); +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, u32 moveType, enum FunctionCallOption option); +enum Ability AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); -bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability); +bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability); u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler); u32 GetBattlerAbilityNoAbilityShield(u32 battler); u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield); -u32 GetBattlerAbility(u32 battler); -u32 IsAbilityOnSide(u32 battler, u32 ability); -u32 IsAbilityOnOpposingSide(u32 battler, u32 ability); -u32 IsAbilityOnField(u32 ability); -u32 IsAbilityOnFieldExcept(u32 battler, u32 ability); +enum Ability GetBattlerAbility(u32 battler); +u32 IsAbilityOnSide(u32 battler, enum Ability ability); +u32 IsAbilityOnOpposingSide(u32 battler, enum Ability ability); +u32 IsAbilityOnField(enum Ability ability); +u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability); u32 IsAbilityPreventingEscape(u32 battler); bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move); u32 GetProtectType(enum ProtectMethod method); @@ -292,9 +292,9 @@ enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler); enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler); enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability); u32 GetBattlerHoldEffectParam(u32 battler); -bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); -bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); -bool32 IsBattlerGrounded(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); +bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect); u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); @@ -304,7 +304,7 @@ s32 CalculateMoveDamageVars(struct DamageContext *ctx); s32 DoFixedDamageMoveCalc(struct DamageContext *ctx); s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg); uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx); -uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef); uq4_12_t GetTypeModifier(u32 atkType, u32 defType); uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType); void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags); @@ -371,15 +371,15 @@ bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef); bool32 MoodyCantRaiseStat(u32 stat); bool32 MoodyCantLowerStat(u32 stat); -bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause); -bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef); -bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 ability); -bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef); -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); +bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause); +bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef); +bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, enum Ability ability); +bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); bool32 CanBeConfused(u32 battler); -bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, u32 terrainFlag); +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); void TryToRevertMimicryAndFlags(void); bool32 BattleArenaTurnEnd(void); @@ -389,8 +389,8 @@ void RemoveConfusionStatus(u32 battler); u8 GetBattlerGender(u32 battler); bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2); bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2); -u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); -bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); +u32 CalcSecondaryEffectChance(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect); +bool32 MoveEffectIsGuaranteed(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect); void GetBattlerTypes(u32 battler, bool32 ignoreTera, u32 types[static 3]); u32 GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera); bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon); @@ -403,7 +403,7 @@ bool32 IsSleepClauseActiveForSide(u32 battlerSide); bool32 IsSleepClauseEnabled(); void ClearDamageCalcResults(void); u32 DoesDestinyBondFail(u32 battler); -bool32 IsMoveEffectBlockedByTarget(u32 ability); +bool32 IsMoveEffectBlockedByTarget(enum Ability ability); bool32 IsPursuitTargetSet(void); void ClearPursuitValuesIfSet(u32 battler); void ClearPursuitValues(void); @@ -416,7 +416,7 @@ bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); bool32 TrySwitchInEjectPack(enum ItemCaseId caseID); u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile); void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue); -u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID); +u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID); bool32 ItemHealMonVolatile(u32 battler, u16 itemId); void PushHazardTypeToQueue(u32 side, enum Hazards hazardType); bool32 IsHazardOnSide(u32 side, enum Hazards hazardType); @@ -424,13 +424,13 @@ bool32 AreAnyHazardsOnSide(u32 side); void RemoveAllHazardsFromField(u32 side); bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType); void RemoveHazardFromField(u32 side, enum Hazards hazardType); -bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option); -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander); bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); u32 GetNaturePowerMove(u32 battler); u32 GetNaturePowerMove(u32 battler); void RemoveAbilityFlags(u32 battler); -bool32 IsDazzlingAbility(u32 ability); +bool32 IsDazzlingAbility(enum Ability ability); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/abilities.h b/include/constants/abilities.h index 8568206137..7e17fd5287 100644 --- a/include/constants/abilities.h +++ b/include/constants/abilities.h @@ -1,344 +1,339 @@ #ifndef GUARD_CONSTANTS_ABILITIES_H #define GUARD_CONSTANTS_ABILITIES_H -#define ABILITY_NONE 0 -#define ABILITY_STENCH 1 -#define ABILITY_DRIZZLE 2 -#define ABILITY_SPEED_BOOST 3 -#define ABILITY_BATTLE_ARMOR 4 -#define ABILITY_STURDY 5 -#define ABILITY_DAMP 6 -#define ABILITY_LIMBER 7 -#define ABILITY_SAND_VEIL 8 -#define ABILITY_STATIC 9 -#define ABILITY_VOLT_ABSORB 10 -#define ABILITY_WATER_ABSORB 11 -#define ABILITY_OBLIVIOUS 12 -#define ABILITY_CLOUD_NINE 13 -#define ABILITY_COMPOUND_EYES 14 -#define ABILITY_INSOMNIA 15 -#define ABILITY_COLOR_CHANGE 16 -#define ABILITY_IMMUNITY 17 -#define ABILITY_FLASH_FIRE 18 -#define ABILITY_SHIELD_DUST 19 -#define ABILITY_OWN_TEMPO 20 -#define ABILITY_SUCTION_CUPS 21 -#define ABILITY_INTIMIDATE 22 -#define ABILITY_SHADOW_TAG 23 -#define ABILITY_ROUGH_SKIN 24 -#define ABILITY_WONDER_GUARD 25 -#define ABILITY_LEVITATE 26 -#define ABILITY_EFFECT_SPORE 27 -#define ABILITY_SYNCHRONIZE 28 -#define ABILITY_CLEAR_BODY 29 -#define ABILITY_NATURAL_CURE 30 -#define ABILITY_LIGHTNING_ROD 31 -#define ABILITY_SERENE_GRACE 32 -#define ABILITY_SWIFT_SWIM 33 -#define ABILITY_CHLOROPHYLL 34 -#define ABILITY_ILLUMINATE 35 -#define ABILITY_TRACE 36 -#define ABILITY_HUGE_POWER 37 -#define ABILITY_POISON_POINT 38 -#define ABILITY_INNER_FOCUS 39 -#define ABILITY_MAGMA_ARMOR 40 -#define ABILITY_WATER_VEIL 41 -#define ABILITY_MAGNET_PULL 42 -#define ABILITY_SOUNDPROOF 43 -#define ABILITY_RAIN_DISH 44 -#define ABILITY_SAND_STREAM 45 -#define ABILITY_PRESSURE 46 -#define ABILITY_THICK_FAT 47 -#define ABILITY_EARLY_BIRD 48 -#define ABILITY_FLAME_BODY 49 -#define ABILITY_RUN_AWAY 50 -#define ABILITY_KEEN_EYE 51 -#define ABILITY_HYPER_CUTTER 52 -#define ABILITY_PICKUP 53 -#define ABILITY_TRUANT 54 -#define ABILITY_HUSTLE 55 -#define ABILITY_CUTE_CHARM 56 -#define ABILITY_PLUS 57 -#define ABILITY_MINUS 58 -#define ABILITY_FORECAST 59 -#define ABILITY_STICKY_HOLD 60 -#define ABILITY_SHED_SKIN 61 -#define ABILITY_GUTS 62 -#define ABILITY_MARVEL_SCALE 63 -#define ABILITY_LIQUID_OOZE 64 -#define ABILITY_OVERGROW 65 -#define ABILITY_BLAZE 66 -#define ABILITY_TORRENT 67 -#define ABILITY_SWARM 68 -#define ABILITY_ROCK_HEAD 69 -#define ABILITY_DROUGHT 70 -#define ABILITY_ARENA_TRAP 71 -#define ABILITY_VITAL_SPIRIT 72 -#define ABILITY_WHITE_SMOKE 73 -#define ABILITY_PURE_POWER 74 -#define ABILITY_SHELL_ARMOR 75 -#define ABILITY_AIR_LOCK 76 +enum __attribute__((packed)) Ability +{ + ABILITY_NONE = 0, + ABILITY_STENCH = 1, + ABILITY_DRIZZLE = 2, + ABILITY_SPEED_BOOST = 3, + ABILITY_BATTLE_ARMOR = 4, + ABILITY_STURDY = 5, + ABILITY_DAMP = 6, + ABILITY_LIMBER = 7, + ABILITY_SAND_VEIL = 8, + ABILITY_STATIC = 9, + ABILITY_VOLT_ABSORB = 10, + ABILITY_WATER_ABSORB = 11, + ABILITY_OBLIVIOUS = 12, + ABILITY_CLOUD_NINE = 13, + ABILITY_COMPOUND_EYES = 14, + ABILITY_INSOMNIA = 15, + ABILITY_COLOR_CHANGE = 16, + ABILITY_IMMUNITY = 17, + ABILITY_FLASH_FIRE = 18, + ABILITY_SHIELD_DUST = 19, + ABILITY_OWN_TEMPO = 20, + ABILITY_SUCTION_CUPS = 21, + ABILITY_INTIMIDATE = 22, + ABILITY_SHADOW_TAG = 23, + ABILITY_ROUGH_SKIN = 24, + ABILITY_WONDER_GUARD = 25, + ABILITY_LEVITATE = 26, + ABILITY_EFFECT_SPORE = 27, + ABILITY_SYNCHRONIZE = 28, + ABILITY_CLEAR_BODY = 29, + ABILITY_NATURAL_CURE = 30, + ABILITY_LIGHTNING_ROD = 31, + ABILITY_SERENE_GRACE = 32, + ABILITY_SWIFT_SWIM = 33, + ABILITY_CHLOROPHYLL = 34, + ABILITY_ILLUMINATE = 35, + ABILITY_TRACE = 36, + ABILITY_HUGE_POWER = 37, + ABILITY_POISON_POINT = 38, + ABILITY_INNER_FOCUS = 39, + ABILITY_MAGMA_ARMOR = 40, + ABILITY_WATER_VEIL = 41, + ABILITY_MAGNET_PULL = 42, + ABILITY_SOUNDPROOF = 43, + ABILITY_RAIN_DISH = 44, + ABILITY_SAND_STREAM = 45, + ABILITY_PRESSURE = 46, + ABILITY_THICK_FAT = 47, + ABILITY_EARLY_BIRD = 48, + ABILITY_FLAME_BODY = 49, + ABILITY_RUN_AWAY = 50, + ABILITY_KEEN_EYE = 51, + ABILITY_HYPER_CUTTER = 52, + ABILITY_PICKUP = 53, + ABILITY_TRUANT = 54, + ABILITY_HUSTLE = 55, + ABILITY_CUTE_CHARM = 56, + ABILITY_PLUS = 57, + ABILITY_MINUS = 58, + ABILITY_FORECAST = 59, + ABILITY_STICKY_HOLD = 60, + ABILITY_SHED_SKIN = 61, + ABILITY_GUTS = 62, + ABILITY_MARVEL_SCALE = 63, + ABILITY_LIQUID_OOZE = 64, + ABILITY_OVERGROW = 65, + ABILITY_BLAZE = 66, + ABILITY_TORRENT = 67, + ABILITY_SWARM = 68, + ABILITY_ROCK_HEAD = 69, + ABILITY_DROUGHT = 70, + ABILITY_ARENA_TRAP = 71, + ABILITY_VITAL_SPIRIT = 72, + ABILITY_WHITE_SMOKE = 73, + ABILITY_PURE_POWER = 74, + ABILITY_SHELL_ARMOR = 75, + ABILITY_AIR_LOCK = 76, + ABILITIES_COUNT_GEN3, -#define ABILITIES_COUNT_GEN3 77 + // Gen 4 + ABILITY_TANGLED_FEET = ABILITIES_COUNT_GEN3, + ABILITY_MOTOR_DRIVE = 78, + ABILITY_RIVALRY = 79, + ABILITY_STEADFAST = 80, + ABILITY_SNOW_CLOAK = 81, + ABILITY_GLUTTONY = 82, + ABILITY_ANGER_POINT = 83, + ABILITY_UNBURDEN = 84, + ABILITY_HEATPROOF = 85, + ABILITY_SIMPLE = 86, + ABILITY_DRY_SKIN = 87, + ABILITY_DOWNLOAD = 88, + ABILITY_IRON_FIST = 89, + ABILITY_POISON_HEAL = 90, + ABILITY_ADAPTABILITY = 91, + ABILITY_SKILL_LINK = 92, + ABILITY_HYDRATION = 93, + ABILITY_SOLAR_POWER = 94, + ABILITY_QUICK_FEET = 95, + ABILITY_NORMALIZE = 96, + ABILITY_SNIPER = 97, + ABILITY_MAGIC_GUARD = 98, + ABILITY_NO_GUARD = 99, + ABILITY_STALL = 100, + ABILITY_TECHNICIAN = 101, + ABILITY_LEAF_GUARD = 102, + ABILITY_KLUTZ = 103, + ABILITY_MOLD_BREAKER = 104, + ABILITY_SUPER_LUCK = 105, + ABILITY_AFTERMATH = 106, + ABILITY_ANTICIPATION = 107, + ABILITY_FOREWARN = 108, + ABILITY_UNAWARE = 109, + ABILITY_TINTED_LENS = 110, + ABILITY_FILTER = 111, + ABILITY_SLOW_START = 112, + ABILITY_SCRAPPY = 113, + ABILITY_STORM_DRAIN = 114, + ABILITY_ICE_BODY = 115, + ABILITY_SOLID_ROCK = 116, + ABILITY_SNOW_WARNING = 117, + ABILITY_HONEY_GATHER = 118, + ABILITY_FRISK = 119, + ABILITY_RECKLESS = 120, + ABILITY_MULTITYPE = 121, + ABILITY_FLOWER_GIFT = 122, + ABILITY_BAD_DREAMS = 123, + ABILITIES_COUNT_GEN4, -// Gen 4 -#define ABILITY_TANGLED_FEET 77 -#define ABILITY_MOTOR_DRIVE 78 -#define ABILITY_RIVALRY 79 -#define ABILITY_STEADFAST 80 -#define ABILITY_SNOW_CLOAK 81 -#define ABILITY_GLUTTONY 82 -#define ABILITY_ANGER_POINT 83 -#define ABILITY_UNBURDEN 84 -#define ABILITY_HEATPROOF 85 -#define ABILITY_SIMPLE 86 -#define ABILITY_DRY_SKIN 87 -#define ABILITY_DOWNLOAD 88 -#define ABILITY_IRON_FIST 89 -#define ABILITY_POISON_HEAL 90 -#define ABILITY_ADAPTABILITY 91 -#define ABILITY_SKILL_LINK 92 -#define ABILITY_HYDRATION 93 -#define ABILITY_SOLAR_POWER 94 -#define ABILITY_QUICK_FEET 95 -#define ABILITY_NORMALIZE 96 -#define ABILITY_SNIPER 97 -#define ABILITY_MAGIC_GUARD 98 -#define ABILITY_NO_GUARD 99 -#define ABILITY_STALL 100 -#define ABILITY_TECHNICIAN 101 -#define ABILITY_LEAF_GUARD 102 -#define ABILITY_KLUTZ 103 -#define ABILITY_MOLD_BREAKER 104 -#define ABILITY_SUPER_LUCK 105 -#define ABILITY_AFTERMATH 106 -#define ABILITY_ANTICIPATION 107 -#define ABILITY_FOREWARN 108 -#define ABILITY_UNAWARE 109 -#define ABILITY_TINTED_LENS 110 -#define ABILITY_FILTER 111 -#define ABILITY_SLOW_START 112 -#define ABILITY_SCRAPPY 113 -#define ABILITY_STORM_DRAIN 114 -#define ABILITY_ICE_BODY 115 -#define ABILITY_SOLID_ROCK 116 -#define ABILITY_SNOW_WARNING 117 -#define ABILITY_HONEY_GATHER 118 -#define ABILITY_FRISK 119 -#define ABILITY_RECKLESS 120 -#define ABILITY_MULTITYPE 121 -#define ABILITY_FLOWER_GIFT 122 -#define ABILITY_BAD_DREAMS 123 + // Gen 5 + ABILITY_PICKPOCKET = ABILITIES_COUNT_GEN4, + ABILITY_SHEER_FORCE = 125, + ABILITY_CONTRARY = 126, + ABILITY_UNNERVE = 127, + ABILITY_DEFIANT = 128, + ABILITY_DEFEATIST = 129, + ABILITY_CURSED_BODY = 130, + ABILITY_HEALER = 131, + ABILITY_FRIEND_GUARD = 132, + ABILITY_WEAK_ARMOR = 133, + ABILITY_HEAVY_METAL = 134, + ABILITY_LIGHT_METAL = 135, + ABILITY_MULTISCALE = 136, + ABILITY_TOXIC_BOOST = 137, + ABILITY_FLARE_BOOST = 138, + ABILITY_HARVEST = 139, + ABILITY_TELEPATHY = 140, + ABILITY_MOODY = 141, + ABILITY_OVERCOAT = 142, + ABILITY_POISON_TOUCH = 143, + ABILITY_REGENERATOR = 144, + ABILITY_BIG_PECKS = 145, + ABILITY_SAND_RUSH = 146, + ABILITY_WONDER_SKIN = 147, + ABILITY_ANALYTIC = 148, + ABILITY_ILLUSION = 149, + ABILITY_IMPOSTER = 150, + ABILITY_INFILTRATOR = 151, + ABILITY_MUMMY = 152, + ABILITY_MOXIE = 153, + ABILITY_JUSTIFIED = 154, + ABILITY_RATTLED = 155, + ABILITY_MAGIC_BOUNCE = 156, + ABILITY_SAP_SIPPER = 157, + ABILITY_PRANKSTER = 158, + ABILITY_SAND_FORCE = 159, + ABILITY_IRON_BARBS = 160, + ABILITY_ZEN_MODE = 161, + ABILITY_VICTORY_STAR = 162, + ABILITY_TURBOBLAZE = 163, + ABILITY_TERAVOLT = 164, + ABILITIES_COUNT_GEN5, -#define ABILITIES_COUNT_GEN4 124 + // Gen 6 + ABILITY_AROMA_VEIL = ABILITIES_COUNT_GEN5, + ABILITY_FLOWER_VEIL = 166, + ABILITY_CHEEK_POUCH = 167, + ABILITY_PROTEAN = 168, + ABILITY_FUR_COAT = 169, + ABILITY_MAGICIAN = 170, + ABILITY_BULLETPROOF = 171, + ABILITY_COMPETITIVE = 172, + ABILITY_STRONG_JAW = 173, + ABILITY_REFRIGERATE = 174, + ABILITY_SWEET_VEIL = 175, + ABILITY_STANCE_CHANGE = 176, + ABILITY_GALE_WINGS = 177, + ABILITY_MEGA_LAUNCHER = 178, + ABILITY_GRASS_PELT = 179, + ABILITY_SYMBIOSIS = 180, + ABILITY_TOUGH_CLAWS = 181, + ABILITY_PIXILATE = 182, + ABILITY_GOOEY = 183, + ABILITY_AERILATE = 184, + ABILITY_PARENTAL_BOND = 185, + ABILITY_DARK_AURA = 186, + ABILITY_FAIRY_AURA = 187, + ABILITY_AURA_BREAK = 188, + ABILITY_PRIMORDIAL_SEA = 189, + ABILITY_DESOLATE_LAND = 190, + ABILITY_DELTA_STREAM = 191, + ABILITIES_COUNT_GEN6, -// Gen 5 -#define ABILITY_PICKPOCKET 124 -#define ABILITY_SHEER_FORCE 125 -#define ABILITY_CONTRARY 126 -#define ABILITY_UNNERVE 127 -#define ABILITY_DEFIANT 128 -#define ABILITY_DEFEATIST 129 -#define ABILITY_CURSED_BODY 130 -#define ABILITY_HEALER 131 -#define ABILITY_FRIEND_GUARD 132 -#define ABILITY_WEAK_ARMOR 133 -#define ABILITY_HEAVY_METAL 134 -#define ABILITY_LIGHT_METAL 135 -#define ABILITY_MULTISCALE 136 -#define ABILITY_TOXIC_BOOST 137 -#define ABILITY_FLARE_BOOST 138 -#define ABILITY_HARVEST 139 -#define ABILITY_TELEPATHY 140 -#define ABILITY_MOODY 141 -#define ABILITY_OVERCOAT 142 -#define ABILITY_POISON_TOUCH 143 -#define ABILITY_REGENERATOR 144 -#define ABILITY_BIG_PECKS 145 -#define ABILITY_SAND_RUSH 146 -#define ABILITY_WONDER_SKIN 147 -#define ABILITY_ANALYTIC 148 -#define ABILITY_ILLUSION 149 -#define ABILITY_IMPOSTER 150 -#define ABILITY_INFILTRATOR 151 -#define ABILITY_MUMMY 152 -#define ABILITY_MOXIE 153 -#define ABILITY_JUSTIFIED 154 -#define ABILITY_RATTLED 155 -#define ABILITY_MAGIC_BOUNCE 156 -#define ABILITY_SAP_SIPPER 157 -#define ABILITY_PRANKSTER 158 -#define ABILITY_SAND_FORCE 159 -#define ABILITY_IRON_BARBS 160 -#define ABILITY_ZEN_MODE 161 -#define ABILITY_VICTORY_STAR 162 -#define ABILITY_TURBOBLAZE 163 -#define ABILITY_TERAVOLT 164 + // Gen 7 + ABILITY_STAMINA = ABILITIES_COUNT_GEN6, + ABILITY_WIMP_OUT = 193, + ABILITY_EMERGENCY_EXIT = 194, + ABILITY_WATER_COMPACTION = 195, + ABILITY_MERCILESS = 196, + ABILITY_SHIELDS_DOWN = 197, + ABILITY_STAKEOUT = 198, + ABILITY_WATER_BUBBLE = 199, + ABILITY_STEELWORKER = 200, + ABILITY_BERSERK = 201, + ABILITY_SLUSH_RUSH = 202, + ABILITY_LONG_REACH = 203, + ABILITY_LIQUID_VOICE = 204, + ABILITY_TRIAGE = 205, + ABILITY_GALVANIZE = 206, + ABILITY_SURGE_SURFER = 207, + ABILITY_SCHOOLING = 208, + ABILITY_DISGUISE = 209, + ABILITY_BATTLE_BOND = 210, + ABILITY_POWER_CONSTRUCT = 211, + ABILITY_CORROSION = 212, + ABILITY_COMATOSE = 213, + ABILITY_QUEENLY_MAJESTY = 214, + ABILITY_INNARDS_OUT = 215, + ABILITY_DANCER = 216, + ABILITY_BATTERY = 217, + ABILITY_FLUFFY = 218, + ABILITY_DAZZLING = 219, + ABILITY_SOUL_HEART = 220, + ABILITY_TANGLING_HAIR = 221, + ABILITY_RECEIVER = 222, + ABILITY_POWER_OF_ALCHEMY = 223, + ABILITY_BEAST_BOOST = 224, + ABILITY_RKS_SYSTEM = 225, + ABILITY_ELECTRIC_SURGE = 226, + ABILITY_PSYCHIC_SURGE = 227, + ABILITY_MISTY_SURGE = 228, + ABILITY_GRASSY_SURGE = 229, + ABILITY_FULL_METAL_BODY = 230, + ABILITY_SHADOW_SHIELD = 231, + ABILITY_PRISM_ARMOR = 232, + ABILITY_NEUROFORCE = 233, + ABILITIES_COUNT_GEN7, -#define ABILITIES_COUNT_GEN5 165 + // Gen 8 + ABILITY_INTREPID_SWORD = ABILITIES_COUNT_GEN7, + ABILITY_DAUNTLESS_SHIELD = 235, + ABILITY_LIBERO = 236, + ABILITY_BALL_FETCH = 237, + ABILITY_COTTON_DOWN = 238, + ABILITY_PROPELLER_TAIL = 239, + ABILITY_MIRROR_ARMOR = 240, + ABILITY_GULP_MISSILE = 241, + ABILITY_STALWART = 242, + ABILITY_STEAM_ENGINE = 243, + ABILITY_PUNK_ROCK = 244, + ABILITY_SAND_SPIT = 245, + ABILITY_ICE_SCALES = 246, + ABILITY_RIPEN = 247, + ABILITY_ICE_FACE = 248, + ABILITY_POWER_SPOT = 249, + ABILITY_MIMICRY = 250, + ABILITY_SCREEN_CLEANER = 251, + ABILITY_STEELY_SPIRIT = 252, + ABILITY_PERISH_BODY = 253, + ABILITY_WANDERING_SPIRIT = 254, + ABILITY_GORILLA_TACTICS = 255, + ABILITY_NEUTRALIZING_GAS = 256, + ABILITY_PASTEL_VEIL = 257, + ABILITY_HUNGER_SWITCH = 258, + ABILITY_QUICK_DRAW = 259, + ABILITY_UNSEEN_FIST = 260, + ABILITY_CURIOUS_MEDICINE = 261, + ABILITY_TRANSISTOR = 262, + ABILITY_DRAGONS_MAW = 263, + ABILITY_CHILLING_NEIGH = 264, + ABILITY_GRIM_NEIGH = 265, + ABILITY_AS_ONE_ICE_RIDER = 266, + ABILITY_AS_ONE_SHADOW_RIDER = 267, + ABILITIES_COUNT_GEN8, -// Gen 6 -#define ABILITY_AROMA_VEIL 165 -#define ABILITY_FLOWER_VEIL 166 -#define ABILITY_CHEEK_POUCH 167 -#define ABILITY_PROTEAN 168 -#define ABILITY_FUR_COAT 169 -#define ABILITY_MAGICIAN 170 -#define ABILITY_BULLETPROOF 171 -#define ABILITY_COMPETITIVE 172 -#define ABILITY_STRONG_JAW 173 -#define ABILITY_REFRIGERATE 174 -#define ABILITY_SWEET_VEIL 175 -#define ABILITY_STANCE_CHANGE 176 -#define ABILITY_GALE_WINGS 177 -#define ABILITY_MEGA_LAUNCHER 178 -#define ABILITY_GRASS_PELT 179 -#define ABILITY_SYMBIOSIS 180 -#define ABILITY_TOUGH_CLAWS 181 -#define ABILITY_PIXILATE 182 -#define ABILITY_GOOEY 183 -#define ABILITY_AERILATE 184 -#define ABILITY_PARENTAL_BOND 185 -#define ABILITY_DARK_AURA 186 -#define ABILITY_FAIRY_AURA 187 -#define ABILITY_AURA_BREAK 188 -#define ABILITY_PRIMORDIAL_SEA 189 -#define ABILITY_DESOLATE_LAND 190 -#define ABILITY_DELTA_STREAM 191 - -#define ABILITIES_COUNT_GEN6 192 - -// Gen 7 -#define ABILITY_STAMINA 192 -#define ABILITY_WIMP_OUT 193 -#define ABILITY_EMERGENCY_EXIT 194 -#define ABILITY_WATER_COMPACTION 195 -#define ABILITY_MERCILESS 196 -#define ABILITY_SHIELDS_DOWN 197 -#define ABILITY_STAKEOUT 198 -#define ABILITY_WATER_BUBBLE 199 -#define ABILITY_STEELWORKER 200 -#define ABILITY_BERSERK 201 -#define ABILITY_SLUSH_RUSH 202 -#define ABILITY_LONG_REACH 203 -#define ABILITY_LIQUID_VOICE 204 -#define ABILITY_TRIAGE 205 -#define ABILITY_GALVANIZE 206 -#define ABILITY_SURGE_SURFER 207 -#define ABILITY_SCHOOLING 208 -#define ABILITY_DISGUISE 209 -#define ABILITY_BATTLE_BOND 210 -#define ABILITY_POWER_CONSTRUCT 211 -#define ABILITY_CORROSION 212 -#define ABILITY_COMATOSE 213 -#define ABILITY_QUEENLY_MAJESTY 214 -#define ABILITY_INNARDS_OUT 215 -#define ABILITY_DANCER 216 -#define ABILITY_BATTERY 217 -#define ABILITY_FLUFFY 218 -#define ABILITY_DAZZLING 219 -#define ABILITY_SOUL_HEART 220 -#define ABILITY_TANGLING_HAIR 221 -#define ABILITY_RECEIVER 222 -#define ABILITY_POWER_OF_ALCHEMY 223 -#define ABILITY_BEAST_BOOST 224 -#define ABILITY_RKS_SYSTEM 225 -#define ABILITY_ELECTRIC_SURGE 226 -#define ABILITY_PSYCHIC_SURGE 227 -#define ABILITY_MISTY_SURGE 228 -#define ABILITY_GRASSY_SURGE 229 -#define ABILITY_FULL_METAL_BODY 230 -#define ABILITY_SHADOW_SHIELD 231 -#define ABILITY_PRISM_ARMOR 232 -#define ABILITY_NEUROFORCE 233 - -#define ABILITIES_COUNT_GEN7 234 - -// Gen 8 -#define ABILITY_INTREPID_SWORD 234 -#define ABILITY_DAUNTLESS_SHIELD 235 -#define ABILITY_LIBERO 236 -#define ABILITY_BALL_FETCH 237 -#define ABILITY_COTTON_DOWN 238 -#define ABILITY_PROPELLER_TAIL 239 -#define ABILITY_MIRROR_ARMOR 240 -#define ABILITY_GULP_MISSILE 241 -#define ABILITY_STALWART 242 -#define ABILITY_STEAM_ENGINE 243 -#define ABILITY_PUNK_ROCK 244 -#define ABILITY_SAND_SPIT 245 -#define ABILITY_ICE_SCALES 246 -#define ABILITY_RIPEN 247 -#define ABILITY_ICE_FACE 248 -#define ABILITY_POWER_SPOT 249 -#define ABILITY_MIMICRY 250 -#define ABILITY_SCREEN_CLEANER 251 -#define ABILITY_STEELY_SPIRIT 252 -#define ABILITY_PERISH_BODY 253 -#define ABILITY_WANDERING_SPIRIT 254 -#define ABILITY_GORILLA_TACTICS 255 -#define ABILITY_NEUTRALIZING_GAS 256 -#define ABILITY_PASTEL_VEIL 257 -#define ABILITY_HUNGER_SWITCH 258 -#define ABILITY_QUICK_DRAW 259 -#define ABILITY_UNSEEN_FIST 260 -#define ABILITY_CURIOUS_MEDICINE 261 -#define ABILITY_TRANSISTOR 262 -#define ABILITY_DRAGONS_MAW 263 -#define ABILITY_CHILLING_NEIGH 264 -#define ABILITY_GRIM_NEIGH 265 -#define ABILITY_AS_ONE_ICE_RIDER 266 -#define ABILITY_AS_ONE_SHADOW_RIDER 267 - -#define ABILITIES_COUNT_GEN8 268 - -// Gen 9 -#define ABILITY_LINGERING_AROMA 268 -#define ABILITY_SEED_SOWER 269 -#define ABILITY_THERMAL_EXCHANGE 270 -#define ABILITY_ANGER_SHELL 271 -#define ABILITY_PURIFYING_SALT 272 -#define ABILITY_WELL_BAKED_BODY 273 -#define ABILITY_WIND_RIDER 274 -#define ABILITY_GUARD_DOG 275 -#define ABILITY_ROCKY_PAYLOAD 276 -#define ABILITY_WIND_POWER 277 -#define ABILITY_ZERO_TO_HERO 278 -#define ABILITY_COMMANDER 279 -#define ABILITY_ELECTROMORPHOSIS 280 -#define ABILITY_PROTOSYNTHESIS 281 -#define ABILITY_QUARK_DRIVE 282 -#define ABILITY_GOOD_AS_GOLD 283 -#define ABILITY_VESSEL_OF_RUIN 284 -#define ABILITY_SWORD_OF_RUIN 285 -#define ABILITY_TABLETS_OF_RUIN 286 -#define ABILITY_BEADS_OF_RUIN 287 -#define ABILITY_ORICHALCUM_PULSE 288 -#define ABILITY_HADRON_ENGINE 289 -#define ABILITY_OPPORTUNIST 290 -#define ABILITY_CUD_CHEW 291 -#define ABILITY_SHARPNESS 292 -#define ABILITY_SUPREME_OVERLORD 293 -#define ABILITY_COSTAR 294 -#define ABILITY_TOXIC_DEBRIS 295 -#define ABILITY_ARMOR_TAIL 296 -#define ABILITY_EARTH_EATER 297 -#define ABILITY_MYCELIUM_MIGHT 298 -#define ABILITY_HOSPITALITY 299 -#define ABILITY_MINDS_EYE 300 -#define ABILITY_EMBODY_ASPECT_TEAL_MASK 301 -#define ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK 302 -#define ABILITY_EMBODY_ASPECT_WELLSPRING_MASK 303 -#define ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK 304 -#define ABILITY_TOXIC_CHAIN 305 -#define ABILITY_SUPERSWEET_SYRUP 306 -#define ABILITY_TERA_SHIFT 307 -#define ABILITY_TERA_SHELL 308 -#define ABILITY_TERAFORM_ZERO 309 -#define ABILITY_POISON_PUPPETEER 310 - -#define ABILITIES_COUNT_GEN9 311 - -#define ABILITIES_COUNT ABILITIES_COUNT_GEN9 + // Gen 9 + ABILITY_LINGERING_AROMA = ABILITIES_COUNT_GEN8, + ABILITY_SEED_SOWER = 269, + ABILITY_THERMAL_EXCHANGE = 270, + ABILITY_ANGER_SHELL = 271, + ABILITY_PURIFYING_SALT = 272, + ABILITY_WELL_BAKED_BODY = 273, + ABILITY_WIND_RIDER = 274, + ABILITY_GUARD_DOG = 275, + ABILITY_ROCKY_PAYLOAD = 276, + ABILITY_WIND_POWER = 277, + ABILITY_ZERO_TO_HERO = 278, + ABILITY_COMMANDER = 279, + ABILITY_ELECTROMORPHOSIS = 280, + ABILITY_PROTOSYNTHESIS = 281, + ABILITY_QUARK_DRIVE = 282, + ABILITY_GOOD_AS_GOLD = 283, + ABILITY_VESSEL_OF_RUIN = 284, + ABILITY_SWORD_OF_RUIN = 285, + ABILITY_TABLETS_OF_RUIN = 286, + ABILITY_BEADS_OF_RUIN = 287, + ABILITY_ORICHALCUM_PULSE = 288, + ABILITY_HADRON_ENGINE = 289, + ABILITY_OPPORTUNIST = 290, + ABILITY_CUD_CHEW = 291, + ABILITY_SHARPNESS = 292, + ABILITY_SUPREME_OVERLORD = 293, + ABILITY_COSTAR = 294, + ABILITY_TOXIC_DEBRIS = 295, + ABILITY_ARMOR_TAIL = 296, + ABILITY_EARTH_EATER = 297, + ABILITY_MYCELIUM_MIGHT = 298, + ABILITY_HOSPITALITY = 299, + ABILITY_MINDS_EYE = 300, + ABILITY_EMBODY_ASPECT_TEAL_MASK = 301, + ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK = 302, + ABILITY_EMBODY_ASPECT_WELLSPRING_MASK = 303, + ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK = 304, + ABILITY_TOXIC_CHAIN = 305, + ABILITY_SUPERSWEET_SYRUP = 306, + ABILITY_TERA_SHIFT = 307, + ABILITY_TERA_SHELL = 308, + ABILITY_TERAFORM_ZERO = 309, + ABILITY_POISON_PUPPETEER = 310, + ABILITIES_COUNT_GEN9, + ABILITIES_COUNT = ABILITIES_COUNT_GEN9, +}; #endif // GUARD_CONSTANTS_ABILITIES_H diff --git a/include/data.h b/include/data.h index 2128685e19..6db21db905 100644 --- a/include/data.h +++ b/include/data.h @@ -64,7 +64,7 @@ struct TrainerMon u16 moves[4]; u16 species; u16 heldItem; - u16 ability; + enum Ability ability; u8 lvl; u8 ball; u8 friendship; @@ -82,7 +82,7 @@ struct TrainerMon #define TRAINER_PARTY(partyArray) partyArray, .partySize = ARRAY_COUNT(partyArray) -enum TrainerBattleType +enum TrainerBattleType { TRAINER_BATTLE_TYPE_SINGLES, TRAINER_BATTLE_TYPE_DOUBLES, diff --git a/include/pokemon.h b/include/pokemon.h index ba459480e1..04016af4c8 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -10,6 +10,10 @@ #include "constants/map_groups.h" #include "constants/regions.h" #include "constants/region_map_sections.h" +#include "constants/map_groups.h" +#include "constants/battle.h" +#include "constants/abilities.h" +#include "contest_effect.h" #include "constants/trainers.h" #define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0)) @@ -367,7 +371,7 @@ struct BattlePokemon /*0x17*/ u32 spDefenseIV:5; /*0x17*/ u32 abilityNum:2; /*0x18*/ s8 statStages[NUM_BATTLE_STATS]; - /*0x20*/ u16 ability; + /*0x20*/ enum Ability ability; /*0x22*/ u8 types[3]; /*0x25*/ u8 pp[MAX_MON_MOVES]; /*0x29*/ u16 hp; @@ -429,7 +433,7 @@ struct SpeciesInfo /*0xC4*/ u8 friendship; u8 growthRate; u8 eggGroups[2]; - u16 abilities[NUM_ABILITY_SLOTS]; // 3 abilities, no longer u8 because we have over 255 abilities now. + enum Ability abilities[NUM_ABILITY_SLOTS]; // 3 abilities, no longer u8 because we have over 255 abilities now. u8 safariZoneFleeRate; // Pokédex data @@ -533,7 +537,7 @@ struct SpeciesInfo /*0xC4*/ #endif //OW_POKEMON_OBJECT_EVENTS }; -struct Ability +struct AbilityInfo { u8 name[ABILITY_NAME_LENGTH + 1]; const u8 *description; @@ -676,7 +680,7 @@ extern const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2]; extern const u16 gUnionRoomFacilityClasses[]; extern const struct SpriteTemplate gBattlerSpriteTemplates[]; extern const u32 sExpCandyExperienceTable[]; -extern const struct Ability gAbilitiesInfo[]; +extern const struct AbilityInfo gAbilitiesInfo[]; extern const struct NatureInfo gNaturesInfo[]; #if P_TUTOR_MOVES_ARRAY extern const u16 gTutorMoves[]; @@ -751,8 +755,8 @@ u8 CalculateEnemyPartyCount(void); u8 CalculateEnemyPartyCountInSide(u32 battler); u8 GetMonsStateToDoubles(void); u8 GetMonsStateToDoubles_2(void); -u16 GetAbilityBySpecies(u16 species, u8 abilityNum); -u16 GetMonAbility(struct Pokemon *mon); +enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum); +enum Ability GetMonAbility(struct Pokemon *mon); void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord); u8 GetSecretBaseTrainerPicIndex(void); enum TrainerClassID GetSecretBaseTrainerClass(void); @@ -764,7 +768,7 @@ const u8 *GetSpeciesPokedexDescription(u16 species); u32 GetSpeciesHeight(u16 species); u32 GetSpeciesWeight(u16 species); u32 GetSpeciesType(u16 species, u8 slot); -u32 GetSpeciesAbility(u16 species, u8 slot); +enum Ability GetSpeciesAbility(u16 species, u8 slot); u32 GetSpeciesBaseHP(u16 species); u32 GetSpeciesBaseAttack(u16 species); u32 GetSpeciesBaseDefense(u16 species); diff --git a/include/test/battle.h b/include/test/battle.h index 02106496b6..ad36cd4f99 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -566,7 +566,7 @@ enum struct QueuedAbilityEvent { u8 battlerId; - u16 ability; + enum Ability ability; }; struct QueuedAnimationEvent @@ -698,7 +698,7 @@ struct BattleTestData u8 gender; u8 nature; bool8 isShiny; - u16 forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; + enum Ability forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 chosenGimmick[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 currentMonIndexes[MAX_BATTLERS_COUNT]; @@ -896,7 +896,7 @@ void AIFlags_(u32 sourceLine, u64 flags); void AILogScores(u32 sourceLine); void Gender_(u32 sourceLine, u32 gender); void Nature_(u32 sourceLine, u32 nature); -void Ability_(u32 sourceLine, u32 ability); +void Ability_(u32 sourceLine, enum Ability ability); void Level_(u32 sourceLine, u32 level); void MaxHP_(u32 sourceLine, u32 maxHP); void HP_(u32 sourceLine, u32 hp); @@ -1070,7 +1070,7 @@ enum QueueGroupType struct AbilityEventContext { - u16 ability; + enum Ability ability; }; struct AnimationEventContext diff --git a/include/test_runner.h b/include/test_runner.h index 3b11568f60..a3b0826e86 100644 --- a/include/test_runner.h +++ b/include/test_runner.h @@ -9,7 +9,7 @@ extern const bool8 gTestRunnerSkipIsFail; enum Gimmick; -void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability); +void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, enum Ability ability); void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId); void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP); void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp); diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index f844b03d34..202955705e 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -24,8 +24,8 @@ #include "constants/moves.h" #include "constants/items.h" -static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather); -static bool32 DoesAbilityBenefitFromFieldStatus(u32 ability, u32 fieldStatus); +static bool32 DoesAbilityBenefitFromWeather(enum Ability ability, u32 weather); +static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldStatus); // A move is light sensitive if it is boosted by Sunny Day and weakened by low light weathers. static bool32 IsLightSensitiveMove(u32 move); static bool32 HasLightSensitiveMove(u32 battler); @@ -128,7 +128,7 @@ bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome return (result == desiredResult); } -static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather) +static bool32 DoesAbilityBenefitFromWeather(enum Ability ability, u32 weather) { switch (ability) { @@ -166,7 +166,7 @@ static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather) return FALSE; } -static bool32 DoesAbilityBenefitFromFieldStatus(u32 ability, u32 fieldStatus) +static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldStatus) { switch (ability) { @@ -220,7 +220,7 @@ static bool32 HasLightSensitiveMove(u32 battler) // Utility Umbrella does NOT block Ancient Pokemon from their stat boosts. static enum FieldEffectOutcome BenefitsFromSun(u32 battler) { - u32 ability = gAiLogicData->abilities[battler]; + enum Ability ability = gAiLogicData->abilities[battler]; if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_UTILITY_UMBRELLA) { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 2581cfa1ff..ec13d78a94 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -549,7 +549,9 @@ void RecordStatusMoves(u32 battler) void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) { - u32 ability, holdEffect; + enum Ability ability; + u32 holdEffect; + ability = aiData->abilities[battler] = AI_DecideKnownAbilityForTurn(battler); aiData->items[battler] = gBattleMons[battler].item; holdEffect = aiData->holdEffects[battler] = AI_DecideHoldEffectForTurn(battler); @@ -570,8 +572,8 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 move) { u32 accuracy; - u32 abilityAtk = aiData->abilities[battlerAtk]; - u32 abilityDef = aiData->abilities[battlerDef]; + enum Ability abilityAtk = aiData->abilities[battlerAtk]; + enum Ability abilityDef = aiData->abilities[battlerDef]; if (CanMoveSkipAccuracyCalc(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) { accuracy = BYPASSES_ACCURACY_CALC; @@ -691,7 +693,7 @@ u32 GetPartyMonAbility(struct Pokemon *mon) { // Doesn't have any special handling yet u32 species = GetMonData(mon, MON_DATA_SPECIES); - u32 ability = GetSpeciesAbility(species, GetMonData(mon, MON_DATA_ABILITY_NUM)); + enum Ability ability = GetSpeciesAbility(species, GetMonData(mon, MON_DATA_ABILITY_NUM)); return ability; } @@ -711,8 +713,8 @@ static u32 PpStallReduction(u32 move, u32 battlerAtk) continue; PokemonToBattleMon(&gPlayerParty[partyIndex], &gBattleMons[tempBattleMonIndex]); u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES); - u32 abilityAtk = ABILITY_NONE; - u32 abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]); + enum Ability abilityAtk = ABILITY_NONE; + enum Ability abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]); u32 moveType = GetBattleMoveType(move); // Probably doesn't handle dynamic types right now if (CanAbilityAbsorbMove(battlerAtk, tempBattleMonIndex, abilityDef, move, moveType, CHECK_TRIGGER) || CanAbilityBlockMove(battlerAtk, tempBattleMonIndex, abilityAtk, abilityDef, move, CHECK_TRIGGER) @@ -1082,8 +1084,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 weather; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - u32 abilityAtk = aiData->abilities[battlerAtk]; - u32 abilityDef = aiData->abilities[battlerDef]; + enum Ability abilityAtk = aiData->abilities[battlerAtk]; + enum Ability abilityDef = aiData->abilities[battlerDef]; s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); SetTypeBeforeUsingMove(move, battlerAtk); @@ -1224,6 +1226,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && IsNonVolatileStatusMove(move)) RETURN_SCORE_MINUS(10); break; + default: + break; } // def ability checks // target partner ability checks & not attacking partner @@ -1255,6 +1259,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsAromaVeilProtectedEffect(moveEffect)) RETURN_SCORE_MINUS(10); break; + default: + break; } } // def partner ability checks @@ -4935,6 +4941,8 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (AI_GetWeather() & B_WEATHER_SUN) ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down break; + default: + break; } } break; @@ -6530,7 +6538,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 i; u32 unmodifiedScore = score; - u32 ability = gBattleMons[battlerAtk].ability; + enum Ability ability = gBattleMons[battlerAtk].ability; bool32 opposingHazardFlags = DoesSideHaveDamagingHazards(GetBattlerSide(battlerDef)); bool32 aiHazardFlags = AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)); enum BattleMoveEffects moveEffect = GetMoveEffect(move); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 34844fdbab..120d6f910d 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -29,7 +29,7 @@ static bool32 AiExpectsToFaintPlayer(u32 battler); static bool32 AI_ShouldHeal(u32 battler, u32 healAmount); static bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount); static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon); -static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent); +static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent); static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon); static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon); @@ -476,7 +476,8 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) s32 firstId; s32 lastId; struct Pokemon *party; - u16 monAbility, aiMove; + enum Ability monAbility; + u16 aiMove; u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); u32 incomingType = CheckDynamicMoveType(GetBattlerMon(opposingBattler), incomingMove, opposingBattler, MON_IN_BATTLE); @@ -631,7 +632,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) s32 lastId; struct Pokemon *party; s32 i; - u16 monAbility; + enum Ability monAbility; s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer @@ -666,7 +667,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) static bool32 ShouldSwitchIfBadlyStatused(u32 battler) { bool32 switchMon = FALSE; - u16 monAbility = gAiLogicData->abilities[battler]; + enum Ability monAbility = gAiLogicData->abilities[battler]; enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u8 opposingBattler = GetBattlerAtPosition(opposingPosition); @@ -894,7 +895,8 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc for (i = firstId; i < lastId; i++) { - u16 species, monAbility; + u16 species; + enum Ability monAbility; uq4_12_t typeMultiplier; u16 moveFlags = 0; @@ -938,7 +940,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) { u32 battlerIn1, battlerIn2; u32 hazardDamage = 0, battlerHp = gBattleMons[battler].hp; - u32 ability = gAiLogicData->abilities[battler], aiMove; + enum Ability ability = gAiLogicData->abilities[battler], aiMove; s32 firstId, lastId, i, j; struct Pokemon *party; @@ -1534,7 +1536,7 @@ static u32 GetFirstNonIvalidMon(u32 firstId, u32 lastId, u32 invalidMons, u32 ba return PARTY_SIZE; } -bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2) +bool32 IsMonGrounded(u16 heldItemEffect, enum Ability ability, u8 type1, u8 type2) { // List that makes mon not grounded if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE @@ -1555,7 +1557,8 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon { u8 defType1 = battleMon->types[0], defType2 = battleMon->types[1], tSpikesLayers; u16 heldItemEffect = GetItemHoldEffect(battleMon->item); - u32 maxHP = battleMon->maxHP, ability = battleMon->ability, status = battleMon->status1; + u32 maxHP = battleMon->maxHP; + enum Ability ability = battleMon->ability, status = battleMon->status1; u32 spikesDamage = 0, tSpikesDamage = 0, hazardDamage = 0; u32 side = GetBattlerSide(battler); @@ -1611,7 +1614,8 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon // Gets damage / healing from weather static s32 GetSwitchinWeatherImpact(void) { - s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; + s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); if (HasWeatherEffect()) @@ -1675,7 +1679,8 @@ static s32 GetSwitchinWeatherImpact(void) // Gets one turn of recurring healing static u32 GetSwitchinRecurringHealing(void) { - u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; + u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items @@ -1709,7 +1714,8 @@ static u32 GetSwitchinRecurringHealing(void) // Gets one turn of recurring damage static u32 GetSwitchinRecurringDamage(void) { - u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; + u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items @@ -1743,7 +1749,8 @@ static u32 GetSwitchinStatusDamage(u32 battler) u8 defType1 = gAiLogicData->switchinCandidate.battleMon.types[0], defType2 = gAiLogicData->switchinCandidate.battleMon.types[1]; u8 tSpikesLayers = gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount; u16 heldItemEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); - u32 status = gAiLogicData->switchinCandidate.battleMon.status1, ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + u32 status = gAiLogicData->switchinCandidate.battleMon.status1; + enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; u32 statusDamage = 0; // Status condition damage @@ -1823,7 +1830,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) u16 maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, item = gAiLogicData->switchinCandidate.battleMon.item, heldItemEffect = GetItemHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = GetItemHoldEffectParam(item); u32 opposingBattler = GetOppositeBattler(battler); - u32 opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum Ability opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); s32 currentHP = startingHP, singleUseItemHeal = 0; @@ -2027,7 +2034,7 @@ static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposi return maxDamageTaken; } -static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) +static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent) { if ((B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(opponent, TYPE_GHOST))) return FALSE; @@ -2059,7 +2066,7 @@ static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchi return TRUE; if (gAiLogicData->ejectPackSwitch) { - u32 opposingAbility = GetBattlerAbilityIgnoreMoldBreaker(opposingBattler); + enum Ability opposingAbility = GetBattlerAbilityIgnoreMoldBreaker(opposingBattler); // If faster, not a free switch; likely lowered own stats if (!movedSecond && opposingAbility != ABILITY_INTIMIDATE && opposingAbility != ABILITY_SUPERSWEET_SYRUP) // Intimidate triggers switches before turn starts return FALSE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ab0be71483..d8d8e3a5c2 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -28,7 +28,7 @@ static u32 GetAIEffectGroup(enum BattleMoveEffects effect); static u32 GetAIEffectGroupFromMove(u32 battler, u32 move); // Functions -static u32 AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, u32 abilityAtk, u32 abilityDef, u32 holdEffectDef, u32 move) +static u32 AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, enum Ability abilityAtk, enum Ability abilityDef, u32 holdEffectDef, u32 move) { if (MoveIgnoresTargetAbility(move)) return ABILITY_NONE; @@ -261,7 +261,7 @@ void RecordAllMoves(u32 battler) memcpy(gAiPartyData->mons[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].moves, gBattleMons[battler].moves, MAX_MON_MOVES * sizeof(u16)); } -void RecordAbilityBattle(u32 battlerId, u32 abilityId) +void RecordAbilityBattle(u32 battlerId, enum Ability abilityId) { gBattleHistory->abilities[battlerId] = abilityId; gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability = abilityId; @@ -542,7 +542,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) } // move checks -bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect) { if (ability == ABILITY_OVERCOAT || (B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) @@ -643,8 +643,8 @@ static inline s32 DmgRoll(s32 dmg) bool32 IsDamageMoveUnusable(struct DamageContext *ctx) { - u32 battlerDefAbility; - u32 partnerDefAbility; + enum Ability battlerDefAbility; + enum Ability partnerDefAbility; struct AiLogicData *aiData = gAiLogicData; if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) @@ -1016,7 +1016,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u bool32 AI_IsDamagedByRecoil(u32 battler) { - u32 ability = gAiLogicData->abilities[battler]; + enum Ability ability = gAiLogicData->abilities[battler]; if (ability == ABILITY_MAGIC_GUARD || ability == ABILITY_ROCK_HEAD) return FALSE; return TRUE; @@ -1026,8 +1026,8 @@ bool32 AI_IsDamagedByRecoil(u32 battler) static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) { u32 i; - u32 abilityDef = gAiLogicData->abilities[battlerDef]; - u32 abilityAtk = gAiLogicData->abilities[battlerAtk]; + enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; + enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk]; switch (GetMoveEffect(move)) { @@ -1158,8 +1158,8 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) { - u32 abilityAtk = gAiLogicData->abilities[battlerAtk]; - u32 abilityDef = gAiLogicData->abilities[battlerDef]; + enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk]; + enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; u8 i; switch (GetMoveEffect(move)) @@ -1239,8 +1239,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) { bool32 effect1, effect2; - u32 defAbility = gAiLogicData->abilities[battlerDef]; - u32 atkAbility = gAiLogicData->abilities[battlerAtk]; + enum Ability defAbility = gAiLogicData->abilities[battlerDef]; + enum Ability atkAbility = gAiLogicData->abilities[battlerAtk]; // Check if physical moves hurt. if (gAiLogicData->holdEffects[battlerAtk] != HOLD_EFFECT_PROTECTIVE_PADS && atkAbility != ABILITY_LONG_REACH @@ -1361,8 +1361,8 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 pla u32 speedBattlerAI, speedBattler; enum ItemHoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; enum ItemHoldEffect holdEffectPlayer = gAiLogicData->holdEffects[battler]; - u32 abilityAI = gAiLogicData->abilities[battlerAI]; - u32 abilityPlayer = gAiLogicData->abilities[battler]; + enum Ability abilityAI = gAiLogicData->abilities[battlerAI]; + enum Ability abilityPlayer = gAiLogicData->abilities[battler]; if (considerPriority == CONSIDER_PRIORITY) { @@ -1641,7 +1641,7 @@ bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dm return FALSE; } -bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) +bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability) { if (IsBattlerAlive(battlerId) && gAiLogicData->abilities[battlerId] == ability) return TRUE; @@ -1652,13 +1652,13 @@ bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) } // does NOT include ability suppression checks -s32 AI_DecideKnownAbilityForTurn(u32 battlerId) +enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId) { u32 validAbilities[NUM_ABILITY_SLOTS]; u8 i, numValidAbilities = 0; - u32 knownAbility = GetBattlerAbilityIgnoreMoldBreaker(battlerId); // during ai checking for mold breaker could lead to inaccuracies - u32 indexAbility; - u32 abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; + enum Ability knownAbility = GetBattlerAbilityIgnoreMoldBreaker(battlerId); + enum Ability indexAbility; + enum Ability abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; // We've had ability overwritten by e.g. Worry Seed. It is not part of gAiPartyData in case of switching if (gDisableStructs[battlerId].overwrittenAbility) @@ -1720,7 +1720,7 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) return holdEffect; } -bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept @@ -1754,7 +1754,7 @@ u32 AI_GetWeather(void) u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon) { - u32 ability = battleMon.ability; + enum Ability ability = battleMon.ability; // Forced weather behaviour if (!AI_WeatherHasEffect()) return B_WEATHER_NONE; @@ -1940,7 +1940,7 @@ bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove) } } -bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; @@ -1954,7 +1954,7 @@ bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) return FALSE; } -bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) +bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move) { enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; u32 accuracy = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; @@ -2106,7 +2106,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, return FALSE; u32 move = gAiThinkingStruct->moveConsidered; - u32 abilityAtk = aiData->abilities[battlerAtk]; + enum Ability abilityAtk = aiData->abilities[battlerAtk]; if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MIST && abilityAtk != ABILITY_INFILTRATOR) return FALSE; @@ -2235,7 +2235,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) return (tempScore > BEST_EFFECT) ? BEST_EFFECT : tempScore; // don't inflate score so only max +4 } -bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat) +bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, u32 stat) { if ((gBattleMons[battler].statStages[stat] < MAX_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) || (battlerAbility == ABILITY_CONTRARY && gBattleMons[battler].statStages[stat] > MIN_STAT_STAGE)) @@ -3093,7 +3093,7 @@ static u32 GetPoisonDamage(u32 battlerId) return damage; } -static bool32 BattlerAffectedBySandstorm(u32 battlerId, u32 ability) +static bool32 BattlerAffectedBySandstorm(u32 battlerId, enum Ability ability) { if (!IS_BATTLER_ANY_TYPE(battlerId, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) && ability != ABILITY_SAND_VEIL @@ -3104,7 +3104,7 @@ static bool32 BattlerAffectedBySandstorm(u32 battlerId, u32 ability) return FALSE; } -static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability) +static bool32 BattlerAffectedByHail(u32 battlerId, enum Ability ability) { if (!IS_BATTLER_OF_TYPE(battlerId, TYPE_ICE) && ability != ABILITY_SNOW_CLOAK @@ -3116,7 +3116,7 @@ static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability) static u32 GetWeatherDamage(u32 battlerId) { - u32 ability = gAiLogicData->abilities[battlerId]; + enum Ability ability = gAiLogicData->abilities[battlerId]; enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerId]; u32 damage = 0; u32 weather = AI_GetWeather(); @@ -3167,7 +3167,7 @@ u32 GetBattlerSecondaryDamage(u32 battlerId) return secondaryDamage; } -bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability) +bool32 BattlerWillFaintFromWeather(u32 battler, enum Ability ability) { if ((BattlerAffectedBySandstorm(battler, ability) || BattlerAffectedByHail(battler, ability)) && gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16)) @@ -3176,7 +3176,7 @@ bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability) return FALSE; } -bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability) +bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability) { if (GetBattlerSecondaryDamage(battler) != 0 && gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16)) @@ -3214,7 +3214,7 @@ static bool32 AnyUsefulStatIsRaised(u32 battler) static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) { struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler]; - u32 ability = GetMonAbility(mon); // we know our own party data + enum Ability ability = GetMonAbility(mon); // we know our own party data enum ItemHoldEffect holdEffect; u32 species = GetMonData(mon, MON_DATA_SPECIES); s32 hazardDamage = 0; @@ -3255,7 +3255,7 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) return FALSE; } -enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex) +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex) { bool32 hasStatBoost = AnyUsefulStatIsRaised(battlerAtk) || gBattleMons[battlerDef].statStages[STAT_EVASION] >= 9; //Significant boost in evasion for any class u32 battlerToSwitch; @@ -3455,7 +3455,7 @@ bool32 CanKnockOffItem(u32 battler, u32 item) } // status checks -bool32 IsBattlerIncapacitated(u32 battler, u32 ability) +bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability) { if ((gBattleMons[battler].status1 & STATUS1_FREEZE) && !HasThawingMove(battler)) return TRUE; // if battler has thawing move we assume they will definitely use it, and thus being frozen should be neglected @@ -3469,7 +3469,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability) return FALSE; } -bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) +bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) { if (!CanBeSlept(battlerAtk, battlerDef, defAbility, BLOCKED_BY_SLEEP_CLAUSE) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) @@ -3478,7 +3478,7 @@ bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move return TRUE; } -static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ability) +static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, enum Ability ability) { if (ability == ABILITY_MARVEL_SCALE || ability == ABILITY_QUICK_FEET @@ -3492,7 +3492,7 @@ static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ab bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef) { - u32 abilityDef = gAiLogicData->abilities[battlerDef]; + enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; // Battler can be poisoned and has move/ability that synergizes with being poisoned if (CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], abilityDef) && ( DoesBattlerBenefitFromAllVolatileStatus(battlerDef, abilityDef) @@ -3510,7 +3510,7 @@ bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef) return TRUE; } -bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { // Battler can be burned and has move/ability that synergizes with being burned if (CanBeBurned(battlerAtk, battlerDef, abilityDef) && ( @@ -3530,7 +3530,7 @@ bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return TRUE; } -bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { if (!B_USE_FROSTBITE) { @@ -3562,7 +3562,7 @@ bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) } } -bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { // Battler can be paralyzed and has move/ability that synergizes with being paralyzed if (CanBeParalyzed(battlerAtk, battlerDef, abilityDef) && ( @@ -3579,7 +3579,7 @@ bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return TRUE; } -bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) +bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) { if (!CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3590,7 +3590,7 @@ bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u3 return TRUE; } -bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) +bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) { if (!CanBeParalyzed(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3600,7 +3600,7 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, return TRUE; } -bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef) +bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability abilityDef) { if (gBattleMons[battlerDef].volatiles.confusionTurns > 0 || (abilityDef == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) @@ -3611,7 +3611,7 @@ bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef return TRUE; } -bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY && AI_CanBeConfused(battlerAtk, battlerDef, move, defAbility) @@ -3625,7 +3625,7 @@ bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battler return TRUE; } -bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeBurned(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3637,7 +3637,7 @@ bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtk return TRUE; } -bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeFrozen(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3649,7 +3649,7 @@ bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 b return TRUE; } -bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) +bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbility) { if (gBattleMons[battlerDef].volatiles.infatuation || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3660,7 +3660,7 @@ bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) return TRUE; } -u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) +u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move) { u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (((!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS)) @@ -3737,7 +3737,7 @@ bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move) bool32 HasChoiceEffect(u32 battler) { - u32 ability = gAiLogicData->abilities[battler]; + enum Ability ability = gAiLogicData->abilities[battler]; if (ability == ABILITY_GORILLA_TACTICS) return TRUE; @@ -4487,7 +4487,7 @@ bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category) return FALSE; } -bool32 IsAbilityOfRating(u32 ability, s8 rating) +bool32 IsAbilityOfRating(enum Ability ability, s8 rating) { if (gAbilitiesInfo[ability].aiRating >= rating) return TRUE; @@ -4924,7 +4924,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score } } -bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move) +bool32 AI_MoveMakesContact(enum Ability ability, enum ItemHoldEffect holdEffect, u32 move) { if (MoveMakesContact(move) && ability != ABILITY_LONG_REACH @@ -5449,7 +5449,7 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData) { u32 preventsStatLoss; - u32 partnerAbility = aiData->abilities[battlerAtkPartner]; + enum Ability partnerAbility = aiData->abilities[battlerAtkPartner]; u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk)); u32 opposingBattler = GetBattlerAtPosition(opposingPosition); @@ -5532,7 +5532,7 @@ bool32 IsBattlerItemEnabled(u32 battler) return TRUE; } -bool32 HasBattlerSideAbility(u32 battler, u32 ability, struct AiLogicData *aiData) +bool32 HasBattlerSideAbility(u32 battler, enum Ability ability, struct AiLogicData *aiData) { if (aiData->abilities[battler] == ability) return TRUE; @@ -5553,7 +5553,7 @@ u32 GetFriendlyFireKOThreshold(u32 battler) return FRIENDLY_FIRE_NORMAL_THRESHOLD; } -bool32 IsMoxieTypeAbility(u32 ability) +bool32 IsMoxieTypeAbility(enum Ability ability) { switch (ability) { @@ -5569,7 +5569,7 @@ bool32 IsMoxieTypeAbility(u32 ability) } } -bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability) +bool32 DoesAbilityRaiseStatsWhenLowered(enum Ability ability) { switch (ability) { @@ -5582,7 +5582,7 @@ bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability) } } -bool32 DoesIntimidateRaiseStats(u32 ability) +bool32 DoesIntimidateRaiseStats(enum Ability ability) { switch (ability) { @@ -5598,7 +5598,7 @@ bool32 DoesIntimidateRaiseStats(u32 ability) } // TODO: work out when to attack into the player's contextually 'beneficial' ability -bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, u32 ability) +bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability) { if (IsTargetingPartner(battlerAtk, battlerDef)) { @@ -5671,8 +5671,8 @@ bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct if (gBattleMons[battlerDef].volatiles.gastroAcid) return FALSE; - u32 atkAbility = aiData->abilities[battlerAtk]; - u32 defAbility = aiData->abilities[battlerDef]; + enum Ability atkAbility = aiData->abilities[battlerAtk]; + enum Ability defAbility = aiData->abilities[battlerDef]; bool32 hasSameAbility = (atkAbility == defAbility); if (defAbility == ABILITY_NONE) @@ -5794,8 +5794,8 @@ bool32 DoesEffectReplaceTargetAbility(u32 effect) void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, struct AiLogicData *aiData) { bool32 isTargetingPartner = IsTargetingPartner(battlerAtk, battlerDef); - u32 abilityAtk = aiData->abilities[battlerAtk]; - u32 abilityDef = aiData->abilities[battlerDef]; + enum Ability abilityAtk = aiData->abilities[battlerAtk]; + enum Ability abilityDef = aiData->abilities[battlerDef]; bool32 partnerHasBadAbility = FALSE; u32 partnerAbility = ABILITY_NONE; bool32 attackerHasBadAbility = (gAbilitiesInfo[abilityAtk].aiRating < 0); @@ -5865,7 +5865,7 @@ void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, } } -s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData *aiData) +s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct AiLogicData *aiData) { if (gAbilitiesInfo[ability].aiRating < 0) return WORST_EFFECT; @@ -5916,7 +5916,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData break; case ABILITY_INTIMIDATE: { - u32 abilityDef = aiData->abilities[LEFT_FOE(battler)]; + enum Ability abilityDef = aiData->abilities[LEFT_FOE(battler)]; if (DoesIntimidateRaiseStats(abilityDef)) { return AWFUL_EFFECT; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 128862994b..05b0b9ee30 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -6964,7 +6964,7 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) // For Snipe Shot and abilities Stalwart/Propeller Tail - keep the original target. for (i = 0; i < gBattlersCount; i++) { - u16 ability = GetBattlerAbility(i); + enum Ability ability = GetBattlerAbility(i); // if not targeting a slot that got switched, continue if (!IsBattlerAlly(gBattleStruct->moveTarget[i], battlerAtk)) continue; diff --git a/src/battle_debug.c b/src/battle_debug.c index b1dfb6b30b..5c2e0735a1 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -759,7 +759,7 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 103 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, COMPOUND_STRING("/")); else AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("/"), 103 + count * 54, (i * 15) + 15, 0, NULL); - + ConvertIntToDecimalStringN(text, AI_GetDamage(data->aiBattlerId, battlerDef, i, AI_ATTACKING, gAiLogicData), STR_CONV_MODE_LEADING_ZEROS, 3); @@ -920,7 +920,7 @@ static void PutAiInfoText(struct BattleDebugMenu *data) { if (IsOnPlayerSide(i) && IsBattlerAlive(i)) { - u16 ability = gAiLogicData->abilities[i]; + enum Ability ability = gAiLogicData->abilities[i]; enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[i]; u16 item = gAiLogicData->items[i]; u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75; diff --git a/src/battle_dome.c b/src/battle_dome.c index 68bd6af252..1629330898 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2393,8 +2393,9 @@ static int SelectOpponentMonsFromParty(int *partyMovePoints, bool8 allowRandom) static int GetTypeEffectivenessPoints(int move, int targetSpecies, int mode) { - int defType1, defType2, defAbility, moveType; + int defType1, defType2, moveType; int typePower = TYPE_x1; + enum Ability defAbility; if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || IsBattleMoveStatus(move)) return 0; @@ -5141,7 +5142,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun { u32 personality = 0; u32 targetSpecies = 0; - u32 targetAbility = 0; + enum Ability targetAbility = 0; uq4_12_t typeMultiplier = 0; do { diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 3f6f0db2ca..3b2c0f8cf7 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -188,7 +188,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); u32 currBattleWeather = GetCurrentBattleWeather(); if (currBattleWeather == 0xFF) @@ -294,7 +294,7 @@ static bool32 HandleEndTurnGenThreeBerryActivation(u32 battler) static bool32 HandleEndTurnEmergencyExit(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); gBattleStruct->turnEffectsBattlerId++; @@ -505,7 +505,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) break; case FIRST_EVENT_BLOCK_ABILITIES: { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); switch (ability) { case ABILITY_HEALER: @@ -514,6 +514,8 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) effect = TRUE; break; + default: + break; } gBattleStruct->eventBlockCounter++; break; @@ -609,7 +611,7 @@ static bool32 HandleEndTurnPoison(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); gBattleStruct->turnEffectsBattlerId++; @@ -657,7 +659,7 @@ static bool32 HandleEndTurnBurn(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); gBattleStruct->turnEffectsBattlerId++; @@ -1004,7 +1006,7 @@ static bool32 HandleEndTurnYawn(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); gBattleStruct->turnEffectsBattlerId++; @@ -1406,7 +1408,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) break; case THIRD_EVENT_BLOCK_ABILITIES: { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); switch (ability) { case ABILITY_TRUANT: // Not fully accurate but it has to be handled somehow. TODO: Find a better way. @@ -1421,6 +1423,8 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) effect = TRUE; break; + default: + break; } gBattleStruct->eventBlockCounter++; break; @@ -1456,7 +1460,7 @@ static bool32 HandleEndTurnAbilities(u32 battler) { bool32 effect = FALSE; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); gBattleStruct->turnEffectsBattlerId++; @@ -1468,6 +1472,8 @@ static bool32 HandleEndTurnAbilities(u32 battler) case ABILITY_ZEN_MODE: if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) effect = TRUE; + default: + break; } return effect; @@ -1481,7 +1487,7 @@ static bool32 HandleEndTurnFourthEventBlock(u32 battler) { case FOURTH_EVENT_BLOCK_HUNGER_SWITCH: { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (ability == ABILITY_HUNGER_SWITCH) { if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) diff --git a/src/battle_interface.c b/src/battle_interface.c index 123f195969..d20b4b9aae 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2603,7 +2603,7 @@ static void PrintBattlerOnAbilityPopUp(u8 battler, u8 spriteId1, u8 spriteId2) TRUE, gSprites[spriteId1].sBattlerId); } -static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2) +static void PrintAbilityOnAbilityPopUp(enum Ability ability, u8 spriteId1, u8 spriteId2) { PrintOnAbilityPopUp(COMPOUND_STRING(" "), (void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum) + TILE_OFFSET_4BPP(8), @@ -2631,7 +2631,7 @@ static inline bool32 IsAnyAbilityPopUpActive(void) return activeAbilityPopUps; } -void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle) +void CreateAbilityPopUp(u8 battler, enum Ability ability, bool32 isDoubleBattle) { u8 *spriteIds; u32 xSlide, tileTag, battlerPosition = GetBattlerPosition(battler); @@ -2696,7 +2696,7 @@ void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle) void UpdateAbilityPopup(u8 battler) { u8 *spriteIds = gBattleStruct->abilityPopUpSpriteIds[battler]; - u16 ability = (gBattleScripting.abilityPopupOverwrite) ? gBattleScripting.abilityPopupOverwrite + enum Ability ability = (gBattleScripting.abilityPopupOverwrite) ? gBattleScripting.abilityPopupOverwrite : gBattleMons[battler].ability; PrintAbilityOnAbilityPopUp(ability, spriteIds[0], spriteIds[1]); } diff --git a/src/battle_main.c b/src/battle_main.c index 9b2555ba21..5d1b55d03e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -167,7 +167,7 @@ EWRAM_DATA u16 gChosenMove = 0; EWRAM_DATA u16 gCalledMove = 0; EWRAM_DATA s32 gBideDmg[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gLastUsedItem = 0; -EWRAM_DATA u16 gLastUsedAbility = 0; +EWRAM_DATA enum Ability gLastUsedAbility = 0; EWRAM_DATA u8 gBattlerAttacker = 0; EWRAM_DATA u8 gBattlerTarget = 0; EWRAM_DATA u8 gBattlerFainted = 0; @@ -3417,7 +3417,7 @@ const u8* FaintClearSetData(u32 battler) // If the released mon can be confused, do so. // Don't use CanBeConfused here, since it can cause issues in edge cases. - u32 ability = GetBattlerAbility(otherSkyDropper); + enum Ability ability = GetBattlerAbility(otherSkyDropper); if (!(ability == ABILITY_OWN_TEMPO || gBattleMons[otherSkyDropper].volatiles.confusionTurns || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) @@ -4742,7 +4742,7 @@ void SwapTurnOrder(u8 id1, u8 id2) } // For AI, so it doesn't 'cheat' by knowing player's ability -u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect) { u32 speed = gBattleMons[battler].speed; @@ -4811,12 +4811,12 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h u32 GetBattlerTotalSpeedStat(u32 battler) { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); } -s32 GetChosenMovePriority(u32 battler, u32 ability) +s32 GetChosenMovePriority(u32 battler, enum Ability ability) { u16 move; @@ -4829,7 +4829,7 @@ s32 GetChosenMovePriority(u32 battler, u32 ability) return GetBattleMovePriority(battler, ability, move); } -s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) +s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) { s32 priority = 0; @@ -4869,7 +4869,7 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) return priority; } -s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2, +s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2, enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) { u32 strikesFirst = 0; @@ -4935,12 +4935,12 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves) { s32 priority1 = 0, priority2 = 0; - u32 ability1 = GetBattlerAbility(battler1); + enum Ability ability1 = GetBattlerAbility(battler1); u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1); enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2); enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); - u32 ability2 = GetBattlerAbility(battler2); + enum Ability ability2 = GetBattlerAbility(battler2); if (!ignoreChosenMoves) { @@ -5276,10 +5276,10 @@ static void TryChangeTurnOrder(void) static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) { - u32 ability1 = GetBattlerAbility(battler1); + enum Ability ability1 = GetBattlerAbility(battler1); enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); - u32 ability2 = GetBattlerAbility(battler2); + enum Ability ability2 = GetBattlerAbility(battler2); // Battler 1 // Quick Draw @@ -5795,7 +5795,7 @@ void RunBattleScriptCommands(void) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } -u32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) +u32 TrySetAteType(u32 move, u32 battlerAtk, enum Ability attackerAbility) { u32 ateType = TYPE_NONE; @@ -5847,7 +5847,8 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState { u32 moveType = GetMoveType(move); enum BattleMoveEffects moveEffect = GetMoveEffect(move); - u32 species, heldItem, ability, type1, type2, type3; + u32 species, heldItem, type1, type2, type3; + enum Ability ability; enum ItemHoldEffect holdEffect; enum Gimmick gimmick = GetActiveGimmick(battler); diff --git a/src/battle_pike.c b/src/battle_pike.c index bdc2d1fd1c..b86ba6d4c4 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -811,7 +811,7 @@ static void HealMon(struct Pokemon *mon) static bool8 DoesAbilityPreventStatus(struct Pokemon *mon, u32 status) { - u16 ability = GetMonAbility(mon); + enum Ability ability = GetMonAbility(mon); bool8 ret = FALSE; if (ability == ABILITY_COMATOSE) @@ -1623,7 +1623,7 @@ static bool8 CanEncounterWildMon(u8 enemyMonLevel) { if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { - u16 monAbility = GetMonAbility(&gPlayerParty[0]); + enum Ability monAbility = GetMonAbility(&gPlayerParty[0]); if (monAbility == ABILITY_KEEN_EYE || monAbility == ABILITY_INTIMIDATE) { u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c old mode 100755 new mode 100644 index 7da08b3722..c0938c30f1 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -328,7 +328,7 @@ static bool32 SetTargetToNextPursuiter(u32 battlerDef); void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); static void RemoveAllWeather(void); static void RemoveAllTerrains(void); -static bool32 CanAbilityPreventStatLoss(u32 abilityDef); +static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef); static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove); static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move); @@ -1008,7 +1008,7 @@ static bool32 NoTargetPresent(u8 battler, u32 move) return FALSE; } -bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType) +bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, u32 moveType) { if ((ability == ABILITY_PROTEAN || ability == ABILITY_LIBERO) && !gDisableStructs[gBattlerAttacker].usedProteanLibero @@ -1089,7 +1089,7 @@ bool32 IsMovePowderBlocked(struct BattleContext *ctx) bool32 EmergencyExitCanBeTriggered(u32 battler) { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT) return FALSE; @@ -1364,7 +1364,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u move = gCurrentMove; enum BattleMoveEffects effect = GetMoveEffect(move); - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); if (move == NO_ACC_CALC_CHECK_LOCK_ON) @@ -1416,7 +1416,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u continue; numTargets++; - u32 abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityDef = GetBattlerAbility(battlerDef); if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) || CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, move, RUN_SCRIPT)) continue; @@ -1562,7 +1562,7 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum ItemHoldEffe return critStageIncrease; } -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk) +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk) { s32 critChance = 0; @@ -1611,7 +1611,7 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA // Threshold = Base Speed / 2 // High crit move = 8 * (Base Speed / 2) // Focus Energy = 4 * (Base Speed / 2) -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk) +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk) { s32 critChance = 0; s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove); @@ -1677,7 +1677,6 @@ static void Cmd_critcalc(void) u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker], moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), - abilityAtk = GetBattlerAbility(gBattlerAttacker), battlerDef; bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); @@ -1696,7 +1695,8 @@ static void Cmd_critcalc(void) || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) continue; - u32 abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) gBattleStruct->critChance[battlerDef] = CalcCritChanceStageGen1(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); @@ -1960,7 +1960,7 @@ static void Cmd_multihitresultmessage(void) static inline bool32 DoesBattlerNegateDamage(u32 battler) { u32 species = gBattleMons[battler].species; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (gBattleMons[battler].volatiles.transformed) return FALSE; @@ -4061,7 +4061,7 @@ static void SetToxicChainPriority(void) if (gBattleStruct->toxicChainPriority) return; - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); if (abilityAtk == ABILITY_TOXIC_CHAIN && IsBattlerAlive(gBattlerTarget) && CanBePoisoned(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerAbility(gBattlerTarget)) @@ -4330,11 +4330,11 @@ static void Cmd_jumpifvolatile(void) static void Cmd_jumpifability(void) { - CMD_ARGS(u8 battler, u16 ability, const u8 *jumpInstr); + CMD_ARGS(u8 battler, enum Ability ability, const u8 *jumpInstr); u32 battler; bool32 hasAbility = FALSE; - u32 ability = cmd->ability; + enum Ability ability = cmd->ability; switch (cmd->battler) { @@ -5360,10 +5360,10 @@ static void Cmd_setroost(void) static void Cmd_jumpifabilitypresent(void) { - CMD_ARGS(u16 ability, const u8 *jumpInstr); + CMD_ARGS(enum Ability ability, const u8 *jumpInstr); - u16 ability = cmd->ability; - u32 abilityBattler = IsAbilityOnField(ability); + enum Ability ability = cmd->ability; + enum Ability abilityBattler = IsAbilityOnField(ability); if (abilityBattler) { gBattlerAbility = abilityBattler - 1; @@ -5532,7 +5532,7 @@ static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum Ba static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move) { bool32 effect = FALSE; - u32 abilityAtk = GetBattlerAbility(battlerAtk); + enum Ability abilityAtk = GetBattlerAbility(battlerAtk); switch (abilityAtk) { @@ -5643,6 +5643,8 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move } } break; + default: + break; } return effect; @@ -7657,7 +7659,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) break; case HAZARDS_SPIKES: { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (ability != ABILITY_MAGIC_GUARD && IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler))) @@ -7781,7 +7783,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) } else { - u32 battlerAbility = GetBattlerAbility(battler); + enum Ability battlerAbility = GetBattlerAbility(battler); // There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts. // The truant counter is not updated in the case where a mon switches in after a lost judgment in the battle arena. if (battlerAbility == ABILITY_TRUANT @@ -7799,7 +7801,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) if (i == battler) continue; - u32 ability = GetBattlerAbility(i); + enum Ability ability = GetBattlerAbility(i); switch (ability) { case ABILITY_TRACE: @@ -7813,6 +7815,8 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, ability, 0, 0)) return TRUE; break; + default: + break; } if (TryClearIllusion(i, ABILITYEFFECT_ON_SWITCHIN)) return TRUE; @@ -9256,7 +9260,7 @@ u32 IsFlowerVeilProtected(u32 battler) return 0; } -u32 IsLeafGuardProtected(u32 battler, u32 ability) +u32 IsLeafGuardProtected(u32 battler, enum Ability ability) { if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) return ability == ABILITY_LEAF_GUARD; @@ -9264,13 +9268,13 @@ u32 IsLeafGuardProtected(u32 battler, u32 ability) return 0; } -bool32 IsShieldsDownProtected(u32 battler, u32 ability) +bool32 IsShieldsDownProtected(u32 battler, enum Ability ability) { return (ability == ABILITY_SHIELDS_DOWN && GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form } -u32 IsAbilityStatusProtected(u32 battler, u32 ability) +u32 IsAbilityStatusProtected(u32 battler, enum Ability ability) { return IsLeafGuardProtected(battler, ability) || IsShieldsDownProtected(battler, ability) @@ -9311,7 +9315,7 @@ static bool32 IsRototillerAffected(u32 battler) return TRUE; } -static bool32 IsElectricAbilityAffected(u32 battler, u32 ability) +static bool32 IsElectricAbilityAffected(u32 battler, enum Ability ability) { u32 moveType; @@ -9737,7 +9741,7 @@ static void Cmd_trysetrest(void) gBattlerTarget = gBattlerAttacker; gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); - u32 ability = GetBattlerAbility(gBattlerTarget); + enum Ability ability = GetBattlerAbility(gBattlerTarget); enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) @@ -9975,7 +9979,7 @@ static u16 ReverseStatChangeMoveEffect(u16 moveEffect) } } -static void TryPlayStatChangeAnimation(u32 battler, u32 ability, u32 stats, s32 statValue, u32 statId, bool32 certain) +static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 stats, s32 statValue, u32 statId, bool32 certain) { u32 currStat = 0; u32 changeableStatsCount = 1; // current stat is counted automatically @@ -10768,7 +10772,7 @@ static void Cmd_tryKO(void) enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); - u16 targetAbility = GetBattlerAbility(gBattlerTarget); + enum Ability targetAbility = GetBattlerAbility(gBattlerTarget); u32 rand = Random() % 100; u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); u32 endured = NOT_ENDURED; @@ -11700,7 +11704,7 @@ static void Cmd_healpartystatus(void) if (species != SPECIES_NONE && species != SPECIES_EGG) { - u16 ability; + enum Ability ability; bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i; bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner); @@ -12682,7 +12686,7 @@ static void Cmd_trycopyability(void) u32 battler = GetBattlerForBattleScript(cmd->battler); u32 partner = BATTLE_PARTNER(battler); - u16 defAbility = gBattleMons[gBattlerTarget].ability; + enum Ability defAbility = gBattleMons[gBattlerTarget].ability; bool32 shouldConsiderPartner = IsBattlerAlive(partner) && GetMoveEffect(gCurrentMove) == EFFECT_DOODLE; if (gBattleMons[battler].ability == defAbility @@ -12772,7 +12776,7 @@ static void Cmd_setgastroacid(void) static void Cmd_setyawn(void) { CMD_ARGS(const u8 *failInstr); - u32 ability = GetBattlerAbility(gBattlerTarget); + enum Ability ability = GetBattlerAbility(gBattlerTarget); enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (gBattleMons[gBattlerTarget].volatiles.yawn @@ -13056,6 +13060,8 @@ static void Cmd_switchoutabilities(void) ®enerate); MarkBattlerForControllerExec(battler); break; + default: + break; } } @@ -13084,8 +13090,9 @@ static void Cmd_pickup(void) CMD_ARGS(); u32 i, j; - u16 species, heldItem, ability; + u16 species, heldItem; u8 lvlDivBy10; + enum Ability ability; if (!InBattlePike()) // No items in Battle Pike. { @@ -14531,7 +14538,7 @@ static bool8 IsFinalStrikeEffect(enum BattleMoveEffects moveEffect) return FALSE; } -static bool32 CanAbilityPreventStatLoss(u32 abilityDef) +static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef) { switch (abilityDef) { @@ -14539,6 +14546,8 @@ static bool32 CanAbilityPreventStatLoss(u32 abilityDef) case ABILITY_FULL_METAL_BODY: case ABILITY_WHITE_SMOKE: return TRUE; + default: + break; } return FALSE; } @@ -14951,7 +14960,7 @@ void BS_JumpIfShellTrap(void) void BS_JumpIfElectricAbilityAffected(void) { - NATIVE_ARGS(u8 battler, u16 ability, const u8 *jumpInstr); + NATIVE_ARGS(u8 battler, enum Ability ability, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); if (IsElectricAbilityAffected(battler, cmd->ability)) @@ -15277,7 +15286,7 @@ void BS_TryUpperHand(void) { NATIVE_ARGS(const u8 *failInstr); - u32 abilityDef = GetBattlerAbility(gBattlerTarget); + enum Ability abilityDef = GetBattlerAbility(gBattlerTarget); u32 prio = GetChosenMovePriority(gBattlerTarget, abilityDef); if (HasBattlerActedThisTurn(gBattlerTarget) @@ -15689,7 +15698,7 @@ void BS_TryWindRiderPower(void) NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - u16 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (IsBattlerAlly(battler, gBattlerAttacker) && (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER)) { @@ -16229,7 +16238,7 @@ void BS_JumpIfIntimidateAbilityPrevented(void) NATIVE_ARGS(); u32 hasAbility = FALSE; - u32 ability = GetBattlerAbility(gBattlerTarget); + enum Ability ability = GetBattlerAbility(gBattlerTarget); switch (ability) { @@ -16306,7 +16315,7 @@ void BS_TryBoosterEnergy(void) if (GetBattlerHoldEffect(battlerByTurnOrder) != HOLD_EFFECT_BOOSTER_ENERGY) continue; - u32 ability = GetBattlerAbility(battlerByTurnOrder); + enum Ability ability = GetBattlerAbility(battlerByTurnOrder); if (!(ability == ABILITY_PROTOSYNTHESIS && cmd->onFieldStatus != ON_TERRAIN) && !(ability == ABILITY_QUARK_DRIVE && cmd->onFieldStatus != ON_WEATHER)) continue; @@ -16333,7 +16342,7 @@ void BS_TryActivateAbilityShield(void) { NATIVE_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); gBattlescriptCurrInstr = cmd->nextInstr; @@ -17689,7 +17698,7 @@ void BS_TryToClearPrimalWeather(void) for (u32 i = 0; i < gBattlersCount; i++) { - u32 ability = GetBattlerAbility(i); + enum Ability ability = GetBattlerAbility(i); if (((ability == ABILITY_DESOLATE_LAND && gBattleWeather & B_WEATHER_SUN_PRIMAL) || (ability == ABILITY_PRIMORDIAL_SEA && gBattleWeather & B_WEATHER_RAIN_PRIMAL) || (ability == ABILITY_DELTA_STREAM && gBattleWeather & B_WEATHER_STRONG_WINDS)) diff --git a/src/battle_tower.c b/src/battle_tower.c index 2d0cbbe11e..950ff10f5f 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1569,7 +1569,8 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 { u8 ball = (fmon->ball == 0xFF) ? Random() % POKEBALL_COUNT : fmon->ball; u16 move; - u32 personality = 0, ability, friendship, j; + u32 personality = 0, friendship, j; + enum Ability ability; if (fmon->gender == TRAINER_MON_MALE) { diff --git a/src/battle_util.c b/src/battle_util.c index f104d75bed..51d894f9d4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -67,7 +67,7 @@ static void SetRandomMultiHitCounter(); static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item); static bool32 CanBeInfinitelyConfused(u32 battler); static bool32 IsAnyTargetAffected(u32 battlerAtk); -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum FunctionCallOption option); +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option); static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option); // Submoves @@ -215,7 +215,7 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = // Helper function for actual dmg calcs during battle. For simulated AI dmg, CalcTypeEffectivenessMultiplier should be used directly // This should stay a static function. Ideally everything else is handled through CalcTypeEffectivenessMultiplier just like AI -static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, bool32 recordAbilities) +static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, bool32 recordAbilities) { struct DamageContext ctx = {0}; ctx.battlerAtk = battlerAtk; @@ -280,7 +280,7 @@ static u32 CalcBeatUpPower(void) return (GetSpeciesBaseAttack(species) / 10) + 5; } -static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, u32 abilityDef) +static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, enum Ability abilityDef) { if (!gSpecialStatuses[battlerDef].distortedTypeMatchups && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL @@ -305,7 +305,7 @@ static inline bool32 IsDragonDartsSecondHit(u32 effect) bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { - u32 ability = GetBattlerAbility(battlerAtk); + enum Ability ability = GetBattlerAbility(battlerAtk); enum BattleMoveEffects effect = GetMoveEffect(move); if (gSideTimers[defSide].followmeTimer == 0 @@ -332,7 +332,7 @@ bool32 HandleMoveTargetRedirection(void) u32 moveType = GetBattleMoveType(gCurrentMove); enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); u32 side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); - u32 ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]); + enum Ability ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]); if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove) && moveTarget == MOVE_TARGET_SELECTED @@ -348,7 +348,7 @@ bool32 HandleMoveTargetRedirection(void) || (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER))) { // Find first battler that redirects the move (in turn order) - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); u32 battler; for (battler = 0; battler < gBattlersCount; battler++) { @@ -369,7 +369,7 @@ bool32 HandleMoveTargetRedirection(void) } if (redirectorOrderNum != MAX_BATTLERS_COUNT && gCurrentMove != MOVE_TEATIME) { - u16 battlerAbility; + enum Ability battlerAbility; battler = gBattlerByTurnOrder[redirectorOrderNum]; battlerAbility = GetBattlerAbility(battler); RecordAbilityBattle(battler, battlerAbility); @@ -1071,7 +1071,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) // If the target can be confused, confuse them. // Don't use CanBeConfused, can cause issues in edge cases. - u32 ability = GetBattlerAbility(otherSkyDropper); + enum Ability ability = GetBattlerAbility(otherSkyDropper); if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0 || IsAbilityAndRecord(otherSkyDropper, ability, ABILITY_OWN_TEMPO) || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) @@ -1152,7 +1152,7 @@ bool32 WasUnableToUseMove(u32 battler) return FALSE; } -bool32 ShouldDefiantCompetitiveActivate(u32 battler, u32 ability) +bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability) { u32 side = GetBattlerSide(battler); if (ability != ABILITY_DEFIANT && ability != ABILITY_COMPETITIVE) @@ -1779,7 +1779,7 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp) } // Should always be the last check. Otherwise the ability might be wrongly recorded. -bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck) +bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck) { if (battlerAbility != abilityToCheck) return FALSE; @@ -2705,7 +2705,7 @@ static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -bool32 IsDazzlingAbility(u32 ability) +bool32 IsDazzlingAbility(enum Ability ability) { switch (ability) { @@ -2790,7 +2790,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) { if (GetMoveEffect(ctx->currentMove) == EFFECT_MULTI_HIT) { - u32 ability = ctx->ability[ctx->battlerAtk]; + enum Ability ability = ctx->ability[ctx->battlerAtk]; if (ability == ABILITY_SKILL_LINK) { @@ -2861,7 +2861,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) { u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); - u32 abilityAtk = ctx->ability[ctx->battlerAtk]; + enum Ability abilityAtk = ctx->ability[ctx->battlerAtk]; if (IsSpreadMove(moveTarget)) { @@ -2870,7 +2870,7 @@ static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) if (gBattleStruct->bouncedMoveIsUsed && !IsOnPlayerSide(battlerDef)) continue; - u32 abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityDef = GetBattlerAbility(battlerDef); if (ctx->battlerAtk == battlerDef || !IsBattlerAlive(battlerDef) @@ -3126,7 +3126,7 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility) { - u16 battlerAbility = GetBattlerAbility(battler); + enum Ability battlerAbility = GetBattlerAbility(battler); if (gBattleWeather & sBattleWeatherInfo[battleWeatherId].flag) { @@ -3334,7 +3334,7 @@ static void ChooseStatBoostAnimation(u32 battler) #undef ANIM_STAT_ACC #undef ANIM_STAT_EVASION -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option) +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option) { const u8 *battleScriptBlocksMove = NULL; @@ -3355,6 +3355,8 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; } break; + default: + break; } if (battleScriptBlocksMove == NULL) @@ -3409,7 +3411,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a return TRUE; } -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum FunctionCallOption option) +bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, u32 moveType, enum FunctionCallOption option) { enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; const u8 *battleScript = NULL; @@ -3584,7 +3586,7 @@ static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 ani return 0; } -u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg) +enum Ability AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) { u32 effect = 0; u32 moveType = 0, move = 0; @@ -4489,6 +4491,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + default: + break; } break; case ABILITYEFFECT_ENDTURN: @@ -4724,6 +4728,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gDisableStructs[battler].cudChew = TRUE; } break; + default: + break; } } break; @@ -4767,6 +4773,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + default: + break; } break; case ABILITYEFFECT_MOVE_END: // Think contact abilities. @@ -4991,7 +4999,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_EFFECT_SPORE: { - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); if ((!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) || B_POWDER_GRASS < GEN_6) && abilityAtk != ABILITY_OVERCOAT && GetBattlerHoldEffect(gBattlerAttacker) != HOLD_EFFECT_SAFETY_GOGGLES) @@ -5040,7 +5048,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { POISON_POINT: { - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -5062,7 +5070,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 { STATIC: { - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) @@ -5253,6 +5261,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + default: + break; } break; case ABILITYEFFECT_MOVE_END_ATTACKER: // Same as above, but for attacker @@ -5323,6 +5333,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + default: + break; } break; case ABILITYEFFECT_MOVE_END_OTHER: // Abilities that activate on *another* battler's moveend: Dancer, Soul-Heart, Receiver, Symbiosis @@ -5350,6 +5362,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + default: + break; } break; case ABILITYEFFECT_OPPORTUNIST: @@ -5369,6 +5383,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect = 1; } break; + default: + break; } break; case ABILITYEFFECT_IMMUNITY: @@ -5430,6 +5446,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 else if (gDisableStructs[battler].tauntTimer != 0) effect = 4; break; + default: + break; } if (effect != 0) @@ -5591,6 +5609,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + default: + break; } break; case ABILITYEFFECT_ON_TERRAIN: // For ability effects that activate when the field terrain changes. @@ -5620,6 +5640,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + default: + break; } break; } @@ -5657,7 +5679,7 @@ bool32 IsNeutralizingGasOnField(void) return FALSE; } -bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability) +bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability) { if (gBattleMons[battler].volatiles.gastroAcid) return FALSE; @@ -5674,7 +5696,7 @@ bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability) return FALSE; } -static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 ability, u32 hasAbilityShield, u32 ignoreMoldBreaker) +static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability, u32 hasAbilityShield, u32 ignoreMoldBreaker) { if (hasAbilityShield || ignoreMoldBreaker) return FALSE; @@ -5697,7 +5719,7 @@ u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler) return GetBattlerAbilityInternal(battler, TRUE, FALSE); } -u32 GetBattlerAbility(u32 battler) +enum Ability GetBattlerAbility(u32 battler) { return GetBattlerAbilityInternal(battler, FALSE, FALSE); } @@ -5735,7 +5757,7 @@ u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityS return gBattleMons[battler].ability; } -u32 IsAbilityOnSide(u32 battler, u32 ability) +u32 IsAbilityOnSide(u32 battler, enum Ability ability) { if (IsBattlerAlive(battler) && GetBattlerAbility(battler) == ability) return battler + 1; @@ -5745,12 +5767,12 @@ u32 IsAbilityOnSide(u32 battler, u32 ability) return 0; } -u32 IsAbilityOnOpposingSide(u32 battler, u32 ability) +u32 IsAbilityOnOpposingSide(u32 battler, enum Ability ability) { return IsAbilityOnSide(BATTLE_OPPOSITE(battler), ability); } -u32 IsAbilityOnField(u32 ability) +u32 IsAbilityOnField(enum Ability ability) { u32 i; @@ -5763,7 +5785,7 @@ u32 IsAbilityOnField(u32 ability) return 0; } -u32 IsAbilityOnFieldExcept(u32 battler, u32 ability) +u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability) { u32 i; @@ -5787,7 +5809,7 @@ u32 IsAbilityPreventingEscape(u32 battler) if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) continue; - u32 ability = GetBattlerAbility(battlerDef); + enum Ability ability = GetBattlerAbility(battlerDef); if (ability == ABILITY_SHADOW_TAG && (B_SHADOW_TAG_ESCAPE <= GEN_3 || GetBattlerAbility(battler) != ABILITY_SHADOW_TAG)) return battlerDef + 1; @@ -5839,7 +5861,7 @@ void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) gBattleMainFunc = RunBattleScriptCommands; } -bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, u32 terrainFlag) +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, u32 terrainFlag) { if (!(gFieldStatuses & terrainFlag)) return FALSE; @@ -5849,7 +5871,7 @@ bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect ho return IsBattlerGrounded(battler, ability, holdEffect); } -bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause) +bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause) { if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause != NOT_BLOCKED_BY_SLEEP_CLAUSE) return FALSE; @@ -5871,7 +5893,7 @@ bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClau return effect; } -bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef) +bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef) { if (CanSetNonVolatileStatus( battlerAtk, @@ -5885,7 +5907,7 @@ bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 ability } // TODO: check order of battlerAtk and battlerDef -bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { if (CanSetNonVolatileStatus( battlerAtk, @@ -5898,7 +5920,7 @@ bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return FALSE; } -bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { if (CanSetNonVolatileStatus( battlerAtk, @@ -5911,7 +5933,7 @@ bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return FALSE; } -bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { if (CanSetNonVolatileStatus( battlerAtk, @@ -5923,9 +5945,8 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return TRUE; return FALSE; } - // Unused, technically also redundant because it is just a copy of CanBeFrozen -bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) +bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) { if (CanSetNonVolatileStatus( battlerAtk, @@ -5938,7 +5959,7 @@ bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef) return FALSE; } -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffect effect, enum FunctionCallOption option) +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect effect, enum FunctionCallOption option) { const u8 *battleScript = NULL; u32 sideBattler = ABILITY_NONE; @@ -6103,7 +6124,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u return TRUE; } -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum FunctionCallOption option) +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option) { if (battleScript != NULL) { @@ -6149,7 +6170,7 @@ static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum Func bool32 CanBeConfused(u32 battler) { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (gBattleMons[battler].volatiles.confusionTurns > 0 || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) || IsAbilityAndRecord(battler, ability, ABILITY_OWN_TEMPO)) @@ -6251,7 +6272,7 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa } if (stat != NUM_STATS && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId)) { - u16 battlerAbility = GetBattlerAbility(battler); + enum Ability battlerAbility = GetBattlerAbility(battler); u32 savedAttacker = gBattlerAttacker; // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker gBattlerAttacker = gBattleScripting.battler = battler; @@ -6531,7 +6552,7 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) return effect; } -u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID) +u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID) { if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].volatiles.transformed) return ITEM_NO_EFFECT; @@ -7334,7 +7355,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) { case HOLD_EFFECT_FLINCH: { - u16 ability = GetBattlerAbility(gBattlerAttacker); + enum Ability ability = GetBattlerAbility(gBattlerAttacker); if (B_SERENE_GRACE_BOOST >= GEN_5 && ability == ABILITY_SERENE_GRACE) atkHoldEffectParam *= 2; if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) @@ -7571,7 +7592,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; case ITEMEFFECT_ORBS: { - u16 battlerAbility = GetBattlerAbility(battler); + enum Ability battlerAbility = GetBattlerAbility(battler); switch (battlerHoldEffect) { case HOLD_EFFECT_TOXIC_ORB: @@ -7712,7 +7733,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) } else { - u32 battlerAbilityOnField = 0; + enum Ability battlerAbilityOnField = 0; targetBattler = SetRandomTarget(gBattlerAttacker); if (moveType == TYPE_ELECTRIC && GetBattlerAbility(targetBattler) != ABILITY_LIGHTNING_ROD) @@ -7936,7 +7957,7 @@ u32 GetBattlerHoldEffectParam(u32 battler) return GetItemHoldEffectParam(gBattleMons[battler].item); } -bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move) +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move) { if (holdEffectAtk == HOLD_EFFECT_PROTECTIVE_PADS) { @@ -7947,7 +7968,7 @@ bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 ability return !IsMoveMakingContact(battlerAtk, battlerDef, abilityAtk, holdEffectAtk, move); } -bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move) +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move) { if (!(MoveMakesContact(move) || (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM && gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL))) @@ -8065,7 +8086,7 @@ enum IronBallCheck }; // Only called directly when calculating damage type effectiveness, and Iron Ball's type effectiveness mechanics -bool32 IsBattlerGroundedInverseCheck(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, enum InverseBattleCheck checkInverse) +bool32 IsBattlerGroundedInverseCheck(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, enum InverseBattleCheck checkInverse) { if (holdEffect == HOLD_EFFECT_IRON_BALL) return TRUE; @@ -8088,7 +8109,7 @@ bool32 IsBattlerGroundedInverseCheck(u32 battler, u32 ability, enum ItemHoldEffe return TRUE; } -bool32 IsBattlerGrounded(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) +bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect) { return IsBattlerGroundedInverseCheck(battler, ability, holdEffect, NOT_INVERSE_BATTLE); } @@ -8109,7 +8130,7 @@ u32 GetBattlerWeight(u32 battler) { u32 i; u32 weight = GetSpeciesWeight(gBattleMons[battler].species); - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (ability == ABILITY_HEAVY_METAL) @@ -8778,6 +8799,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) case ABILITY_SUPREME_OVERLORD: modifier = uq4_12_multiply(modifier, GetSupremeOverlordModifier(battlerAtk)); break; + default: + break; } // field abilities @@ -8806,6 +8829,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) if (moveType == TYPE_STEEL) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; + default: + break; } } @@ -8843,6 +8868,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); } break; + default: + break; } holdEffectParamAtk = GetBattlerHoldEffectParam(battlerAtk); @@ -9043,7 +9070,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_PLUS: if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) { - u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); + enum Ability partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); if (partnerAbility == ABILITY_MINUS || (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_PLUS)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); @@ -9052,7 +9079,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_MINUS: if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk))) { - u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); + enum Ability partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk)); if (partnerAbility == ABILITY_PLUS || (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_MINUS)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); @@ -9125,6 +9152,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; + default: + break; } // target's abilities @@ -9146,6 +9175,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) RecordAbilityBattle(battlerDef, ABILITY_PURIFYING_SALT); } break; + default: + break; } // ally's abilities @@ -9157,6 +9188,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; + default: + break; } } @@ -9314,6 +9347,8 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; + default: + break; } // ally's abilities @@ -9325,6 +9360,8 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), B_WEATHER_SUN) && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; + default: + break; } } @@ -9537,7 +9574,7 @@ static inline uq4_12_t GetCollisionCourseElectroDriftModifier(u32 move, uq4_12_t return UQ_4_12(1.0); } -static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, bool32 isCrit, u32 abilityAtk) +static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, bool32 isCrit, enum Ability abilityAtk) { switch (abilityAtk) { @@ -9553,6 +9590,8 @@ static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typ if (typeEffectivenessModifier <= UQ_4_12(0.5)) return UQ_4_12(2.0); break; + default: + break; } return UQ_4_12(1.0); } @@ -9607,6 +9646,8 @@ static inline uq4_12_t GetDefenderAbilitiesModifier(struct DamageContext *ctx) recordAbility = TRUE; } break; + default: + break; } if (recordAbility && ctx->updateFlags) @@ -9625,6 +9666,8 @@ static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef case ABILITY_FRIEND_GUARD: return UQ_4_12(0.75); break; + default: + break; } return UQ_4_12(1.0); } @@ -10135,7 +10178,7 @@ uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx) return modifier; } -uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef) +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef) { uq4_12_t modifier = UQ_4_12(1.0); u32 moveType = GetBattleMoveType(move); @@ -10179,7 +10222,7 @@ static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier) uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType) { uq4_12_t modifier = UQ_4_12(1.0); - u16 abilityDef = GetMonAbility(mon); + enum Ability abilityDef = GetMonAbility(mon); u16 speciesDef = GetMonData(mon, MON_DATA_SPECIES); u8 type1 = GetSpeciesType(speciesDef, 0); u8 type2 = GetSpeciesType(speciesDef, 1); @@ -10588,7 +10631,7 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method) if (restoreSpecies) { - u32 abilityForm = gBattleMons[battler].ability; + enum Ability abilityForm = gBattleMons[battler].ability; // Reverts the original species TryToSetBattleFormChangeMoves(&party[monId], method); u32 changedSpecies = GetBattlerPartyState(battler)->changedSpecies; @@ -10862,13 +10905,15 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler) if (!IsBattlerAlive(battlerDef)) continue; - u32 ability = GetBattlerAbility(battlerDef); + enum Ability ability = GetBattlerAbility(battlerDef); switch (ability) { case ABILITY_UNNERVE: case ABILITY_AS_ONE_ICE_RIDER: case ABILITY_AS_ONE_SHADOW_RIDER: return TRUE; + default: + break; } } @@ -11280,7 +11325,7 @@ void RemoveConfusionStatus(u32 battler) static bool32 CanBeInfinitelyConfused(u32 battler) { - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); if (ability == ABILITY_OWN_TEMPO || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) @@ -11310,7 +11355,7 @@ bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2) return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 == gender2); } -u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect) +u32 CalcSecondaryEffectChance(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect) { bool8 hasSereneGrace = (battlerAbility == ABILITY_SERENE_GRACE); bool8 hasRainbow = (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW) != 0; @@ -11327,7 +11372,7 @@ u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct Addi return secondaryEffectChance; } -bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect) +bool32 MoveEffectIsGuaranteed(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect) { return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100; } @@ -11574,7 +11619,7 @@ bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef) static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerDef, u32 moveType) { - u32 abilityDef = GetBattlerAbility(battlerDef); + enum Ability abilityDef = GetBattlerAbility(battlerDef); return CanAbilityBlockMove(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), abilityDef, gCurrentMove, CHECK_TRIGGER) || CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER); @@ -11663,7 +11708,7 @@ bool32 DoesDestinyBondFail(u32 battler) } // This check has always to be the last in a condtion statement because of the recording of AI data. -bool32 IsMoveEffectBlockedByTarget(u32 ability) +bool32 IsMoveEffectBlockedByTarget(enum Ability ability) { if (ability == ABILITY_SHIELD_DUST) { @@ -11709,12 +11754,14 @@ bool32 HasWeatherEffect(void) if (!IsBattlerAlive(battler)) continue; - u32 ability = GetBattlerAbility(battler); + enum Ability ability = GetBattlerAbility(battler); switch (ability) { case ABILITY_CLOUD_NINE: case ABILITY_AIR_LOCK: return FALSE; + default: + break; } } @@ -11741,8 +11788,8 @@ void UpdateStallMons(void) if (!IsDoubleBattle() || gMovesInfo[gCurrentMove].target == MOVE_TARGET_SELECTED) { u32 moveType = GetBattleMoveType(gCurrentMove); // Probably doesn't handle dynamic move types right now - u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - u32 abilityDef = GetBattlerAbility(gBattlerTarget); + enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); + enum Ability abilityDef = GetBattlerAbility(gBattlerTarget); if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER)) { gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; @@ -11960,10 +12007,10 @@ void RemoveHazardFromField(u32 side, enum Hazards hazardType) } } -bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option) +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option) { bool32 effect = FALSE; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; enum BattleMoveEffects moveEffect = GetMoveEffect(move); u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); @@ -12044,7 +12091,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u return effect; } -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect) +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect) { u32 calc, moveAcc; s8 buff, accStage, evasionStage; @@ -12096,6 +12143,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (IsBattleMovePhysical(move)) calc = (calc * 80) / 100; // 1.2 hustle loss break; + default: + break; } // Target's ability @@ -12113,6 +12162,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (gBattleMons[battlerDef].volatiles.confusionTurns) calc = (calc * 50) / 100; // 1.5 tangled feet loss break; + default: + break; } // Attacker's ally's ability @@ -12123,6 +12174,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u if (IsBattlerAlive(atkAlly)) calc = (calc * 110) / 100; // 1.1 ally's victory star boost break; + default: + break; } // Attacker's hold effect diff --git a/src/data/abilities.h b/src/data/abilities.h index f9a3adc96c..b3a65d564f 100644 --- a/src/data/abilities.h +++ b/src/data/abilities.h @@ -1,4 +1,4 @@ -const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = +const struct AbilityInfo gAbilitiesInfo[ABILITIES_COUNT] = { [ABILITY_NONE] = { diff --git a/src/data/battle_frontier/battle_pyramid_wild_requirements.h b/src/data/battle_frontier/battle_pyramid_wild_requirements.h index fd5695344a..635545b3a2 100644 --- a/src/data/battle_frontier/battle_pyramid_wild_requirements.h +++ b/src/data/battle_frontier/battle_pyramid_wild_requirements.h @@ -5,7 +5,7 @@ struct BattlePyramidRequirement { const u16 *moves; /* use moves instead of effects so we don't need to find moves with said effect in our loop */ - u16 abilities[10]; + enum Ability abilities[10]; u8 nAbilities; u8 type; u8 nMoves; diff --git a/src/daycare.c b/src/daycare.c index fdb98d6630..f645f3e5ab 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -741,10 +741,10 @@ static void InheritPokeball(struct Pokemon *egg, struct BoxPokemon *father, stru static void InheritAbility(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother) { - u16 fatherAbility = GetBoxMonData(father, MON_DATA_ABILITY_NUM); - u16 motherAbility = GetBoxMonData(mother, MON_DATA_ABILITY_NUM); + enum Ability fatherAbility = GetBoxMonData(father, MON_DATA_ABILITY_NUM); + enum Ability motherAbility = GetBoxMonData(mother, MON_DATA_ABILITY_NUM); u16 motherSpecies = GetBoxMonData(mother, MON_DATA_SPECIES); - u16 inheritAbility = motherAbility; + enum Ability inheritAbility = motherAbility; if (motherSpecies == SPECIES_DITTO) { diff --git a/src/debug.c b/src/debug.c index a14b0ebe53..205959863f 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2385,7 +2385,7 @@ static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId) } } -static void Debug_Display_Ability(u32 abilityId, u32 digit, u8 windowId)//(u32 natureId, u32 digit, u8 windowId) +static void Debug_Display_Ability(enum Ability abilityId, u32 digit, u8 windowId)//(u32 natureId, u32 digit, u8 windowId) { StringCopy(gStringVar2, gText_DigitIndicator[digit]); ConvertIntToDecimalStringN(gStringVar3, abilityId, STR_CONV_MODE_LEADING_ZEROS, 2); @@ -2424,7 +2424,7 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, 0); + enum Ability abilityId = GetAbilityBySpecies(sDebugMonData->species, 0); Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectAbility; @@ -2473,7 +2473,7 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) { i++; } - u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i); + enum Ability abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i); Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 545b7d75ea..57f83c2527 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -931,7 +931,7 @@ u8 GetEggCyclesToSubtract(void) { if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG)) { - u16 ability = GetMonAbility(&gPlayerParty[i]); + enum Ability ability = GetMonAbility(&gPlayerParty[i]); if (ability == ABILITY_MAGMA_ARMOR || ability == ABILITY_FLAME_BODY || ability == ABILITY_STEAM_ENGINE) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 84f810e95a..4ea82b8c05 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -5500,7 +5500,7 @@ static bool32 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, s { u32 multi; struct Pokemon *mon; - u32 ability; + enum Ability ability; if (DoesSpeciesHaveFormChangeMethod(OW_SPECIES(objectEvent), FORM_CHANGE_OVERWORLD_WEATHER) && OW_SPECIES(objectEvent) != (multi = GetOverworldWeatherSpecies(OW_SPECIES(objectEvent)))) { diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 55542a3588..8bee9c7644 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -2349,7 +2349,7 @@ static bool32 DoesFishingMinigameAllowCancel(void) static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void) { - u32 ability; + enum Ability ability; if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return FALSE; diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index 4344186a54..a5f45ab29e 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -140,7 +140,7 @@ bool32 SetUpFieldMove_Cut(void) s16 x, y; u8 i, j; u8 tileBehavior; - u16 userAbility; + enum Ability userAbility; bool8 cutTiles[CUT_NORMAL_AREA]; bool8 ret; diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 04eaa90310..850aac3cf4 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -360,9 +360,9 @@ struct PokemonStats u8 eggCycles; u16 expYield; u8 friendship; - u16 ability0; - u16 ability1; - u16 abilityHidden; + enum Ability ability0; + enum Ability ability1; + enum Ability abilityHidden; }; struct EvoScreenData @@ -5866,9 +5866,9 @@ static void PrintStatsScreen_Abilities(u8 taskId) { u8 abilities_x = 5; u8 abilities_y = 3; - u16 ability0; - u16 ability1; - u16 abilityHidden; + enum Ability ability0; + enum Ability ability1; + enum Ability abilityHidden; //Abilitie(s) diff --git a/src/pokemon.c b/src/pokemon.c index 84eb24fcd5..25f7cd5ed8 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3392,7 +3392,7 @@ u8 GetMonsStateToDoubles_2(void) return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON; } -u16 GetAbilityBySpecies(u16 species, u8 abilityNum) +enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum) { int i; @@ -3417,7 +3417,7 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum) return gLastUsedAbility; } -u16 GetMonAbility(struct Pokemon *mon) +enum Ability GetMonAbility(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); @@ -3533,7 +3533,7 @@ u32 GetSpeciesType(u16 species, u8 slot) return gSpeciesInfo[SanitizeSpeciesId(species)].types[slot]; } -u32 GetSpeciesAbility(u16 species, u8 slot) +enum Ability GetSpeciesAbility(u16 species, u8 slot) { return gSpeciesInfo[SanitizeSpeciesId(species)].abilities[slot]; } @@ -6062,7 +6062,7 @@ static s32 GetWildMonTableIdInAlteringCave(u16 species) static inline bool32 CanFirstMonBoostHeldItemRarity(void) { - u32 ability; + enum Ability ability; if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return FALSE; @@ -6594,7 +6594,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges u32 targetSpecies = species; const struct FormChange *formChanges = GetSpeciesFormChanges(species); u16 heldItem; - u32 ability; + enum Ability ability; if (formChanges != NULL) { diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 1f69af7e96..a9aa85efc1 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3466,13 +3466,13 @@ static void PrintMonOTID(void) static void PrintMonAbilityName(void) { - u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); + enum Ability ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilitiesInfo[ability].name, 0, 1, 0, 1); } static void PrintMonAbilityDescription(void) { - u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); + enum Ability ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum); PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilitiesInfo[ability].description, 0, 17, 0, 0); } diff --git a/src/rom_header_rhh.c b/src/rom_header_rhh.c index 9a97948e8a..3a88a2c413 100644 --- a/src/rom_header_rhh.c +++ b/src/rom_header_rhh.c @@ -21,7 +21,7 @@ struct RHHRomHeader /*0x0A*/ u16 movesCount; /*0x0C*/ u16 numSpecies; /*0x0E*/ u16 abilitiesCount; - /*0x10*/ const struct Ability *abilities; + /*0x10*/ const struct AbilityInfo *abilities; /*0x14*/ u16 itemsCount; /*0x16*/ u8 itemNameLength; /*0x17*/ u8 padding; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 0ace7499a4..9161797d25 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -49,9 +49,9 @@ static void ApplyFluteEncounterRateMod(u32 *encRate); static void ApplyCleanseTagEncounterRateMod(u32 *encRate); static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 species, enum WildPokemonArea area); #ifdef BUGFIX -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size); +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex, u32 size); #else -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex); +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex); #endif static bool8 IsAbilityAllowingEncounter(u8 level); @@ -350,7 +350,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon, u8 wildMonIn // check ability for max level mon if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { - u16 ability = GetMonAbility(&gPlayerParty[0]); + enum Ability ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE) { if (Random() % 2 == 0) @@ -634,7 +634,7 @@ static bool8 WildEncounterCheck(u32 encounterRate, bool8 ignoreAbility) encounterRate *= 2; if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { - u32 ability = GetMonAbility(&gPlayerParty[0]); + enum Ability ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_STENCH && gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) encounterRate = encounterRate * 3 / 4; @@ -1123,7 +1123,7 @@ static bool8 IsWildLevelAllowedByRepel(u8 wildLevel) static bool8 IsAbilityAllowingEncounter(u8 level) { - u16 ability; + enum Ability ability; if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return TRUE; @@ -1193,9 +1193,9 @@ static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 } #ifdef BUGFIX -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size) +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex, u32 size) #else -static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex) +static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex) #endif { if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) diff --git a/test/battle/ability/adaptability.c b/test/battle/ability/adaptability.c index 4c1c8439b7..876dac212c 100644 --- a/test/battle/ability/adaptability.c +++ b/test/battle/ability/adaptability.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Adaptability increases same-type attack bonus from x1.5 to x2", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_HYPER_CUTTER; } PARAMETRIZE { ability = ABILITY_ADAPTABILITY; } GIVEN { diff --git a/test/battle/ability/battle_armor.c b/test/battle/ability/battle_armor.c index b5e28c5a0d..abf7396f60 100644 --- a/test/battle/ability/battle_armor.c +++ b/test/battle/ability/battle_armor.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Battle Armor and Shell Armor block critical hits") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } diff --git a/test/battle/ability/clear_body.c b/test/battle/ability/clear_body.c index 46185791a3..f5b9573fe0 100644 --- a/test/battle/ability/clear_body.c +++ b/test/battle/ability/clear_body.c @@ -5,7 +5,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid { s16 turnOneHit; s16 turnTwoHit; - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -40,7 +41,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat stage reduction from moves") { u16 move = MOVE_NONE; - u32 j, species = SPECIES_NONE, ability = ABILITY_NONE; + u32 j, species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; static const u16 statReductionMoves[] = { MOVE_GROWL, MOVE_LEER, @@ -86,7 +88,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat st SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky Web effect on switchin") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } @@ -114,7 +117,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent stat stage reduction from moves used by the user") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } @@ -137,8 +141,9 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent s SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and White Smoke, but not Full Metal Body") { - u32 j, k, species = SPECIES_NONE, ability = ABILITY_NONE; - u16 breakerAbility = ABILITY_NONE; + u32 j, k, species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; + enum Ability breakerAbility = ABILITY_NONE; u16 move = ABILITY_NONE; static const u16 breakerAbilities[] = { ABILITY_MOLD_BREAKER, @@ -197,7 +202,8 @@ SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Speed reduction from Iron Ball") { - u32 j, species = SPECIES_NONE, ability = ABILITY_NONE; + u32 j, species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; u16 heldItem = ITEM_NONE; static const u16 heldItems[] = { ITEM_NONE, @@ -239,7 +245,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Speed reduction from paralysis") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -276,7 +283,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Attack reduction from burn", s16 damage) { bool32 burned = FALSE; - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; burned = FALSE; } PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; burned = TRUE; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; burned = FALSE; } @@ -299,7 +307,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent A SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent receiving negative stat changes from Baton Pass") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -329,7 +338,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent r SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Topsy-Turvy") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -370,7 +380,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent T SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Spectral Thief from resetting positive stat changes") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } @@ -417,7 +428,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke protect from Pr { u32 move = MOVE_NONE; u32 species = SPECIES_NONE; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; static const u32 moves[] = { MOVE_SPIKY_SHIELD, diff --git a/test/battle/ability/cloud_nine.c b/test/battle/ability/cloud_nine.c index 613ea86e0a..a4eddd1e1c 100644 --- a/test/battle/ability/cloud_nine.c +++ b/test/battle/ability/cloud_nine.c @@ -3,7 +3,8 @@ SINGLE_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Sandstorm") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { diff --git a/test/battle/ability/contrary.c b/test/battle/ability/contrary.c index c69360a1e1..0c6eba7d18 100644 --- a/test/battle/ability/contrary.c +++ b/test/battle/ability/contrary.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", s16 damageLeft, s16 damageRight) { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_CONTRARY; abilityRight = ABILITY_CONTRARY; } PARAMETRIZE { abilityLeft = ABILITY_TANGLED_FEET; abilityRight = ABILITY_TANGLED_FEET; } @@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normally lower them: Overheat", s16 damageBefore, s16 damageAfter) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normall SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normally raise it: Swords Dance", s16 damageBefore, s16 damageAfter) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normal SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normally lower it: Growl", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { @@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normal SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normally raise it: Belly Drum", s16 damageBefore, s16 damageAfter) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { diff --git a/test/battle/ability/curious_medicine.c b/test/battle/ability/curious_medicine.c index 3844170eb0..7c3e200c7a 100644 --- a/test/battle/ability/curious_medicine.c +++ b/test/battle/ability/curious_medicine.c @@ -3,7 +3,7 @@ DOUBLE_BATTLE_TEST("Curious Medicine resets ally's stat stages upon entering battle") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CURIOUS_MEDICINE; } PARAMETRIZE { ability = ABILITY_OWN_TEMPO; } diff --git a/test/battle/ability/dazzling.c b/test/battle/ability/dazzling.c index 19cd3db0e1..ea7b2ba1b8 100644 --- a/test/battle/ability/dazzling.c +++ b/test/battle/ability/dazzling.c @@ -9,7 +9,8 @@ ASSUMPTIONS DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user from priority moves") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -31,7 +32,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user fr DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect users partner from priority moves") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -53,7 +55,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect users partn DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail don't protect the user from negative priority") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -74,7 +77,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail don't protect the u SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect from all multi hit hits with one activation") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 3102980378..517077dc68 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -3,7 +3,7 @@ DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate") { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; } @@ -61,7 +61,7 @@ DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate") // Same as above, but for opponent. DOUBLE_BATTLE_TEST("Defiant sharply raises opponent's Attack after Intimidate") { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; } diff --git a/test/battle/ability/download.c b/test/battle/ability/download.c index 7219e32329..f275b7c262 100644 --- a/test/battle/ability/download.c +++ b/test/battle/ability/download.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def" SINGLE_BATTLE_TEST("Download raises Sp.Attack if enemy has lower Sp. Def than Def", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Download raises Sp.Attack if enemy has lower Sp. Def than De SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet", s16 damagePhysical, s16 damageSpecial) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet DOUBLE_BATTLE_TEST("Download raises Sp.Attack if enemies have lower total Sp. Def than Def", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { diff --git a/test/battle/ability/dragons_maw.c b/test/battle/ability/dragons_maw.c index 64280cfb5a..950cb1db0f 100644 --- a/test/battle/ability/dragons_maw.c +++ b/test/battle/ability/dragons_maw.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Dragon's Maw increases Dragon-type move damage", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_DRAGONS_MAW; } diff --git a/test/battle/ability/drizzle.c b/test/battle/ability/drizzle.c index ce0fc9514b..fd56704830 100644 --- a/test/battle/ability/drizzle.c +++ b/test/battle/ability/drizzle.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Drizzle summons rain", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_DRIZZLE; } PARAMETRIZE { ability = ABILITY_DAMP; } diff --git a/test/battle/ability/dry_skin.c b/test/battle/ability/dry_skin.c index 097251565f..aab5658618 100644 --- a/test/battle/ability/dry_skin.c +++ b/test/battle/ability/dry_skin.c @@ -35,7 +35,7 @@ TO_DO_BATTLE_TEST("Dry Skin doesn't heal in Rain if Cloud Nine/Air Lock is on th SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_EFFECT_SPORE; } PARAMETRIZE { ability = ABILITY_DRY_SKIN; } GIVEN { diff --git a/test/battle/ability/embody_aspect.c b/test/battle/ability/embody_aspect.c index fffc8cf423..e7ac53a9e8 100644 --- a/test/battle/ability/embody_aspect.c +++ b/test/battle/ability/embody_aspect.c @@ -4,7 +4,8 @@ SINGLE_BATTLE_TEST("Embody Aspect raises a stat depending on the users form by one stage") { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_OGERPON_TEAL_TERA; ability = ABILITY_EMBODY_ASPECT_TEAL_MASK; } PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME_TERA; ability = ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK; } diff --git a/test/battle/ability/filter.c b/test/battle/ability/filter.c index c9a742c48d..30662fe031 100644 --- a/test/battle/ability/filter.c +++ b/test/battle/ability/filter.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Filter reduces damage to Super Effective moves by 0.75", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SOUNDPROOF; } PARAMETRIZE { ability = ABILITY_FILTER; } GIVEN { diff --git a/test/battle/ability/flower_gift.c b/test/battle/ability/flower_gift.c index 8f897e4668..da6dbc16b2 100644 --- a/test/battle/ability/flower_gift.c +++ b/test/battle/ability/flower_gift.c @@ -65,7 +65,8 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when its abili SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal under Cloud Nine/Air Lock") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { diff --git a/test/battle/ability/fluffy.c b/test/battle/ability/fluffy.c index 6525c73212..68afbd8993 100644 --- a/test/battle/ability/fluffy.c +++ b/test/battle/ability/fluffy.c @@ -12,7 +12,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct conta SINGLE_BATTLE_TEST("Fluffy doubles damage taken from fire type moves", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Fluffy doubles damage taken from fire type moves", s16 damag SINGLE_BATTLE_TEST("Fluffy does not alter damage of fire-type moves that make direct contact", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Fluffy does not alter damage of fire-type moves that make di SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact even if protected by Protective Pads", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { @@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct conta SINGLE_BATTLE_TEST("Fluffy does not halve damage taken from moves that make direct contact but are ignored by Punching Glove", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { diff --git a/test/battle/ability/forecast.c b/test/battle/ability/forecast.c index c462a3a634..764c5bd98e 100644 --- a/test/battle/ability/forecast.c +++ b/test/battle/ability/forecast.c @@ -157,7 +157,8 @@ DOUBLE_BATTLE_TEST("Forecast transforms all Castforms present in weather") SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an ability") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_KYOGRE; ability = ABILITY_DRIZZLE; } PARAMETRIZE { species = SPECIES_GROUDON; ability = ABILITY_DROUGHT; } PARAMETRIZE { species = SPECIES_ABOMASNOW; ability = ABILITY_SNOW_WARNING; } @@ -183,13 +184,16 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an ability") case ABILITY_SNOW_WARNING: EXPECT_EQ(player->species, SPECIES_CASTFORM_SNOWY); break; + default: + break; } } } SINGLE_BATTLE_TEST("Forecast transforms Castform in primal weather") { - u32 species, item, ability; + u32 species, item; + enum Ability ability; PARAMETRIZE { species = SPECIES_KYOGRE; ability = ABILITY_PRIMORDIAL_SEA; item = ITEM_BLUE_ORB; } PARAMETRIZE { species = SPECIES_GROUDON; ability = ABILITY_DESOLATE_LAND; item = ITEM_RED_ORB; } GIVEN { @@ -212,6 +216,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in primal weather") case ABILITY_PRIMORDIAL_SEA: EXPECT_EQ(player->species, SPECIES_CASTFORM_RAINY); break; + default: + break; } } } @@ -266,7 +272,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal when Sandstorm i SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal under Cloud Nine/Air Lock") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { @@ -400,7 +407,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back when it uses a move that f SINGLE_BATTLE_TEST("Forecast transforms Castform when Cloud Nine ability user leaves the field") { - u32 species = 0, ability = 0; + u32 species = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index e6569aedaf..01add35fd3 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -44,7 +44,8 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage) { - u32 ability, genConfig; + enum Ability ability; + u32 genConfig; PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_6; } PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_7; } @@ -68,7 +69,8 @@ SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 3 SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_GALVANIZE; } @@ -96,7 +98,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Galvanize doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_GALVANIZE; } GIVEN { diff --git a/test/battle/ability/grim_neigh.c b/test/battle/ability/grim_neigh.c index 69d60db93e..bb212e589b 100644 --- a/test/battle/ability/grim_neigh.c +++ b/test/battle/ability/grim_neigh.c @@ -3,7 +3,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly causing a Pokemon to faint") { - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { @@ -33,7 +34,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon") { - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { @@ -70,7 +72,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect dam DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move that causes another Pokemon to faint") { s16 damage[2]; - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = 0; PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } diff --git a/test/battle/ability/guard_dog.c b/test/battle/ability/guard_dog.c index 4327140d68..b8ebbafbad 100644 --- a/test/battle/ability/guard_dog.c +++ b/test/battle/ability/guard_dog.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Guard Dog raises Attack when intimidated", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INTIMIDATE; } PARAMETRIZE { ability = ABILITY_SHED_SKIN; } GIVEN { diff --git a/test/battle/ability/gulp_missile.c b/test/battle/ability/gulp_missile.c index fe1bc718fd..f6c102a48b 100644 --- a/test/battle/ability/gulp_missile.c +++ b/test/battle/ability/gulp_missile.c @@ -137,7 +137,8 @@ SINGLE_BATTLE_TEST("(Gulp Missile) triggers even if the user is fainted by oppos SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense but is prevented by stat reduction preventing abilities") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_METAGROSS; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { species = SPECIES_CORVIKNIGHT; ability = ABILITY_MIRROR_ARMOR; } PARAMETRIZE { species = SPECIES_CHATOT; ability = ABILITY_BIG_PECKS; } @@ -163,7 +164,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense and still triggers other effects after") { // Make sure attacker and target are correct after triggering the ability - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INFILTRATOR; } PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } GIVEN { diff --git a/test/battle/ability/ice_scales.c b/test/battle/ability/ice_scales.c index 0d49bb4996..ea96f64961 100644 --- a/test/battle/ability/ice_scales.c +++ b/test/battle/ability/ice_scales.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Ice Scales halves the damage from special moves", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_PSYCHIC; } PARAMETRIZE { ability = ABILITY_ICE_SCALES; move = MOVE_PSYCHIC; } PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_PSYSHOCK; } diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index c7308bfdaf..bdd521d782 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch out", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INTIMIDATE; } PARAMETRIZE { ability = ABILITY_SHED_SKIN; } GIVEN { @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch ou SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after KO", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INTIMIDATE; } PARAMETRIZE { ability = ABILITY_SHED_SKIN; } GIVEN { diff --git a/test/battle/ability/keen_eye.c b/test/battle/ability/keen_eye.c index ee10c446fb..4e645a2183 100644 --- a/test/battle/ability/keen_eye.c +++ b/test/battle/ability/keen_eye.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stage reduction from moves") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stag SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasion stat") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } @@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold Breaker abilities") { - u16 abilityPlayer = ABILITY_NONE, abilityOpponent = ABILITY_NONE; + enum Ability abilityPlayer = ABILITY_NONE, abilityOpponent = ABILITY_NONE; u16 speciesPlayer = SPECIES_NONE, speciesOpponent = SPECIES_NONE; u32 j; @@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-Turvy") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } @@ -137,7 +137,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receiving negative Attack stage changes from Baton Pass") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; } @@ -170,7 +170,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief from resetting positive accuracy stage changes") { - u16 ability; + enum Ability ability; u32 species; PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; } diff --git a/test/battle/ability/levitate.c b/test/battle/ability/levitate.c index 348d347f3b..51ac0dca2c 100644 --- a/test/battle/ability/levitate.c +++ b/test/battle/ability/levitate.c @@ -92,7 +92,7 @@ DOUBLE_BATTLE_TEST("Levitate does not cause single remaining target to take high AI_SINGLE_BATTLE_TEST("Levitate is seen correctly by switch AI") { - u32 ability = ABILITY_NONE, item = ITEM_NONE; + enum Ability ability = ABILITY_NONE, item = ITEM_NONE; PARAMETRIZE { ability = ABILITY_OWN_TEMPO, item = ITEM_NONE ; } PARAMETRIZE { ability = ABILITY_MOLD_BREAKER, item = ITEM_NONE ; } diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index 2c89702911..3af8cc102f 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Strength Sap users to lose HP instead of */ SINGLE_BATTLE_TEST("Liquid Ooze causes leech seed victim to faint before seeder") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { ability = ABILITY_LIQUID_OOZE; } GIVEN { diff --git a/test/battle/ability/minds_eye.c b/test/battle/ability/minds_eye.c index 3772a9df1d..4ac339d899 100644 --- a/test/battle/ability/minds_eye.c +++ b/test/battle/ability/minds_eye.c @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Mind's Eye doesn't bypass a Ghost-type's Wonder Guard") AI_SINGLE_BATTLE_TEST("AI doesn't use accuracy-lowering moves if it knows that the foe has Mind's Eye") { - u32 abilityAI = ABILITY_NONE; + enum Ability abilityAI = ABILITY_NONE; PARAMETRIZE { abilityAI = ABILITY_SWIFT_SWIM; } PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; } diff --git a/test/battle/ability/moxie.c b/test/battle/ability/moxie.c index 1dda9f7926..01eb51b9e7 100644 --- a/test/battle/ability/moxie.c +++ b/test/battle/ability/moxie.c @@ -3,7 +3,8 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after directly causing a Pokemon to faint") { - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } @@ -36,7 +37,8 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon") { - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } @@ -73,7 +75,8 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to in SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximum Attack stage") { - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } @@ -111,7 +114,8 @@ SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximu DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the same move that causes another Pokemon to faint") { s16 damage[2]; - u32 species = 0, ability = 0, abilityPopUp = 0; + u32 species = 0, abilityPopUp = 0; + enum Ability ability = ABILITY_NONE; PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; } PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } diff --git a/test/battle/ability/mummy.c b/test/battle/ability/mummy.c index f03e453e5c..990fba7a0d 100644 --- a/test/battle/ability/mummy.c +++ b/test/battle/ability/mummy.c @@ -3,7 +3,8 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on contact") { - u32 move, ability, species; + u32 move, species; + enum Ability ability; PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_MUMMY; species = SPECIES_YAMASK; } PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_MUMMY; species = SPECIES_YAMASK;} @@ -37,7 +38,7 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on cont SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other") { - u32 ability1, species1, ability2, species2; + enum Ability ability1, species1, ability2, species2; PARAMETRIZE { ability1 = ability2 = ABILITY_MUMMY; species1 = species2 = SPECIES_YAMASK; } PARAMETRIZE { ability1 = ABILITY_MUMMY; species1 = SPECIES_YAMASK; ability2 = ABILITY_LINGERING_AROMA; species2 = SPECIES_OINKOLOGNE; } @@ -66,7 +67,8 @@ SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other") SINGLE_BATTLE_TEST("Mummy doesn't replace abilities that can't be suppressed") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } diff --git a/test/battle/ability/neuroforce.c b/test/battle/ability/neuroforce.c index bd581b9b7d..32f3e91e56 100644 --- a/test/battle/ability/neuroforce.c +++ b/test/battle/ability/neuroforce.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Neuroforce increases the strength of super-effective moves by 25%", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_SHADOW_BALL; } PARAMETRIZE { ability = ABILITY_KLUTZ; move = MOVE_SHADOW_BALL; } PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_SCRATCH; } diff --git a/test/battle/ability/neutralizing_gas.c b/test/battle/ability/neutralizing_gas.c index f83e928c4a..2bf9cd1844 100644 --- a/test/battle/ability/neutralizing_gas.c +++ b/test/battle/ability/neutralizing_gas.c @@ -83,7 +83,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas ignores all battlers' ability effects") SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from attacker's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { @@ -102,7 +102,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from attacker's ability SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { @@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ability", DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ally's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { @@ -142,7 +142,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ally's ab DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from ally's ability", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { diff --git a/test/battle/ability/normalize.c b/test/battle/ability/normalize.c index 23ecbee592..79f41d2040 100644 --- a/test/battle/ability/normalize.c +++ b/test/battle/ability/normalize.c @@ -11,7 +11,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move") SINGLE_BATTLE_TEST("Normalize affects status moves") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { @@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Normalize affects status moves") SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage to Water-type Pokémon", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage t SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (< Gen7)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } @@ -101,7 +101,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (< SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } @@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Gen7)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } @@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Ge SINGLE_BATTLE_TEST("Normalize boosts power of affected moves by 20% (Gen7+)", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } @@ -184,7 +184,8 @@ SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Delu SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_NORMALIZE; } @@ -212,7 +213,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Normalize doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { diff --git a/test/battle/ability/opportunist.c b/test/battle/ability/opportunist.c index 8695f2d00e..6e5b13dd31 100644 --- a/test/battle/ability/opportunist.c +++ b/test/battle/ability/opportunist.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a turn", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_FRISK; } PARAMETRIZE { ability = ABILITY_OPPORTUNIST; } GIVEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a tur DOUBLE_BATTLE_TEST("Opportunist raises Attack only once when partner has Intimidate against Contrary foe in a double battle", s16 damageLeft, s16 damageRight) { - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { abilityLeft = ABILITY_CONTRARY; abilityRight = ABILITY_CONTRARY; } PARAMETRIZE { abilityLeft = ABILITY_TANGLED_FEET; abilityRight = ABILITY_TANGLED_FEET; } diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index 6c516c7ffc..c684963f0d 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -105,7 +105,8 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod/Storm Drain mons") { - u16 move, species, ability, type; + u16 move, species, type; + enum Ability ability; PARAMETRIZE { move = MOVE_THUNDERBOLT; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; type = TYPE_ELECTRIC; } PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; } GIVEN { diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c index 7e0d98f519..faa9b35734 100644 --- a/test/battle/ability/pixilate.c +++ b/test/battle/ability/pixilate.c @@ -23,7 +23,8 @@ SINGLE_BATTLE_TEST("Pixilate turns a Normal-type move into a Fairy-type move") SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage) { - u32 ability, genConfig; + enum Ability ability; + u32 genConfig; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; } PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_7; } @@ -47,7 +48,8 @@ SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30 SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_PIXILATE; } @@ -75,7 +77,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Pixilate doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { ability = ABILITY_PIXILATE; } GIVEN { diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index e927c2d94f..32627c59ff 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -197,7 +197,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves can still be bounced back by Dark-t SINGLE_BATTLE_TEST("Prankster-affected moves which are reflected by Magic Coat can affect Dark-type Pokémon, unless the Pokémon that bounced the move also has Prankster") { - u16 sableyeAbility; + enum Ability sableyeAbility; PARAMETRIZE { sableyeAbility = ABILITY_PRANKSTER; } PARAMETRIZE { sableyeAbility = ABILITY_KEEN_EYE; } diff --git a/test/battle/ability/prism_armor.c b/test/battle/ability/prism_armor.c index 60c8e238cf..bdd93d127a 100644 --- a/test/battle/ability/prism_armor.c +++ b/test/battle/ability/prism_armor.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Prism Armor reduces damage to Super Effective moves by 0.75", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } GIVEN { diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index 6fd271acb2..c45f416024 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -184,7 +184,8 @@ SINGLE_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an SINGLE_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index 23f097e8aa..80dc786117 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } GIVEN { @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 dam SINGLE_BATTLE_TEST("Purifying Salt halves damage from dynamic Ghost-type moves", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; } GIVEN { diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c index c5e7f5687a..7183267806 100644 --- a/test/battle/ability/refrigerate.c +++ b/test/battle/ability/refrigerate.c @@ -22,7 +22,8 @@ SINGLE_BATTLE_TEST("Refrigerate turns a Normal-type move into a Ice-type move") SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage) { - u32 ability, genConfig; + enum Ability ability; + u32 genConfig; PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_7; } PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_6; } PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_7; } @@ -46,7 +47,8 @@ SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage) { - u16 move, ability; + u16 move; + enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_REFRIGERATE; } @@ -74,7 +76,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Refrigerate doesn't affect Natural Gift's type") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { ability = ABILITY_REFRIGERATE; } GIVEN { diff --git a/test/battle/ability/rivalry.c b/test/battle/ability/rivalry.c index aef7361af5..fbb4ba4530 100644 --- a/test/battle/ability/rivalry.c +++ b/test/battle/ability/rivalry.c @@ -10,7 +10,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Rivalry increases power by x1.25 towards Pokémon of the same gender", s16 damage) { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; } PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } @@ -32,7 +33,8 @@ SINGLE_BATTLE_TEST("Rivalry increases power by x1.25 towards Pokémon of the sam SINGLE_BATTLE_TEST("Rivalry decreases power by x0.75 towards Pokémon of different gender", s16 damage) { - u16 species1, species2, ability; + u16 species1, species2; + enum Ability ability; PARAMETRIZE { species1 = SPECIES_NIDOKING; species2 = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species1 = SPECIES_NIDOKING; species2 = SPECIES_NIDOQUEEN; ability = ABILITY_RIVALRY; } PARAMETRIZE { species1 = SPECIES_NIDOQUEEN; species2 = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } @@ -54,7 +56,8 @@ SINGLE_BATTLE_TEST("Rivalry decreases power by x0.75 towards Pokémon of differe SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless", s16 damage) { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; } PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } @@ -78,7 +81,8 @@ SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless", SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the target is genderless", s16 damage) { - u16 species, ability; + u16 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; } PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; } PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; } diff --git a/test/battle/ability/rocky_payload.c b/test/battle/ability/rocky_payload.c index a185efb4f9..d688e5c87e 100644 --- a/test/battle/ability/rocky_payload.c +++ b/test/battle/ability/rocky_payload.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Rocky Payload increases Rock-type move damage", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_BIG_PECKS; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_ROCKY_PAYLOAD; } diff --git a/test/battle/ability/sharpness.c b/test/battle/ability/sharpness.c index 38ed79f86f..10374faf5b 100644 --- a/test/battle/ability/sharpness.c +++ b/test/battle/ability/sharpness.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Sharpness increases the power of slicing moves", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_SHARPNESS; } PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_STEADFAST; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_SHARPNESS; } diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index 50f814f0e2..1f861937a2 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Sheer Force doesn't boost Magnitude", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Magnitude", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Eruption", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Eruption", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Water Spout", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Water Spout", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Psywave", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -95,7 +95,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Psywave", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Round", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -112,7 +112,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Round", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Gyro Ball", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -129,7 +129,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Gyro Ball", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Electro Ball", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -146,7 +146,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Electro Ball", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Dragon Energy", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -163,7 +163,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Dragon Energy", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Belch", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -180,7 +180,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Belch", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Shell Trap", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -197,7 +197,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Shell Trap", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Burn Up", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ZEN_MODE; } GIVEN { @@ -231,7 +231,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Double Shock", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Steel Roller", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -248,7 +248,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Steel Roller", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Synchronoise", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -299,7 +299,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Hyperspace Fury", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Bolt Beak", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -316,7 +316,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Bolt Beak", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Fishious Rend", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -333,7 +333,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Fishious Rend", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { @@ -350,7 +350,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Payback", s16 damage) { - u16 ability = 0; + enum Ability ability = 0; PARAMETRIZE { ability = ABILITY_SHEER_FORCE; } PARAMETRIZE { ability = ABILITY_ANGER_POINT; } GIVEN { diff --git a/test/battle/ability/solid_rock.c b/test/battle/ability/solid_rock.c index b3dea4ae5e..56c01e255d 100644 --- a/test/battle/ability/solid_rock.c +++ b/test/battle/ability/solid_rock.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Solid Rock reduces damage to Super Effective moves by 0.75", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STURDY; } PARAMETRIZE { ability = ABILITY_SOLID_ROCK; } GIVEN { diff --git a/test/battle/ability/stalwart.c b/test/battle/ability/stalwart.c index 22debe74cd..6bebe17cb6 100644 --- a/test/battle/ability/stalwart.c +++ b/test/battle/ability/stalwart.c @@ -20,7 +20,8 @@ DOUBLE_BATTLE_TEST("Stalwart ignores redirection from Follow-Me") DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirecting moves") { - u32 ability, species; + enum Ability ability; + u32 species; PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; } PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; } GIVEN { diff --git a/test/battle/ability/stamina.c b/test/battle/ability/stamina.c index e9823b7068..39113fd15a 100644 --- a/test/battle/ability/stamina.c +++ b/test/battle/ability/stamina.c @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Stamina raises Defense by 1 when hit by a move") DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the ability when hit by a multi target move") { - u16 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_STAMINA; } PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_NONE; } diff --git a/test/battle/ability/steelworker.c b/test/battle/ability/steelworker.c index eaf36165f6..b4fa720cdc 100644 --- a/test/battle/ability/steelworker.c +++ b/test/battle/ability/steelworker.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Steelworker increases Steel-type move damage", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_STEELWORKER; } diff --git a/test/battle/ability/trace.c b/test/battle/ability/trace.c index 6dbd9bda26..71d5035084 100644 --- a/test/battle/ability/trace.c +++ b/test/battle/ability/trace.c @@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Trace copies opponents ability on switch-in even if opponent DOUBLE_BATTLE_TEST("Trace copies opponents ability randomly") { - u16 ability1, ability2; + enum Ability ability1, ability2; PARAMETRIZE { ability1 = ABILITY_SPEED_BOOST; ability2 = ABILITY_BLAZE;} PARAMETRIZE { ability1 = ABILITY_BLAZE; ability2 = ABILITY_SPEED_BOOST; } diff --git a/test/battle/ability/transistor.c b/test/battle/ability/transistor.c index 8b8f098d52..e57043a5c2 100644 --- a/test/battle/ability/transistor.c +++ b/test/battle/ability/transistor.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack", s16 damage) { u32 move; - u16 ability; + enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_TRANSISTOR; } @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack", SINGLE_BATTLE_TEST("Transistor is blocked by neutralizing gas", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; } PARAMETRIZE { ability = ABILITY_LEVITATE; } diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c index 9a8972eb5c..8bbc9f924a 100644 --- a/test/battle/ability/unnerve.c +++ b/test/battle/ability/unnerve.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own berries") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own ber SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural Gift") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural SINGLE_BATTLE_TEST("Unnerve prints the correct string (player)") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Unnerve prints the correct string (player)") SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)") SINGLE_BATTLE_TEST("Unnerve activates only once per switch-in") { u16 mon; - u16 ability; + enum Ability ability; PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } GIVEN { diff --git a/test/battle/ability/water_compaction.c b/test/battle/ability/water_compaction.c index e4e32e2713..8e7751e376 100644 --- a/test/battle/ability/water_compaction.c +++ b/test/battle/ability/water_compaction.c @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages on each hit of a mu SINGLE_BATTLE_TEST("Water Compaction does not affect damage taken from Water type moves", s16 damage) { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SAND_VEIL; } PARAMETRIZE { ability = ABILITY_WATER_COMPACTION; } GIVEN { diff --git a/test/battle/ability/wind_power.c b/test/battle/ability/wind_power.c index 279d51f623..c38bbf3569 100644 --- a/test/battle/ability/wind_power.c +++ b/test/battle/ability/wind_power.c @@ -107,7 +107,7 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 2/3 target move") { - u16 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER;} PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } @@ -148,7 +148,7 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 3 target move") { - u16 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 4c86673473..3ee1f28c17 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -29,7 +29,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Bubble over Water Gun if it's slower") AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has Contrary") { - u32 abilityAI; + enum Ability abilityAI; PARAMETRIZE { abilityAI = ABILITY_MOXIE; } PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; } // Mold Breaker ignores Contrary. @@ -52,7 +52,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they both require the same number of hits to ko") { u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 hp, expectedMove, turns, abilityAtk, expectedMove2; + u16 hp, expectedMove, turns, expectedMove2; + enum Ability abilityAtk; abilityAtk = ABILITY_NONE; expectedMove2 = MOVE_NONE; @@ -136,7 +137,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves { u8 turns = 0; u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 expectedMove, abilityAtk, abilityDef; + u16 expectedMove; + enum Ability abilityAtk, abilityDef; abilityAtk = ABILITY_NONE; @@ -258,7 +260,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking { u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; u16 expectedMove, expectedMove2 = MOVE_NONE; - u16 abilityAtk = ABILITY_NONE, holdItemAtk = ITEM_NONE; + enum Ability abilityAtk = ABILITY_NONE; + u32 holdItemAtk = ITEM_NONE; // Psychic is not very effective, but always hits. Solarbeam requires a charging turn, Double Edge has recoil and Focus Blast can miss; PARAMETRIZE { abilityAtk = ABILITY_STURDY; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE; expectedMove = MOVE_PSYCHIC; } @@ -295,7 +298,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking { u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; u16 expectedMove, expectedMove2 = MOVE_NONE; - u16 abilityAtk = ABILITY_NONE, holdItemAtk = ITEM_NONE; + enum Ability abilityAtk = ABILITY_NONE; + u32 holdItemAtk = ITEM_NONE; // Fiery Dance and Skull Bash are chosen because user is holding Power Herb PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SKULL_BASH; move3 = MOVE_FIERY_DANCE; move4 = MOVE_DOUBLE_EDGE; @@ -322,7 +326,7 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user is not holding Power Herb") { - u16 abilityAtk = ABILITY_NONE; + enum Ability abilityAtk = ABILITY_NONE; u16 holdItemAtk = ITEM_NONE; PARAMETRIZE { abilityAtk = ABILITY_DROUGHT; } @@ -442,7 +446,7 @@ AI_SINGLE_BATTLE_TEST("First Impression is preferred on the first turn of the sp AI_SINGLE_BATTLE_TEST("First Impression is not chosen if it's blocked by certain abilities") { u16 species; - u16 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } @@ -509,7 +513,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Thunderbolt then Surf 2/3 times if the opp AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary") { - u32 ability; + enum Ability ability; PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } PARAMETRIZE {ability = ABILITY_CONTRARY; } @@ -535,7 +539,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary" AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") { - u32 ability; + enum Ability ability; PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } PARAMETRIZE {ability = ABILITY_CONTRARY; } @@ -561,7 +565,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical immunity") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SWIFT_SWIM; } PARAMETRIZE { ability = ABILITY_SHELL_ARMOR; } @@ -638,7 +642,8 @@ AI_SINGLE_BATTLE_TEST("AI uses a guaranteed KO move instead of the move with the AI_SINGLE_BATTLE_TEST("AI stays choice locked into moves in spite of the player's ability disabling them") { - u32 playerMon, ability, aiMove; + u32 playerMon, aiMove; + enum Ability ability; PARAMETRIZE { ability = ABILITY_DAZZLING; playerMon = SPECIES_BRUXISH; aiMove = MOVE_QUICK_ATTACK; } PARAMETRIZE { ability = ABILITY_QUEENLY_MAJESTY; playerMon = SPECIES_TSAREENA; aiMove = MOVE_QUICK_ATTACK; } PARAMETRIZE { ability = ABILITY_ARMOR_TAIL; playerMon = SPECIES_FARIGIRAF; aiMove = MOVE_QUICK_ATTACK; } @@ -847,7 +852,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees opposing drain ability") AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { ability = ABILITY_DAMP; } diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 5583c3b38f..8b6fd9797c 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -176,7 +176,7 @@ AI_SINGLE_BATTLE_TEST("AI can choose Counter or Mirror Coat if the predicted mov AI_SINGLE_BATTLE_TEST("AI chooses moves with secondary effect that have a 100% chance to trigger") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NONE; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; } @@ -199,18 +199,18 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") { u32 status1_0, status1_1, partnerAbility, move; - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; + PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS; move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SOUNDPROOF; } - PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; + PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE; move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; } - PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; + PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE; move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; } @@ -232,7 +232,8 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") { - u32 status, ability, config; + u32 status, config; + enum Ability ability; PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SCRAPPY; } PARAMETRIZE { status = STATUS1_NONE; ability = ABILITY_SCRAPPY; } @@ -312,7 +313,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Worry Seed against Rest") AI_SINGLE_BATTLE_TEST("AI uses Simple Beam against Contrary Leaf Storm") { - u32 ability, move; + enum Ability ability, move; PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_LEAF_STORM; } PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_CHARGE_BEAM; } PARAMETRIZE { ability = ABILITY_OVERGROW; move = MOVE_CHARGE_BEAM; } @@ -394,7 +395,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would AI_SINGLE_BATTLE_TEST("AI sees Shield Dust immunity to additional effects") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_SHIELD_DUST; } PARAMETRIZE { ability = ABILITY_TINTED_LENS; } diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index d7ff7e021f..e8d3a8e42a 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -10,7 +10,8 @@ ASSUMPTIONS AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move once") { - u32 j, ability = ABILITY_NONE, heldItem = ITEM_NONE; + u32 j, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, @@ -46,7 +47,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move onc AI_SINGLE_BATTLE_TEST("Choiced Pokémon only consider their own status moves when determining if they should switch") { - GIVEN + GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_ZIGZAGOON) { Speed(4); Moves(MOVE_TAIL_WHIP, MOVE_SCRATCH); } @@ -61,7 +62,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon only consider their own status moves whe AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves") { // Moves defined by MOVE_TARGET_USER (with exceptions?) - u32 j, ability = ABILITY_NONE, heldItem = ITEM_NONE; + u32 j, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, @@ -93,8 +95,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves") AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are the only party member") { - u32 j, ability = ABILITY_NONE, isAlive = 0, heldItem = ITEM_NONE; - + u32 j, isAlive = 0, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, ITEM_CHOICE_BAND, @@ -128,8 +130,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are the on AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they don't have a good switchin") { - u32 j, ability = ABILITY_NONE, move = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE; - + u32 j, move = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE; + enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, ITEM_CHOICE_BAND, diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index e5c88a2ff3..1ffd901810 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -186,7 +186,8 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Bulldoze if it triggers its ally's ability ASSUME(GetMoveType(MOVE_BULLDOZE) == TYPE_GROUND); ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1)); - u32 species, ability, currentHP; + u32 species, currentHP; + enum Ability ability; PARAMETRIZE { species = SPECIES_KINGAMBIT; ability = ABILITY_DEFIANT; currentHP = 400; } PARAMETRIZE { species = SPECIES_SHUCKLE; ability = ABILITY_CONTRARY; currentHP = 400; } @@ -213,7 +214,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Beat Up on an ally with Justified if it wi ASSUME(GetMoveEffect(MOVE_BEAT_UP) == EFFECT_BEAT_UP); ASSUME(GetMoveType(MOVE_BEAT_UP) == TYPE_DARK); - u32 defAbility, atkAbility, currentHP; + enum Ability defAbility, atkAbility, currentHP; PARAMETRIZE { defAbility = ABILITY_FLASH_FIRE; atkAbility = ABILITY_SCRAPPY; currentHP = 400; } PARAMETRIZE { defAbility = ABILITY_JUSTIFIED; atkAbility = ABILITY_SCRAPPY; currentHP = 400; } @@ -373,7 +374,8 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); - u32 ability, move, species; + enum Ability ability; + u32 move, species; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; move = MOVE_DISCHARGE; } PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } @@ -410,7 +412,8 @@ AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (ge ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); - u32 ability, move, species; + enum Ability ability; + u32 move, species; PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } @@ -434,7 +437,8 @@ AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (ge ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); - u32 ability, move, species; + enum Ability ability; + u32 move, species; PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } @@ -495,15 +499,15 @@ AI_DOUBLE_BATTLE_TEST("AI sets up weather for its ally") PARAMETRIZE { goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } PARAMETRIZE { goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } PARAMETRIZE { goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; } GIVEN { @@ -526,13 +530,13 @@ AI_DOUBLE_BATTLE_TEST("AI sets up terrain for its ally") PARAMETRIZE { goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; } PARAMETRIZE { goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; } PARAMETRIZE { goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodTerrain = MOVE_ELECTRIC_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_RISING_VOLTAGE; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; } GIVEN { @@ -612,7 +616,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room with both battlers on the turn it expi TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } - } + } } AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die") diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index f6d7304a6b..f531f07f4d 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -825,7 +825,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an absorber") { - u32 aiMon; u32 move; u32 absorbingAbility; + u32 aiMon; u32 move; + enum Ability absorbingAbility; PARAMETRIZE { aiMon = SPECIES_NINETALES; absorbingAbility = ABILITY_FLASH_FIRE; move = MOVE_FLAMETHROWER;} PARAMETRIZE { aiMon = SPECIES_MANTINE; absorbingAbility = ABILITY_WATER_ABSORB; move = MOVE_SURF;} PARAMETRIZE { aiMon = SPECIES_TOXICROAK; absorbingAbility = ABILITY_DRY_SKIN; move = MOVE_SURF;} @@ -1286,7 +1287,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI sees Echoed Voice damage co AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own weather setting ability when considering switchin candidates") { - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; PARAMETRIZE { ability = ABILITY_WATER_ABSORB; } PARAMETRIZE { ability = ABILITY_DRIZZLE; } GIVEN { diff --git a/test/battle/ai/check_bad_move.c b/test/battle/ai/check_bad_move.c index 776dcd7de2..ab6241dcbe 100644 --- a/test/battle/ai/check_bad_move.c +++ b/test/battle/ai/check_bad_move.c @@ -4,7 +4,8 @@ AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is protected by it's ability") { - u16 ability, species, move; + enum Ability ability; + u32 species, move; PARAMETRIZE { ability = ABILITY_SPEED_BOOST; species = SPECIES_TORCHIC; move = MOVE_SCARY_FACE; } PARAMETRIZE { ability = ABILITY_HYPER_CUTTER; species = SPECIES_KRABBY; move = MOVE_GROWL; } diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c index 6a2ed89101..fcc8d81658 100644 --- a/test/battle/ai/gimmick_z_move.c +++ b/test/battle/ai/gimmick_z_move.c @@ -59,7 +59,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- 10,000,000 Volt Thunderbolt") } AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Conversion") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_NONE; } PARAMETRIZE { ability = ABILITY_OPPORTUNIST; } diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 44d03c9d03..a80f644d50 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -1608,7 +1608,8 @@ SINGLE_BATTLE_TEST("Dynamax: Max Attacks prints a message when hitting into Max SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass absorbing abilities") { - u32 move, ability, species; + u32 move, species; + enum Ability ability; PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; } PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_WATER_ABSORB; species = SPECIES_LANTURN; } PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_FLASH_FIRE; species = SPECIES_HEATRAN; } diff --git a/test/battle/hold_effect/booster_energy.c b/test/battle/hold_effect/booster_energy.c index 41e5fe3b47..93e79e4962 100644 --- a/test/battle/hold_effect/booster_energy.c +++ b/test/battle/hold_effect/booster_energy.c @@ -133,7 +133,7 @@ SINGLE_BATTLE_TEST("Booster Energy activates Quark Drive and increases highest s SINGLE_BATTLE_TEST("Booster Energy increases special attack by 30% if it is the highest stat", s16 damage) { u32 species; - u32 ability; + enum Ability ability; u32 item; PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_NONE; } @@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Booster Energy increases special attack by 30% if it is the SINGLE_BATTLE_TEST("Booster Energy increases special defense by 30% if it is the highest stat", s16 damage) { u32 species; - u32 ability; + enum Ability ability; u32 item; PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_NONE; } diff --git a/test/battle/hold_effect/protective_pads.c b/test/battle/hold_effect/protective_pads.c index e04f30ac9b..6f8d068d06 100644 --- a/test/battle/hold_effect/protective_pads.c +++ b/test/battle/hold_effect/protective_pads.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Protective Pads protected moves still make direct contact", s16 damage) { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_KLUTZ; } PARAMETRIZE { ability = ABILITY_FLUFFY; } GIVEN { diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/restore_stats.c index 92aa7f0ce6..52cbf2e3df 100644 --- a/test/battle/hold_effect/restore_stats.c +++ b/test/battle/hold_effect/restore_stats.c @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimi SINGLE_BATTLE_TEST("White Herb restores stats after all hits of a multi hit move happened") { u16 species; - u16 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_SLIGGOO_HISUI; ability = ABILITY_GOOEY; } PARAMETRIZE { species = SPECIES_DUGTRIO_ALOLA; ability = ABILITY_TANGLING_HAIR; } @@ -187,7 +187,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if Magician steals it" SINGLE_BATTLE_TEST("White Herb has correct interactions with Intimidate triggered Defiant and Competitive") { u16 species; - u16 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_IGGLYBUFF; ability = ABILITY_COMPETITIVE; } PARAMETRIZE { species = SPECIES_MANKEY; ability = ABILITY_DEFIANT; } diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c index 53cca3c211..eecb3846f7 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/seeds.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS +ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN); @@ -16,7 +16,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrain") { - u32 ability, item; + enum Ability ability; + u32 item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_ELECTRIC_SEED; } PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_NONE; } @@ -47,7 +48,8 @@ SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrai SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") { - u32 ability, item; + enum Ability ability; + u32 item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_GRASSY_SEED; } PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_NONE; } @@ -78,7 +80,8 @@ SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain") { - u32 ability, item; + enum Ability ability; + u32 item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_MISTY_SEED; } PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_NONE; } @@ -109,7 +112,8 @@ SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain" SINGLE_BATTLE_TEST("Psychic Seed raises the holder's Sp. Defense on Psychic Terrain") { - u32 ability, item; + enum Ability ability; + u32 item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_PSYCHIC_SEED; } PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_NONE; } @@ -140,7 +144,8 @@ SINGLE_BATTLE_TEST("Psychic Seed raises the holder's Sp. Defense on Psychic Terr SINGLE_BATTLE_TEST("Seeds get consumed in Terrain even if holder is not affected by Terrain") { - u32 species, ability, item; + u32 species, item; + enum Ability ability; PARAMETRIZE { species = SPECIES_TAPU_KOKO; ability = ABILITY_ELECTRIC_SURGE; item = ITEM_ELECTRIC_SEED; } PARAMETRIZE { species = SPECIES_TAPU_BULU; ability = ABILITY_GRASSY_SURGE; item = ITEM_GRASSY_SEED; } PARAMETRIZE { species = SPECIES_TAPU_FINI; ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; } diff --git a/test/battle/move_effect/ally_switch.c b/test/battle/move_effect/ally_switch.c index e3f99cb73b..a7fddb247c 100644 --- a/test/battle/move_effect/ally_switch.c +++ b/test/battle/move_effect/ally_switch.c @@ -92,7 +92,7 @@ DOUBLE_BATTLE_TEST("Ally Switch does not redirect the target of Snipe Shot") DOUBLE_BATTLE_TEST("Ally Switch does not redirect moves done by Pokémon with Stalwart and Propeller Tail") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_STALWART; } PARAMETRIZE { ability = ABILITY_PROPELLER_TAIL; } PARAMETRIZE { ability = ABILITY_TELEPATHY; } @@ -366,7 +366,7 @@ DOUBLE_BATTLE_TEST("Ally Switch does not update leech seed battler") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, playerLeft); HP_BAR(playerLeft); HP_BAR(opponentLeft); - + MESSAGE("The opposing Ralts used Ally Switch!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); MESSAGE("The opposing Ralts and the opposing Bulbasaur switched places!"); diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c index 35f491254d..8883529223 100644 --- a/test/battle/move_effect/charge.c +++ b/test/battle/move_effect/charge.c @@ -75,7 +75,8 @@ SINGLE_BATTLE_TEST("Charge's effect is removed if the user fails using an Electr SINGLE_BATTLE_TEST("Charge's effect does not stack with Electromorphosis or Wind Power") { - u32 species, ability; + u32 species; + enum Ability ability; s16 damage[2]; PARAMETRIZE { species = SPECIES_WATTREL; ability = ABILITY_WIND_POWER; } diff --git a/test/battle/move_effect/doodle.c b/test/battle/move_effect/doodle.c index af144ecee5..3484dac6a0 100644 --- a/test/battle/move_effect/doodle.c +++ b/test/battle/move_effect/doodle.c @@ -84,7 +84,8 @@ DOUBLE_BATTLE_TEST("Doodle fails if partner has a banned Ability") DOUBLE_BATTLE_TEST("Doodle fails if ally's ability can't be suppressed") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_DARMANITAN; ability = ABILITY_ZEN_MODE; } diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 13a165a459..a06c61ec78 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -98,7 +98,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th { struct BattlePokemon *chosenTarget = NULL; struct BattlePokemon *finalTarget = NULL; - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; abilityLeft = ABILITY_WATER_ABSORB; abilityRight = ABILITY_VOLT_ABSORB; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; abilityLeft = ABILITY_WATER_ABSORB; abilityRight = ABILITY_VOLT_ABSORB; } PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; abilityLeft = ABILITY_VOLT_ABSORB; abilityRight = ABILITY_WATER_ABSORB; } @@ -124,7 +124,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th { struct BattlePokemon *chosenTarget = NULL; struct BattlePokemon *finalTarget = NULL; - u32 abilityLeft, abilityRight; + enum Ability abilityLeft, abilityRight; PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentLeft; abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_MOTOR_DRIVE; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_MOTOR_DRIVE; } PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; abilityLeft = ABILITY_MOTOR_DRIVE; abilityRight = ABILITY_VITAL_SPIRIT; } diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index 5435fbcafe..1efbd3fce7 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -58,7 +58,7 @@ SINGLE_BATTLE_TEST("Fling fails if Pokémon is under the effects of Embargo or M SINGLE_BATTLE_TEST("Fling fails for Pokémon with Klutz ability") { - u16 ability; + enum Ability ability; PARAMETRIZE {ability = ABILITY_KLUTZ; } PARAMETRIZE {ability = ABILITY_RUN_AWAY; } diff --git a/test/battle/move_effect/gastro_acid.c b/test/battle/move_effect/gastro_acid.c index 8cb0a7d4af..1bbc8c0d5b 100644 --- a/test/battle/move_effect/gastro_acid.c +++ b/test/battle/move_effect/gastro_acid.c @@ -8,7 +8,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Gastro Acid fails if target has a banned ability") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 67bdfda1b8..5214d38b35 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -86,7 +86,8 @@ DOUBLE_BATTLE_TEST("Heal Bell/Aromatherapy cures the entire party of the user fr DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)") { - u32 ability, config; + enum Ability ability; + u32 config; PARAMETRIZE { ability = ABILITY_SCRAPPY; config = GEN_4; } PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_4; } @@ -114,7 +115,8 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)" SINGLE_BATTLE_TEST("Heal Bell cures inactive Soundproof Pokemon (Gen5+)") { - u32 config, ability; + u32 config; + enum Ability ability; PARAMETRIZE { config = GEN_4, ability = ABILITY_SCRAPPY; } PARAMETRIZE { config = GEN_4, ability = ABILITY_SOUNDPROOF; } diff --git a/test/battle/move_effect/ion_deluge.c b/test/battle/move_effect/ion_deluge.c index b806f9d8e1..4f74c6db72 100644 --- a/test/battle/move_effect/ion_deluge.c +++ b/test/battle/move_effect/ion_deluge.c @@ -27,7 +27,7 @@ WILD_BATTLE_TEST("Ion Deluge works the same way as always when used by a mon wit WILD_BATTLE_TEST("Ion Deluge works the same way as always when used by a mon with Lightning Rod / Motor Drive") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; } PARAMETRIZE { ability = ABILITY_MOTOR_DRIVE; } diff --git a/test/battle/move_effect/lash_out.c b/test/battle/move_effect/lash_out.c index 4ceb0c02a8..ed9465e915 100644 --- a/test/battle/move_effect/lash_out.c +++ b/test/battle/move_effect/lash_out.c @@ -118,7 +118,7 @@ SINGLE_BATTLE_TEST("Lash Out damage is boosted on turn 1 by switch in abilities" DOUBLE_BATTLE_TEST("Lash Out damage is boosted by Cotton Down activation in doubles") { s16 damage[2] = {0}; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; PARAMETRIZE { ability = ABILITY_REGENERATOR; } PARAMETRIZE { ability = ABILITY_COTTON_DOWN; } diff --git a/test/battle/move_effect/octolock.c b/test/battle/move_effect/octolock.c index 74e0b0fc4c..b98c17908d 100644 --- a/test/battle/move_effect/octolock.c +++ b/test/battle/move_effect/octolock.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Octolock decreases Defense and Sp. Def by at the end of the SINGLE_BATTLE_TEST("Octolock reduction is prevented by Clear Body, White Smoke and Full Metal Body") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_BELDUM; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } diff --git a/test/battle/move_effect/recoil_if_miss.c b/test/battle/move_effect/recoil_if_miss.c index a5dbfef178..0fc09a7fc4 100644 --- a/test/battle/move_effect/recoil_if_miss.c +++ b/test/battle/move_effect/recoil_if_miss.c @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Recoil if miss: Supercell Slam causes recoil if it is absorb SINGLE_BATTLE_TEST("Recoil if miss: Disguise doesn't prevent crash damage from Jump Kick into ghost types") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_EARLY_BIRD; } PARAMETRIZE { ability = ABILITY_SCRAPPY; } diff --git a/test/battle/move_effect/role_play.c b/test/battle/move_effect/role_play.c index 1a05f02d4a..ebd56bce2c 100644 --- a/test/battle/move_effect/role_play.c +++ b/test/battle/move_effect/role_play.c @@ -50,7 +50,8 @@ DOUBLE_BATTLE_TEST("Role Play copies target's current ability even if it changed SINGLE_BATTLE_TEST("Role Play and Doodle fail if target's ability can't be copied'") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_SHEDINJA; ability = ABILITY_WONDER_GUARD; } PARAMETRIZE { species = SPECIES_CASTFORM; ability = ABILITY_FORECAST; } @@ -90,7 +91,8 @@ SINGLE_BATTLE_TEST("Role Play and Doodle fail if target's ability can't be copie SINGLE_BATTLE_TEST("Role Play fails if user's ability can't be suppressed") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } if (B_UPDATED_ABILITY_DATA >= GEN_7) diff --git a/test/battle/move_effect/simple_beam.c b/test/battle/move_effect/simple_beam.c index 4250c8ce45..54e8f4ca25 100644 --- a/test/battle/move_effect/simple_beam.c +++ b/test/battle/move_effect/simple_beam.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") ABILITY_POPUP(opponent, ABILITY_BLAZE); } THEN { EXPECT_EQ(opponent->ability, ABILITY_SIMPLE); - } + } } DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") @@ -44,7 +44,8 @@ DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") SINGLE_BATTLE_TEST("Simple Beam fails if target has an ability that can't be overwritten") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } diff --git a/test/battle/move_effect/skill_swap.c b/test/battle/move_effect/skill_swap.c index 2d47a01da3..59b023f5fa 100644 --- a/test/battle/move_effect/skill_swap.c +++ b/test/battle/move_effect/skill_swap.c @@ -67,7 +67,8 @@ DOUBLE_BATTLE_TEST("Skill Swap doesn't display ability popups when swapping with SINGLE_BATTLE_TEST("Skill Swap fails if user or target has an ability that can't be swapped") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_SHEDINJA; ability = ABILITY_WONDER_GUARD; } PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } diff --git a/test/battle/move_effect/solar_beam.c b/test/battle/move_effect/solar_beam.c index 309d950c50..6113b5c4ac 100644 --- a/test/battle/move_effect/solar_beam.c +++ b/test/battle/move_effect/solar_beam.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Solar Beam does not need a charging turn if Sun is up") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_DROUGHT; } PARAMETRIZE { ability = ABILITY_WHITE_SMOKE; } diff --git a/test/battle/move_effect/speed_down.c b/test/battle/move_effect/speed_down.c index a3b5e26be8..d0d2625d9c 100644 --- a/test/battle/move_effect/speed_down.c +++ b/test/battle/move_effect/speed_down.c @@ -3,7 +3,7 @@ DOUBLE_BATTLE_TEST("Speed Down: Cotton Spore does not fail if it is blocked by one target") { - u32 abilityOne, abilityTwo; + enum Ability abilityOne, abilityTwo; PARAMETRIZE { abilityOne = ABILITY_OVERCOAT; abilityTwo = ABILITY_SKILL_LINK; } PARAMETRIZE { abilityOne = ABILITY_SKILL_LINK; abilityTwo = ABILITY_OVERCOAT; } diff --git a/test/battle/move_effect/speed_swap.c b/test/battle/move_effect/speed_swap.c index b5f9aaebaf..3405d510ca 100644 --- a/test/battle/move_effect/speed_swap.c +++ b/test/battle/move_effect/speed_swap.c @@ -24,12 +24,13 @@ SINGLE_BATTLE_TEST("Speed Swap swaps user and target's speed stats") } THEN { EXPECT_EQ(player->speed, 10); EXPECT_EQ(opponent->speed, 6); - } + } } SINGLE_BATTLE_TEST("Speed Swap doesn't swap user and target's speed modifiers") { - u32 species, ability, move; + u32 species, move; + enum Ability ability; PARAMETRIZE { species = SPECIES_WOBBUFFET; ability = ABILITY_TELEPATHY; move = MOVE_ROCK_POLISH; } // x2.0 PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_SWIFT_SWIM; move = MOVE_RAIN_DANCE; } // x2.0 GIVEN { @@ -54,5 +55,5 @@ SINGLE_BATTLE_TEST("Speed Swap doesn't swap user and target's speed modifiers") EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); } - } + } } diff --git a/test/battle/move_effect/spicy_extract.c b/test/battle/move_effect/spicy_extract.c index 7cf9eacb32..6dc2a77427 100644 --- a/test/battle/move_effect/spicy_extract.c +++ b/test/battle/move_effect/spicy_extract.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Spicy Extract raises target's Attack by 2 stages and lowers SINGLE_BATTLE_TEST("Spicy Extract is prevented by target's ability if it's Attack stat is maxed out") { - u16 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { ability = ABILITY_LIGHT_METAL; } @@ -189,7 +189,7 @@ AI_DOUBLE_BATTLE_TEST("Spicy Extract user will use it if partner holds Clear Amu AI_DOUBLE_BATTLE_TEST("Spicy Extract user will not choose the move if it does not benefit partner") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_GHOLDENGO; ability = ABILITY_GOOD_AS_GOLD; } PARAMETRIZE { species = SPECIES_SNIVY; ability = ABILITY_CONTRARY; } diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index ef7c8f011a..52c5aa53cc 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -73,7 +73,8 @@ SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type") AI_SINGLE_BATTLE_TEST("AI avoids toxic when it can not poison target") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_SNORLAX; ability = ABILITY_IMMUNITY; } PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } diff --git a/test/battle/move_effect/worry_seed.c b/test/battle/move_effect/worry_seed.c index c4b18b7cab..1d87dc5192 100644 --- a/test/battle/move_effect/worry_seed.c +++ b/test/battle/move_effect/worry_seed.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") ABILITY_POPUP(opponent, ABILITY_BLAZE); } THEN { EXPECT_EQ(opponent->ability, ABILITY_INSOMNIA); - } + } } DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") @@ -44,7 +44,8 @@ DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") SINGLE_BATTLE_TEST("Worry Seed fails if target has an ability that can't be overwritten") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } diff --git a/test/battle/move_effect_secondary/dire_claw.c b/test/battle/move_effect_secondary/dire_claw.c index ad9ffcc4e2..44cfd8ba1c 100644 --- a/test/battle/move_effect_secondary/dire_claw.c +++ b/test/battle/move_effect_secondary/dire_claw.c @@ -65,7 +65,8 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze poison/electric types respe SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze/cause to fall asleep Pokémon with abilities preventing respective statuses") { u8 statusAnim; - u16 species, ability; + u16 species; + enum Ability ability; u32 rng; if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; ability = ABILITY_LIGHTNING_ROD; } diff --git a/test/battle/move_effect_secondary/order_up.c b/test/battle/move_effect_secondary/order_up.c index ec6f1c51b5..bfabd6e3e3 100644 --- a/test/battle/move_effect_secondary/order_up.c +++ b/test/battle/move_effect_secondary/order_up.c @@ -140,7 +140,7 @@ DOUBLE_BATTLE_TEST("Order Up is boosted by Sheer Force without removing the stat DOUBLE_BATTLE_TEST("Order Up is always boosted by Sheer Force", s16 damage) { u32 move; - u32 ability; + enum Ability ability; PARAMETRIZE(move = MOVE_CELEBRATE, ability = ABILITY_STORM_DRAIN); PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_STORM_DRAIN); PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_COMMANDER); diff --git a/test/battle/move_effect_secondary/remove_status.c b/test/battle/move_effect_secondary/remove_status.c index 0a07ef6368..aef7684233 100644 --- a/test/battle/move_effect_secondary/remove_status.c +++ b/test/battle/move_effect_secondary/remove_status.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Smelling Salts does not cure paralyzed pokemons behind substitutes or get increased power") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } PARAMETRIZE { ability = ABILITY_INFILTRATOR; } GIVEN { @@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Smelling Salts get incread power vs. paralyzed targets") SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substitutes or get increased power") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } PARAMETRIZE { ability = ABILITY_INFILTRATOR; } GIVEN { diff --git a/test/battle/move_effect_secondary/syrup_bomb.c b/test/battle/move_effect_secondary/syrup_bomb.c index 3bb52b6d70..4cf2172069 100644 --- a/test/battle/move_effect_secondary/syrup_bomb.c +++ b/test/battle/move_effect_secondary/syrup_bomb.c @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Syrup Bomb is prevented by Bulletproof") SINGLE_BATTLE_TEST("Sticky Syrup speed reduction is prevented by Clear Body, White Smoke or Full Metal Body") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_BELDUM; ability = ABILITY_CLEAR_BODY; } PARAMETRIZE { species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } diff --git a/test/battle/move_effect_secondary/tri_attack.c b/test/battle/move_effect_secondary/tri_attack.c index bba72b7677..860a84aa82 100644 --- a/test/battle/move_effect_secondary/tri_attack.c +++ b/test/battle/move_effect_secondary/tri_attack.c @@ -80,7 +80,8 @@ SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze Pokémon with abiliti #endif { u8 statusAnim; - u16 species, ability; + u16 species; + enum Ability ability; u32 rng; PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_PERSIAN; ability = ABILITY_LIMBER; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index 70414e51c4..80318e823f 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage") { - u32 ability; + enum Ability ability; u32 chance; PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 50; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 100; } @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage") SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time") { - u32 ability; + enum Ability ability; u32 chance; PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 30; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 60; } diff --git a/test/battle/move_flags/ignores_target_ability.c b/test/battle/move_flags/ignores_target_ability.c index 25e0f9a20f..4a533e7a08 100644 --- a/test/battle/move_flags/ignores_target_ability.c +++ b/test/battle/move_flags/ignores_target_ability.c @@ -10,7 +10,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own ability", s16 damage) { - u32 ability, move; + enum Ability ability; + u32 move; PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_MAGIC_GUARD; } PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_UNAWARE; } @@ -47,7 +48,8 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own SINGLE_BATTLE_TEST("ignoresTargetAbility moves do ignore target's abilities", s16 damage) { - u32 ability, move; + enum Ability ability; + u32 move; PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_INNER_FOCUS; } PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_MULTISCALE; } @@ -76,7 +78,7 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility moves do ignore target's abilities", s1 SINGLE_BATTLE_TEST("ignoresTargetAbility allows Pokémon with Battle Armor and Shell Armor to receive critical hits") { u32 species; - u32 ability; + enum Ability ability; PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index 73f419289c..7c41538365 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -1035,7 +1035,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by gaining the ability Insomnia / Vital Spirit") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { @@ -1072,7 +1072,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is sent out, has Trace, and Traces Insomnia / Vital spirit") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { @@ -1109,7 +1109,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is sent out and transforms into a mon with Insomnia / Vital spirit") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } KNOWN_FAILING; // Sleep Clause parts work, but Imposter seems broken with battle messages / targeting. Issue #5565 https://github.com/rh-hideout/pokeemerald-expansion/issues/5565 @@ -1403,7 +1403,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Rest doesn't deactivate sleep SINGLE_BATTLE_TEST("Sleep Clause: Suppressing and then sleeping Vital Spirit / Insomnia and switching back in deactivates sleep clause") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { @@ -1434,7 +1434,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Suppressing and then sleeping Vital Spirit / I SINGLE_BATTLE_TEST("Sleep Clause: Mold Breaker Pokémon sleeping Vital Spirit / Insomnia activates sleep clause") { - u32 ability; + enum Ability ability; PARAMETRIZE { ability = ABILITY_VITAL_SPIRIT; } PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { diff --git a/test/battle/status1/burn.c b/test/battle/status1/burn.c index 689338cce8..8ec9d05835 100644 --- a/test/battle/status1/burn.c +++ b/test/battle/status1/burn.c @@ -74,7 +74,8 @@ SINGLE_BATTLE_TEST("Will-O-Wisp can't burn a fire type") AI_SINGLE_BATTLE_TEST("AI avoids Will-o-Wisp when it can not burn target") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_BUIZEL; ability = ABILITY_WATER_VEIL; } PARAMETRIZE { species = SPECIES_DEWPIDER; ability = ABILITY_WATER_BUBBLE; } diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index c81daa9179..a93d350ebd 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -47,7 +47,8 @@ SINGLE_BATTLE_TEST("Paralysis has a 25% chance of skipping the turn") AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_HITMONLEE; ability = ABILITY_LIMBER; } PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } diff --git a/test/battle/status1/sleep.c b/test/battle/status1/sleep.c index 401c0d0bcd..ea08a2ff5a 100644 --- a/test/battle/status1/sleep.c +++ b/test/battle/status1/sleep.c @@ -38,7 +38,8 @@ SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen 6+)") AI_SINGLE_BATTLE_TEST("AI avoids hypnosis when it can not put target to sleep") { - u32 species, ability; + u32 species; + enum Ability ability; PARAMETRIZE { species = SPECIES_HOOTHOOT; ability = ABILITY_INSOMNIA; } PARAMETRIZE { species = SPECIES_MANKEY; ability = ABILITY_VITAL_SPIRIT; } diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index e67c7faa27..f57a15b2a5 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -15,6 +15,7 @@ #include "window.h" #include "constants/characters.h" #include "constants/trainers.h" +#include "constants/abilities.h" #if defined(__INTELLISENSE__) #undef TestRunner_Battle_RecordAbilityPopUp @@ -544,7 +545,7 @@ const void *RandomElementArray(enum RandomTag tag, const void *array, size_t siz return (const u8 *)array + size * index; } -static s32 TryAbilityPopUp(s32 i, s32 n, u32 battlerId, u32 ability) +static s32 TryAbilityPopUp(s32 i, s32 n, u32 battlerId, enum Ability ability) { struct QueuedAbilityEvent *event; s32 iMax = i + n; @@ -562,7 +563,7 @@ static s32 TryAbilityPopUp(s32 i, s32 n, u32 battlerId, u32 ability) return -1; } -void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability) +void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, enum Ability ability) { s32 queuedEvent; s32 match; @@ -1674,7 +1675,7 @@ void Nature_(u32 sourceLine, u32 nature) DATA.nature = nature; } -void Ability_(u32 sourceLine, u32 ability) +void Ability_(u32 sourceLine, enum Ability ability) { s32 i; u32 species; diff --git a/test/text.c b/test/text.c index 4f3c4722e1..bc18e2e87d 100644 --- a/test/text.c +++ b/test/text.c @@ -499,7 +499,7 @@ TEST("Ability names fit on Pokemon Summary Screen") { u32 i; const u32 fontId = FONT_NORMAL, widthPx = 144; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; for (i = 1; i < ABILITIES_COUNT; i++) { PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } @@ -511,7 +511,7 @@ TEST("Ability names fit on Ability Pop-Up") { u32 i; const u32 fontId = FONT_SMALL_NARROWER, widthPx = 76; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; for (i = 1; i < ABILITIES_COUNT; i++) { PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].name) { ability = i; } @@ -523,7 +523,7 @@ TEST("Ability descriptions fit on Pokemon Summary Screen") { u32 i; const u32 fontId = FONT_NORMAL, widthPx = 146; - u32 ability = ABILITY_NONE; + enum Ability ability = ABILITY_NONE; for (i = 1; i < ABILITIES_COUNT; i++) { PARAMETRIZE_LABEL("%S", gAbilitiesInfo[i].description) { ability = i; } @@ -570,7 +570,7 @@ TEST("Battle strings fit on the battle message window") s32 sixDigitNines = 999999; // 36 pixels. u8 nickname[POKEMON_NAME_LENGTH + 1] = _("MMMMMMMMMMMM"); // 72 pixels. u32 longMoveID = MOVE_NATURES_MADNESS; // 89 pixels. - u32 longAbilityID = ABILITY_SUPERSWEET_SYRUP; // 91 pixels. + enum Ability longAbilityID = ABILITY_SUPERSWEET_SYRUP; // 91 pixels. u32 longStatName = STAT_EVASION; // 40 pixels. u32 longTypeName = TYPE_ELECTRIC; // 43 pixels. u32 longSpeciesName = SPECIES_SANDY_SHOCKS; // 47 pixels. From db43fc3c83aa163ef53ef1aead1ae3a6a95b9cdc Mon Sep 17 00:00:00 2001 From: khbsd Date: Mon, 29 Sep 2025 17:05:20 -0500 Subject: [PATCH 063/183] followup: AbilityBattleEffects return type is incorrect (#7827) --- include/battle_util.h | 2 +- src/battle_util.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index c3641ea042..fc75904a8f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -263,7 +263,7 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, u32 moveType, enum FunctionCallOption option); -enum Ability AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); +u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability); diff --git a/src/battle_util.c b/src/battle_util.c index 51d894f9d4..439ceb1a27 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3586,7 +3586,7 @@ static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 ani return 0; } -enum Ability AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) +u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) { u32 effect = 0; u32 moveType = 0, move = 0; From 3ea095a941419487fc0a67726f34c75fd92d82a2 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 30 Sep 2025 21:16:02 +0200 Subject: [PATCH 064/183] More White Herb fixes/clean up (#7826) Co-authored-by: Bassoonian --- asm/macros/battle_script.inc | 5 --- data/battle_scripts_1.s | 1 - include/battle_main.h | 1 + include/battle_util.h | 2 +- src/battle_main.c | 9 +++++ src/battle_script_commands.c | 16 +++----- src/battle_util.c | 50 ++++++------------------- test/battle/hold_effect/restore_stats.c | 4 +- 8 files changed, 30 insertions(+), 58 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 4cb30b27f1..cf5c97308b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1373,11 +1373,6 @@ .4byte \failInstr .endm - .macro itemstatchangeeffects battler:req - callnative BS_RunStatChangeItems - .byte \battler - .endm - .macro allyswitchswapbattlers callnative BS_AllySwitchSwapBattler .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a07cc0178b..c8bd206ca1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6761,7 +6761,6 @@ BattleScript_ActivateWeatherAbilities_Loop: return BattleScript_TryIntimidateHoldEffects: - itemstatchangeeffects BS_TARGET jumpifnoholdeffect BS_TARGET, HOLD_EFFECT_ADRENALINE_ORB, BattleScript_TryIntimidateHoldEffectsRet jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_TryIntimidateHoldEffectsRet setstatchanger STAT_SPEED, 1, FALSE diff --git a/include/battle_main.h b/include/battle_main.h index 5c8a71a26e..58b44504d9 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -58,6 +58,7 @@ enum FirstTurnEventsStates FIRST_TURN_EVENTS_NEUTRALIZING_GAS, FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES, FIRST_TURN_EVENTS_ITEM_EFFECTS, + FIRST_TURN_EVENTS_WHITE_HERB, FIRST_TURN_EVENTS_OPPORTUNIST, FIRST_TURN_EVENTS_MIRROR_HERB, FIRST_TURN_EVENTS_EJECT_PACK, diff --git a/include/battle_util.h b/include/battle_util.h index fc75904a8f..e0f69e43d3 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -77,6 +77,7 @@ enum ItemCaseId ITEMEFFECT_USE_LAST_ITEM, // move end effects for just the battler, not whole field ITEMEFFECT_WHITE_HERB, ITEMEFFECT_WHITE_HERB_ENDTURN, + ITEMEFFECT_WHITE_HERB_FIRST_TURN, ITEMEFFECT_MIRROR_HERB, ITEMEFFECT_MIRROR_HERB_FIRST_TURN, }; @@ -408,7 +409,6 @@ bool32 IsPursuitTargetSet(void); void ClearPursuitValuesIfSet(u32 battler); void ClearPursuitValues(void); bool32 HasWeatherEffect(void); -u32 RestoreWhiteHerbStats(u32 battler); bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); diff --git a/src/battle_main.c b/src/battle_main.c index 5d1b55d03e..f7c9d2e13e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3885,6 +3885,15 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->switchInBattlerCounter = 0; gBattleStruct->eventsBeforeFirstTurnState++; break; + case FIRST_TURN_EVENTS_WHITE_HERB: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest + { + if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++])) + return; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventsBeforeFirstTurnState++; + break; case FIRST_TURN_EVENTS_OPPORTUNIST: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c0938c30f1..22ec1cf256 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7822,6 +7822,11 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) return TRUE; } + for (i = 0; i < gBattlersCount; i++) + { + if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB, i)) + return TRUE; + } for (i = 0; i < gBattlersCount; i++) { if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, i, GetBattlerAbility(i), 0, 0)) @@ -7829,7 +7834,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) } for (i = 0; i < gBattlersCount; i++) { - if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, battler)) + if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, i)) return TRUE; } @@ -15352,15 +15357,6 @@ void BS_TryAllySwitch(void) } } -void BS_RunStatChangeItems(void) -{ - NATIVE_ARGS(u8 battler); - - // Change instruction before calling ItemBattleEffects. - gBattlescriptCurrInstr = cmd->nextInstr; - ItemBattleEffects(ITEMEFFECT_WHITE_HERB, GetBattlerForBattleScript(cmd->battler)); -} - static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) { u32 i, j; diff --git a/src/battle_util.c b/src/battle_util.c index 439ceb1a27..6a0b09ebbc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6575,7 +6575,7 @@ u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID) return ITEM_NO_EFFECT; } -u32 RestoreWhiteHerbStats(u32 battler) +static u32 RestoreWhiteHerbStats(u32 battler, enum ItemCaseId caseID) { u32 i, effect = 0; @@ -6592,7 +6592,12 @@ u32 RestoreWhiteHerbStats(u32 battler) gLastUsedItem = gBattleMons[battler].item; gBattleScripting.battler = battler; gPotentialItemEffectBattler = battler; - } + if (caseID == ITEMEFFECT_WHITE_HERB) + BattleScriptCall(BattleScript_WhiteHerbRet); + else + BattleScriptExecute(BattleScript_WhiteHerbEnd2); +} + return effect; } @@ -6932,16 +6937,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) gBattleStruct->moneyMultiplierItem = 1; } break; - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - { - if (caseID == ITEMEFFECT_ON_SWITCH_IN) - BattleScriptCall(BattleScript_WhiteHerbRet); - else - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - } - break; case HOLD_EFFECT_CONFUSE_SPICY: if (B_BERRIES_INSTANT >= GEN_4) effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); @@ -7177,11 +7172,6 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_RESTORE_PP: effect = ItemRestorePp(battler, gLastUsedItem, caseID); break; - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - break; case HOLD_EFFECT_CONFUSE_SPICY: effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); break; @@ -7638,32 +7628,14 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; case ITEMEFFECT_WHITE_HERB: case ITEMEFFECT_WHITE_HERB_ENDTURN: - switch (battlerHoldEffect) - { - case HOLD_EFFECT_WHITE_HERB: - effect = RestoreWhiteHerbStats(battler); - if (effect != 0) - { - if (caseID == ITEMEFFECT_WHITE_HERB) - BattleScriptCall(BattleScript_WhiteHerbRet); - else - BattleScriptExecute(BattleScript_WhiteHerbEnd2); - } - break; - default: - break; - } + case ITEMEFFECT_WHITE_HERB_FIRST_TURN: + if (battlerHoldEffect == HOLD_EFFECT_WHITE_HERB) + effect = RestoreWhiteHerbStats(battler, caseID); break; case ITEMEFFECT_MIRROR_HERB: case ITEMEFFECT_MIRROR_HERB_FIRST_TURN: - switch (battlerHoldEffect) - { - case HOLD_EFFECT_MIRROR_HERB: + if (battlerHoldEffect == HOLD_EFFECT_MIRROR_HERB) effect = TryConsumeMirrorHerb(battler, caseID); - break; - default: - break; - } break; } diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/restore_stats.c index 52cbf2e3df..4a8f020023 100644 --- a/test/battle/hold_effect/restore_stats.c +++ b/test/battle/hold_effect/restore_stats.c @@ -55,10 +55,10 @@ DOUBLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimi ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); MESSAGE("The opposing Wobbuffet returned its stats to normal using its White Herb!"); - - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); MESSAGE("The opposing Wynaut returned its stats to normal using its White Herb!"); } THEN { From ad7c944f9f737b427cee4a76b6fd0ec8a54f3c81 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 30 Sep 2025 23:44:40 +0200 Subject: [PATCH 065/183] Missing IsBattlerAlive checks in Opportunist/Mirror Herb (#7829) --- src/battle_script_commands.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 22ec1cf256..ca85f1a6f5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6715,6 +6715,8 @@ static void Cmd_moveend(void) while (gBattleStruct->moveEndBattlerId < gBattlersCount) { u32 battler = gBattleStruct->moveEndBattlerId++; + if (!IsBattlerAlive(battler)) + continue; if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, GetBattlerAbility(battler), 0, 0)) return; } @@ -6725,6 +6727,8 @@ static void Cmd_moveend(void) while (gBattleStruct->moveEndBattlerId < gBattlersCount) { u32 battler = gBattleStruct->moveEndBattlerId++; + if (!IsBattlerAlive(battler)) + continue; if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, battler)) return; } From 6267cef4032142a2e1000b2eefcdbba9e100baf9 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 1 Oct 2025 13:45:20 +0200 Subject: [PATCH 066/183] Streamline tryheal macros (#7830) --- asm/macros/battle_script.inc | 6 +++--- data/battle_scripts_1.s | 8 ++++---- src/battle_script_commands.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index cf5c97308b..19a4da0e95 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -696,10 +696,10 @@ .4byte \jumpInstr .endm - .macro tryhealhalfhealth failInstr:req, battler:req + .macro tryhealhalfhealth battler:req, failInstr:req .byte 0x7b - .4byte \failInstr .byte \battler + .4byte \failInstr .endm .macro trymirrormove @@ -1427,7 +1427,7 @@ .4byte \jumpInstr .endm - .macro setpledgestatus battler:req sidestatus:req + .macro setpledgestatus battler:req, sidestatus:req callnative BS_SetPledgeStatus .byte \battler .4byte \sidestatus diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index c8bd206ca1..c4165c4829 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1077,7 +1077,7 @@ BattleScript_PurifyWorks: updatestatusicon BS_TARGET printstring STRINGID_ATTACKERCUREDTARGETSTATUS waitmessage B_WAIT_TIME_LONG - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER + tryhealhalfhealth BS_ATTACKER, BattleScript_AlreadyAtFullHp goto BattleScript_RestoreHp BattleScript_EffectStrengthSap:: @@ -2408,7 +2408,7 @@ BattleScript_GravityLoopEnd: BattleScript_EffectRoost:: attackcanceler - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET + tryhealhalfhealth BS_TARGET, BattleScript_AlreadyAtFullHp setroost goto BattleScript_PresentHealTarget @@ -2836,7 +2836,7 @@ BattleScript_EffectConversion:: BattleScript_EffectRestoreHp:: attackcanceler - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_ATTACKER + tryhealhalfhealth BS_ATTACKER, BattleScript_AlreadyAtFullHp attackanimation waitanimation BattleScript_RestoreHp: @@ -3858,7 +3858,7 @@ BattleScript_DefenseCurlDoStatUpAnim:: BattleScript_EffectSoftboiled:: attackcanceler - tryhealhalfhealth BattleScript_AlreadyAtFullHp, BS_TARGET + tryhealhalfhealth BS_TARGET, BattleScript_AlreadyAtFullHp BattleScript_PresentHealTarget:: attackanimation waitanimation diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ca85f1a6f5..1636af9aee 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9622,7 +9622,7 @@ static void Cmd_jumpifnexttargetvalid(void) static void Cmd_tryhealhalfhealth(void) { - CMD_ARGS(const u8 *failInstr, u8 battler); + CMD_ARGS(u8 battler, const u8 *failInstr); const u8 *failInstr = cmd->failInstr; From 2156651313ef6428c09aa87d6e6b5620a09f5e71 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Wed, 1 Oct 2025 14:51:09 +0200 Subject: [PATCH 067/183] No bag use flag changed to a varable (#7780) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- data/scripts/debug.inc | 9 +++++++++ include/battle_controllers.h | 1 + include/battle_util.h | 1 + include/config/battle.h | 8 +++++++- src/battle_controllers.c | 5 +++++ src/battle_main.c | 2 +- src/battle_util.c | 15 +++++++++++++++ src/debug.c | 36 +++++++++++++++++++++--------------- src/item_use.c | 2 +- src/overworld.c | 5 ++++- 10 files changed, 65 insertions(+), 19 deletions(-) diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index e43df32813..954902f3f3 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -87,6 +87,15 @@ Debug_FlagsNotSetBattleConfigMessage_Text: .string "Please define a usable flag in:\l" .string "'include/config/battle.h'!$" +Debug_VarsNotSetBattleConfigMessage:: + message Debug_VarsNotSetBattleConfigMessage_Text + goto Debug_MessageEnd + +Debug_VarsNotSetBattleConfigMessage_Text: + .string "Feature unavailable!\n" + .string "Please define a usable var in:\l" + .string "'include/config/battle.h'!$" + Debug_BoxFilledMessage:: message Debug_BoxFilledMessage_Text goto Debug_MessageEnd diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 4728c17a84..f7788129ee 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -437,4 +437,5 @@ void BtlController_HandleSwitchInTryShinyAnim(u32 battler); void BtlController_HandleSwitchInSoundAndEnd(u32 battler); void BtlController_HandleSwitchInShowSubstitute(u32 battler); +bool32 ShouldBattleRestrictionsApply(u32 battler); #endif // GUARD_BATTLE_CONTROLLERS_H diff --git a/include/battle_util.h b/include/battle_util.h index e0f69e43d3..f31df51ccc 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -432,5 +432,6 @@ u32 GetNaturePowerMove(u32 battler); u32 GetNaturePowerMove(u32 battler); void RemoveAbilityFlags(u32 battler); bool32 IsDazzlingAbility(enum Ability ability); +bool32 IsAllowedToUseBag(void); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/config/battle.h b/include/config/battle.h index 1e90fecd1e..8533c339a9 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -208,7 +208,6 @@ #define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. #define B_SMART_WILD_AI_FLAG 0 // If this flag is set, wild Pokémon will become smart, with all AI flags enabled. -#define B_FLAG_NO_BAG_USE 0 // If this flag is set, the ability to use the bag in battle is disabled. #define B_FLAG_NO_CATCHING 0 // If this flag is set, the ability to catch wild Pokémon is disabled. #define B_FLAG_NO_RUNNING 0 // If this flag is set, the ability to escape from wild battles is disabled. Also makes Roar/Whirlwind and Teleport (under Gen8) fail. #define B_FLAG_AI_VS_AI_BATTLE 0 // If this flag is set, the player's mons will be controlled by the ai next battles. @@ -230,6 +229,13 @@ #define B_VAR_DIFFICULTY 0 // If not 0, you can use this var to control which difficulty version of a Trainer is loaded. This should be manually set by the developer using Script_SetDifficulty AFTER NewGameInitData has run. +// No bag settings +#define NO_BAG_RESTRICTION 0 +#define NO_BAG_AGAINST_TRAINER 1 +#define NO_BAG_IN_BATTLE 2 + +#define B_VAR_NO_BAG_USE 0 // If 1, the ability to use the bag in battle is disabled in trainer battles. If 2, it is also disabled in wild battles. + // Sky Battles #define B_FLAG_SKY_BATTLE 0 // If this flag has a value, the player will be able to engage in scripted Sky Battles. #define B_VAR_SKY_BATTLE 0 // If this var has a value, the game will remember the positions of Pokémon used in Sky Battles. diff --git a/src/battle_controllers.c b/src/battle_controllers.c index f2880d31af..3c9f0a21cd 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -3124,3 +3124,8 @@ void UpdateFriendshipFromXItem(u32 battler) SetBattlerMonData(battler, GetBattlerParty(battler), gBattlerPartyIndexes[battler]); } } + +bool32 ShouldBattleRestrictionsApply(u32 battler) +{ + return IsControllerPlayer(battler); +} diff --git a/src/battle_main.c b/src/battle_main.c index f7c9d2e13e..f7df02731d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4307,7 +4307,7 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_USE_ITEM: - if (FlagGet(B_FLAG_NO_BAG_USE)) + if (ShouldBattleRestrictionsApply(battler) && !IsAllowedToUseBag()) { RecordedBattle_ClearBattlerAction(battler, 1); gSelectionBattleScripts[battler] = BattleScript_ActionSelectionItemsCantBeUsed; diff --git a/src/battle_util.c b/src/battle_util.c index 6a0b09ebbc..2d78576e35 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -12419,3 +12419,18 @@ void RemoveAbilityFlags(u32 battler) break; } } + +bool32 IsAllowedToUseBag(void) +{ + switch(VarGet(B_VAR_NO_BAG_USE)) + { + case NO_BAG_RESTRICTION: + return TRUE; + case NO_BAG_AGAINST_TRAINER: //True in wild battle; False in trainer battle + return (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)); + case NO_BAG_IN_BATTLE: + return FALSE; + default: + return TRUE; // Undefined Behavior + } +} diff --git a/src/debug.c b/src/debug.c index 205959863f..1c727608c3 100644 --- a/src/debug.c +++ b/src/debug.c @@ -105,8 +105,8 @@ enum FlagsVarsDebugMenu DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE, - DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE, DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING, + DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE, }; enum DebugBattleType @@ -341,6 +341,7 @@ static void DebugAction_Player_Id(u8 taskId); extern const u8 Debug_FlagsNotSetOverworldConfigMessage[]; extern const u8 Debug_FlagsNotSetBattleConfigMessage[]; +extern const u8 Debug_VarsNotSetBattleConfigMessage[]; extern const u8 Debug_FlagsAndVarNotSetBattleConfigMessage[]; extern const u8 Debug_EventScript_FontTest[]; extern const u8 Debug_EventScript_CheckEVs[]; @@ -650,11 +651,18 @@ static const struct DebugMenuOption sDebugMenu_Actions_Flags[] = [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_COLLISION] = { COMPOUND_STRING("Toggle {STR_VAR_1}Collision OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_CollisionOnOff }, [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_ENCOUNTER] = { COMPOUND_STRING("Toggle {STR_VAR_1}Encounter OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_EncounterOnOff }, [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_TRAINER_SEE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Trainer See OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_TrainerSeeOnOff }, - [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_BagUseOnOff }, [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING] = { COMPOUND_STRING("Toggle {STR_VAR_1}Catching OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_CatchingOnOff }, + [DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE] = { COMPOUND_STRING("Toggle {STR_VAR_1}Bag Use OFF"), DebugAction_ToggleFlag, DebugAction_FlagsVars_BagUseOnOff }, { NULL } }; +static const u8 *sDebugMenu_Actions_BagUse_Options[] = +{ + COMPOUND_STRING("No Bag: {STR_VAR_1}Inactive"), + COMPOUND_STRING("No Bag: {STR_VAR_1}VS Trainers"), + COMPOUND_STRING("No Bag: {STR_VAR_1}Active"), +}; + static const struct DebugMenuOption sDebugMenu_Actions_Main[] = { { COMPOUND_STRING("Utilities…"), DebugAction_OpenSubMenu, sDebugMenu_Actions_Utilities, }, @@ -1017,16 +1025,14 @@ static u8 Debug_CheckToggleFlags(u8 id) result = FlagGet(OW_FLAG_NO_TRAINER_SEE); break; #endif - #if B_FLAG_NO_BAG_USE != 0 - case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE: - result = FlagGet(B_FLAG_NO_BAG_USE); - break; - #endif #if B_FLAG_NO_CATCHING != 0 case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_CATCHING: result = FlagGet(B_FLAG_NO_CATCHING); break; #endif + case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE: + result = VarGet(B_VAR_NO_BAG_USE); + break; default: result = 0xFF; break; @@ -1053,7 +1059,10 @@ static u8 Debug_GenerateListMenuNames(void) if (sDebugMenuListData->listId == 1) { flagResult = Debug_CheckToggleFlags(i); - name = sDebugMenu_Actions_Flags[i].text; + if (i == DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_BAG_USE) + name = sDebugMenu_Actions_BagUse_Options[flagResult]; + else + name = sDebugMenu_Actions_Flags[i].text; } if (flagResult == 0xFF) @@ -2005,14 +2014,11 @@ static void DebugAction_FlagsVars_TrainerSeeOnOff(u8 taskId) static void DebugAction_FlagsVars_BagUseOnOff(u8 taskId) { -#if B_FLAG_NO_BAG_USE == 0 - Debug_DestroyMenu_Full_Script(taskId, Debug_FlagsNotSetBattleConfigMessage); +#if B_VAR_NO_BAG_USE < VARS_START || B_VAR_NO_BAG_USE > VARS_END + Debug_DestroyMenu_Full_Script(taskId, Debug_VarsNotSetBattleConfigMessage); #else - if (FlagGet(B_FLAG_NO_BAG_USE)) - PlaySE(SE_PC_OFF); - else - PlaySE(SE_PC_LOGIN); - FlagToggle(B_FLAG_NO_BAG_USE); + PlaySE(SE_SELECT); + VarSet(B_VAR_NO_BAG_USE, (VarGet(B_VAR_NO_BAG_USE) + 1) % 3); #endif } diff --git a/src/item_use.c b/src/item_use.c index 0681575f45..3e0e0dbeb6 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1133,7 +1133,7 @@ static u32 GetBallThrowableState(void) return BALL_THROW_UNABLE_NO_ROOM; else if (B_SEMI_INVULNERABLE_CATCH >= GEN_4 && IsSemiInvulnerable(GetCatchingBattler(), CHECK_ALL)) return BALL_THROW_UNABLE_SEMI_INVULNERABLE; - else if (FlagGet(B_FLAG_NO_CATCHING)) + else if (FlagGet(B_FLAG_NO_CATCHING) || !IsAllowedToUseBag()) return BALL_THROW_UNABLE_DISABLED_FLAG; return BALL_THROW_ABLE; diff --git a/src/overworld.c b/src/overworld.c index f9c949a571..7ce561bdae 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -429,10 +429,13 @@ void Overworld_ResetBattleFlagsAndVars(void) VarSet(B_VAR_WILD_AI_FLAGS,0); #endif + #if B_VAR_NO_BAG_USE != 0 + VarSet(B_VAR_NO_BAG_USE, 0); + #endif + FlagClear(B_FLAG_INVERSE_BATTLE); FlagClear(B_FLAG_FORCE_DOUBLE_WILD); FlagClear(B_SMART_WILD_AI_FLAG); - FlagClear(B_FLAG_NO_BAG_USE); FlagClear(B_FLAG_NO_CATCHING); FlagClear(B_FLAG_NO_RUNNING); FlagClear(B_FLAG_DYNAMAX_BATTLE); From 168e4210331dc48c1a2df5307b9265fe7dd3fe0d Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Thu, 2 Oct 2025 15:54:46 +0200 Subject: [PATCH 068/183] Remove two unused bits from battle structs (#7835) --- include/battle.h | 7 +++---- src/battle_main.c | 1 - src/battle_util.c | 2 -- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/include/battle.h b/include/battle.h index dcd680b584..99f5b6ba8e 100644 --- a/include/battle.h +++ b/include/battle.h @@ -149,7 +149,7 @@ struct ProtectStruct u32 chargingTurn:1; u32 fleeType:2; // 0: Normal, 1: FLEE_ITEM, 2: FLEE_ABILITY u32 unableToUseMove:1; // Not to be confused with HITMARKER_UNABLE_TO_USE_MOVE (It is questionable though if there is a difference. Needs further research) - u32 notFirstStrike:1; + u32 laggingTail:1; u32 palaceUnableToUseMove:1; u32 statRaised:1; u32 usedCustapBerry:1; // also quick claw @@ -168,8 +168,7 @@ struct ProtectStruct u16 lashOutAffected:1; u16 assuranceDoubled:1; u16 myceliumMight:1; - u16 laggingTail:1; - u16 padding:9; + u16 padding:10; // End of 16-bit bitfield u16 physicalDmg; u16 specialDmg; @@ -187,10 +186,10 @@ struct SpecialStatus u8 abilityRedirected:1; u8 restoredBattlerSprite: 1; u8 faintedHasReplacement:1; - u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects. u8 afterYou:1; u8 enduredDamage:1; u8 dancerUsedMove:1; + u8 padding:1; // End of byte u8 switchInAbilityDone:1; u8 switchInItemDone:1; diff --git a/src/battle_main.c b/src/battle_main.c index f7df02731d..f20ae5afaf 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3333,7 +3333,6 @@ const u8* FaintClearSetData(u32 battler) gProtectStructs[battler].confusionSelfDmg = FALSE; gProtectStructs[battler].chargingTurn = FALSE; gProtectStructs[battler].fleeType = 0; - gProtectStructs[battler].notFirstStrike = FALSE; gProtectStructs[battler].statRaised = FALSE; gProtectStructs[battler].pranksterElevated = FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 2d78576e35..5d9f1e469b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2477,8 +2477,6 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) ppToDeduct++; } - gProtectStructs[ctx->battlerAtk].notFirstStrike = TRUE; - // For item Metronome, echoed voice if (ctx->currentMove != gLastResultingMoves[ctx->battlerAtk] || WasUnableToUseMove(ctx->battlerAtk)) gBattleStruct->sameMoveTurns[ctx->battlerAtk] = 0; From 232503de4cb7558c1faf551c9abc09729d278b7f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 2 Oct 2025 14:55:39 -0300 Subject: [PATCH 069/183] Removed `SAVE_TYPE_ERROR_SCREEN` config (#7836) --- include/config/general.h | 3 +-- src/main.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/include/config/general.h b/include/config/general.h index aeeda8d3a1..5ce5c68040 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -6,7 +6,7 @@ // still has them in the ROM. This is because the developers forgot // to define NDEBUG before release, however this has been changed as // Ruby's actual debug build does not use the AGBPrint features. -// +// // Use `make release` to automatically enable NDEBUG. #ifdef RELEASE #define NDEBUG @@ -88,5 +88,4 @@ // Naming Screen #define AUTO_LOWERCASE_KEYBOARD GEN_LATEST // Starting in GEN_6, after entering the first uppercase character, the keyboard switches to lowercase letters. -#define SAVE_TYPE_ERROR_SCREEN FALSE // When enabled, this shows an error message when the game is loaded on a cart without a flash chip or on an emulator with the wrong save type setting instead of crashing. #endif // GUARD_CONFIG_GENERAL_H diff --git a/src/main.c b/src/main.c index 3fd080c75b..7abc47265e 100644 --- a/src/main.c +++ b/src/main.c @@ -116,7 +116,7 @@ void AgbMain(void) gSoftResetDisabled = FALSE; if (gFlashMemoryPresent != TRUE) - SetMainCallback2((SAVE_TYPE_ERROR_SCREEN) ? CB2_FlashNotDetectedScreen : NULL); + SetMainCallback2(CB2_FlashNotDetectedScreen); gLinkTransferringData = FALSE; From 730352683c38485da8c04102374b4605a04780b3 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Fri, 3 Oct 2025 20:26:49 +0200 Subject: [PATCH 070/183] Add new actions to Debug Menu (#7837) --- data/scripts/debug.inc | 24 ++++++++- data/specials.inc | 1 + include/debug.h | 3 ++ src/debug.c | 110 +++++++++++++++++++++++++++++++++++++++-- src/field_specials.c | 6 +++ 5 files changed, 138 insertions(+), 6 deletions(-) diff --git a/data/scripts/debug.inc b/data/scripts/debug.inc index 954902f3f3..921a3247e4 100644 --- a/data/scripts/debug.inc +++ b/data/scripts/debug.inc @@ -396,7 +396,29 @@ Debug_EventScript_SetHiddenNature:: dynmultistack 0, 0, TRUE, 7, FALSE, 0, NULL switch VAR_RESULT case MULTI_B_PRESSED, Debug_EventScript_InflictStatus1_Close - special SetHiddenNature + special SetHiddenNature + releaseall + end + +Debug_EventScript_SetAbility:: + special ChoosePartyMon + waitstate + callnative DebugNative_GetAbilityNames + dynmultipush gStringVar1, 0 + dynmultipush gStringVar2, 1 + dynmultipush gStringVar3, 2 + dynmultistack 0, 0, FALSE, 3 FALSE, 0, NULL + switch VAR_RESULT + case MULTI_B_PRESSED, Debug_EventScript_SetAbilityClose + special SetAbility +Debug_EventScript_SetAbilityClose: + releaseall + end + +Debug_EventScript_SetFriendship:: + special ChoosePartyMon + waitstate + callnative DebugNative_Party_SetFriendship releaseall end diff --git a/data/specials.inc b/data/specials.inc index 0a2ae2da50..072ae88c43 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -564,3 +564,4 @@ gSpecials:: def_special EnterCode def_special GetCodeFeedback def_special SetHiddenNature + def_special SetAbility diff --git a/include/debug.h b/include/debug.h index 11212ce97f..01be269c4d 100644 --- a/include/debug.h +++ b/include/debug.h @@ -6,6 +6,9 @@ extern const u8 Debug_FlagsAndVarNotSetBattleConfigMessage[]; const u8 *GetWeatherName(u32 weatherId); const struct Trainer* GetDebugAiTrainer(void); +void DebugNative_GetAbilityNames(void); +void DebugNative_Party_SetFriendship(void); + extern EWRAM_DATA bool8 gIsDebugBattle; extern EWRAM_DATA u64 gDebugAIFlags; diff --git a/src/debug.c b/src/debug.c index 1c727608c3..bd43d9621d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -236,6 +236,8 @@ static void Debug_DestroyMenu(u8 taskId); static void DebugAction_Cancel(u8 taskId); static void DebugAction_DestroyExtraWindow(u8 taskId); static void Debug_RefreshListMenu(u8 taskId); +static u8 DebugNativeStep_CreateDebugWindow(void); +static void DebugNativeStep_CloseDebugWindow(u8 taskId); static void DebugAction_OpenSubMenu(u8 taskId, const struct DebugMenuOption *items); static void DebugAction_OpenSubMenuFlagsVars(u8 taskId, const struct DebugMenuOption *items); @@ -348,6 +350,8 @@ extern const u8 Debug_EventScript_CheckEVs[]; extern const u8 Debug_EventScript_CheckIVs[]; extern const u8 Debug_EventScript_InflictStatus1[]; extern const u8 Debug_EventScript_SetHiddenNature[]; +extern const u8 Debug_EventScript_SetAbility[]; +extern const u8 Debug_EventScript_SetFriendship[]; extern const u8 Debug_EventScript_Script_1[]; extern const u8 Debug_EventScript_Script_2[]; extern const u8 Debug_EventScript_Script_3[]; @@ -576,6 +580,8 @@ static const struct DebugMenuOption sDebugMenu_Actions_Party[] = { COMPOUND_STRING("Heal party"), DebugAction_Party_HealParty }, { COMPOUND_STRING("Inflict Status1"), DebugAction_ExecuteScript, Debug_EventScript_InflictStatus1 }, { COMPOUND_STRING("Set Hidden Nature"), DebugAction_ExecuteScript, Debug_EventScript_SetHiddenNature }, + { COMPOUND_STRING("Set Friendship"), DebugAction_ExecuteScript, Debug_EventScript_SetFriendship }, + { COMPOUND_STRING("Set Ability"), DebugAction_ExecuteScript, Debug_EventScript_SetAbility }, { COMPOUND_STRING("Check EVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckEVs }, { COMPOUND_STRING("Check IVs"), DebugAction_ExecuteScript, Debug_EventScript_CheckIVs }, { COMPOUND_STRING("Clear Party"), DebugAction_Party_ClearParty }, @@ -939,6 +945,30 @@ static void DebugAction_DestroyExtraWindow(u8 taskId) UnfreezeObjectEvents(); } +static u8 DebugNativeStep_CreateDebugWindow(void) +{ + u8 windowId; + + LockPlayerFieldControls(); + FreezeObjectEvents(); + HideMapNamePopUpWindow(); + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sDebugMenuWindowTemplateExtra); + DrawStdWindowFrame(windowId, FALSE); + CopyWindowToVram(windowId, COPYWIN_FULL); + + return windowId; +} + +static void DebugNativeStep_CloseDebugWindow(u8 taskId) +{ + ClearStdWindowAndFrame(gTasks[taskId].tSubWindowId, TRUE); + RemoveWindow(gTasks[taskId].tSubWindowId); + DestroyTask(taskId); + UnfreezeObjectEvents(); + UnlockPlayerFieldControls(); +} + static const u16 sLocationFlags[] = { FLAG_VISITED_LITTLEROOT_TOWN, @@ -3390,11 +3420,6 @@ static void DebugAction_DestroyFollowerNPC(u8 taskId) #undef tCurrentSong -#undef tMenuTaskId -#undef tWindowId -#undef tSubWindowId -#undef tInput -#undef tDigit #define SOUND_LIST_BGM \ X(MUS_LITTLEROOT_TEST) \ @@ -4018,6 +4043,81 @@ static void DebugAction_Party_HealParty(u8 taskId) Debug_DestroyMenu_Full(taskId); } +void DebugNative_GetAbilityNames(void) +{ + u32 species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES); + StringCopy(gStringVar1, gAbilitiesInfo[GetAbilityBySpecies(species, 0)].name); + StringCopy(gStringVar2, gAbilitiesInfo[GetAbilityBySpecies(species, 1)].name); + StringCopy(gStringVar3, gAbilitiesInfo[GetAbilityBySpecies(species, 2)].name); +} + +#define tPartyId data[5] +#define tFriendship data[6] + +static void Debug_Display_FriendshipInfo(s32 oldFriendship, s32 newFriendship, u32 digit, u8 windowId) +{ + ConvertIntToDecimalStringN(gStringVar1, oldFriendship, STR_CONV_MODE_LEADING_ZEROS, 3); + ConvertIntToDecimalStringN(gStringVar2, newFriendship, STR_CONV_MODE_LEADING_ZEROS, 3); + StringCopy(gStringVar3, gText_DigitIndicator[digit]); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Friendship:\n{STR_VAR_1} {RIGHT_ARROW} {STR_VAR_2}\n\n{STR_VAR_3}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + +static void DebugNativeStep_Party_SetFriendshipSelect(u8 taskId) +{ + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + gTasks[taskId].tFriendship = gTasks[taskId].tInput; + SetMonData(&gPlayerParty[gTasks[taskId].tPartyId], MON_DATA_FRIENDSHIP, &gTasks[taskId].tInput); + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + DebugNativeStep_CloseDebugWindow(taskId); + return; + } + + Debug_HandleInput_Numeric(taskId, 0, 255, 3); + + if (JOY_NEW(DPAD_ANY) || JOY_NEW(A_BUTTON)) + Debug_Display_FriendshipInfo(gTasks[taskId].tFriendship, gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); +} + +static void DebugNativeStep_Party_SetFriendshipMain(u8 taskId) +{ + u8 windowId = DebugNativeStep_CreateDebugWindow(); + u32 friendship = GetMonData(&gPlayerParty[gTasks[taskId].tPartyId], MON_DATA_FRIENDSHIP); + + // Display initial flag + Debug_Display_FriendshipInfo(friendship, friendship, 0, windowId); + + gTasks[taskId].func = DebugNativeStep_Party_SetFriendshipSelect; + gTasks[taskId].tSubWindowId = windowId; + gTasks[taskId].tFriendship = friendship; + gTasks[taskId].tInput = friendship; + gTasks[taskId].tDigit = 0; + gTasks[taskId].tPartyId = 0; +} + +void DebugNative_Party_SetFriendship(void) +{ + if (gSpecialVar_0x8004 < PARTY_SIZE) + { + u32 taskId = CreateTask(DebugNativeStep_Party_SetFriendshipMain, 1); + gTasks[taskId].tPartyId = gSpecialVar_0x8004; + } +} + +#undef tPartyId +#undef tFriendship + +#undef tMenuTaskId +#undef tWindowId +#undef tSubWindowId +#undef tInput +#undef tDigit + static void DebugAction_Party_ClearParty(u8 taskId) { ZeroPlayerPartyMons(); diff --git a/src/field_specials.c b/src/field_specials.c index 09fca47899..3e2ff4c4e4 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -4368,3 +4368,9 @@ void SetHiddenNature(void) SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_HIDDEN_NATURE, &hiddenNature); CalculateMonStats(&gPlayerParty[gSpecialVar_0x8004]); } + +void SetAbility(void) +{ + u32 ability = gSpecialVar_Result; + SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_ABILITY_NUM, &ability); +} From a5956960867a1a4e099143375df2ece9117b03f6 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Sat, 4 Oct 2025 18:05:28 +0200 Subject: [PATCH 071/183] Update fishing odds to match official games (#7574) --- include/config/fishing.h | 13 + include/config/item.h | 9 - include/constants/wild_encounter.h | 3 - include/field_player_avatar.h | 2 +- include/fishing.h | 9 + include/random.h | 2 + src/battle_setup.c | 4 +- src/field_player_avatar.c | 674 +---------------------------- src/fishing.c | 650 ++++++++++++++++++++++++++++ src/item_use.c | 1 + src/pokemon.c | 5 +- src/wild_encounter.c | 18 +- 12 files changed, 682 insertions(+), 708 deletions(-) create mode 100644 include/config/fishing.h create mode 100644 include/fishing.h create mode 100644 src/fishing.c diff --git a/include/config/fishing.h b/include/config/fishing.h new file mode 100644 index 0000000000..0cbf666a54 --- /dev/null +++ b/include/config/fishing.h @@ -0,0 +1,13 @@ +#ifndef GUARD_CONFIG_FISHING_H +#define GUARD_CONFIG_FISHING_H + +#define I_FISHING_BITE_ODDS GEN_LATEST // In Gen 1 and Gen 2, the Old Rod has a 100% chance for a bite, Good Rod has a 66% chance for a bite, and Super Rod has a 50% chance for a bite. In Gen 3, all rods have a base 50% chance for a bite. In Gen 4 onwards, the Old Rod has a base 25% chance for a bite, Good Rod has a 50% chance for a bite, and Super Rod has a 75% chance for a bite. +#define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in Pokémon once they have been hooked. NOTE: Only the Gen 1/2 and Gen 3 minigames are implemented right now! +#define I_FISHING_ENVIRONMENT GEN_LATEST // In Gen 3, the battle environment when fighting a hooked Pokémon is based on the tile the player is standing on. In Gen 4 onwards, the environment is based on tile that is being fished in, resulting in it usually being a water environment. +#define I_FISHING_STICKY_BOOST GEN_LATEST // In Gen 3, a Pokemon with Suction Cups or Sticky Hold in the first slot of the party causes the chance for a bite to increase by about 35%. In Gen 4 onwards, it doubles the base bite chance. +#define I_FISHING_FOLLOWER_BOOST FALSE // In HGSS, fishing bite odds are increased depending on the friendship of the current following Pokémon. +#define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same Pokémon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. +#define I_FISHING_PROXIMITY FALSE // In XY, bite chance is boosted by the number of adjacent non-surfable tiles next to your fishing line +#define I_FISHING_TIME_OF_DAY_BOOST FALSE // In XY, bite chance is boosted during morning and evening + +#endif // GUARD_CONFIG_FISHING_H diff --git a/include/config/item.h b/include/config/item.h index 96156b0db8..6792f8979f 100644 --- a/include/config/item.h +++ b/include/config/item.h @@ -38,13 +38,4 @@ // Vs. Seeker #define I_VS_SEEKER_CHARGING 0 // If this flag is assigned, the Vs Seeker functionality will be enabled. When the player has the Vs. Seeker, Match Call rematch functions will stop working. -// Fishing -#define I_FISHING_BITE_ODDS GEN_LATEST // In Gen 1 and Gen 2, the Old Rod has a 100% chance for a bite, Good Rod has a 66% chance for a bite, and Super Rod has a 50% chance for a bite. In Gen 3, all rods have a base 50% chance for a bite. In Gen 4 onwards, the Old Rod has a base 25% chance for a bite, Good Rod has a 50% chance for a bite, and Super Rod has a 75% chance for a bite. -#define I_FISHING_MINIGAME GEN_3 // Each generation uses a variation of reeling in Pokémon once they have been hooked. NOTE: Only the Gen 1/2 and Gen 3 minigames are implemented right now! -#define I_FISHING_ENVIRONMENT GEN_LATEST // In Gen 3, the battle environment when fighting a hooked Pokémon is based on the tile the player is standing on. In Gen 4 onwards, the environment is based on tile that is being fished in, resulting in it usually being a water environment. -#define I_FISHING_STICKY_BOOST GEN_LATEST // In Gen 3, a Pokemon with Suction Cups or Sticky Hold in the first slot of the party causes the chance for a bite to increase by about 35%. In Gen 4 onwards, it doubles the base bite chance. -#define I_FISHING_FOLLOWER_BOOST FALSE // In HGSS, fishing bite odds are increased depending on the friendship of the current following Pokémon. -#define I_FISHING_CHAIN FALSE // Introduced in XY, hooking the same Pokémon repeatedly will increase the odds of that mon being shiny. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. -#define I_FISHING_PROXIMITY FALSE // Introduced in XY, fishing away from other people in enclosed areas will increase the chances of a Pokémon being hooked. NOTE: This implementation is an approximation of the actual feature, as XY have not been throughoutly documented or datamined. - #endif // GUARD_CONFIG_ITEM_H diff --git a/include/constants/wild_encounter.h b/include/constants/wild_encounter.h index 364d18350f..364dc7b35a 100644 --- a/include/constants/wild_encounter.h +++ b/include/constants/wild_encounter.h @@ -9,7 +9,4 @@ #define NUM_ALTERING_CAVE_TABLES 9 -#define FISHING_CHAIN_LENGTH_MAX 200 -#define FISHING_CHAIN_SHINY_STREAK_MAX 20 - #endif // GUARD_CONSTANTS_WILD_ENCOUNTER_H diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index cb7128f203..a6d56f62f7 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -64,7 +64,7 @@ bool32 IsPlayerSpinEntranceActive(void); bool32 IsPlayerSpinExitActive(void); void SetPlayerInvisibility(bool8 invisible); u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y); -void StartFishing(u8 rod); +void SetPlayerAvatarFishing(u8 direction); bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction); //sideways stairs u8 GetRightSideStairsDirection(u8 direction); diff --git a/include/fishing.h b/include/fishing.h new file mode 100644 index 0000000000..05ee236604 --- /dev/null +++ b/include/fishing.h @@ -0,0 +1,9 @@ +#ifndef GUARD_FISHING_H +#define GUARD_FISHING_H + +void StartFishing(u8 rod); +void UpdateChainFishingStreak(); +u32 CalculateChainFishingShinyRolls(void); +bool32 ShouldUseFishingEnvironmentInBattle(); + +#endif // GUARD_FISHING_H \ No newline at end of file diff --git a/include/random.h b/include/random.h index d7f707f320..3da116a3f2 100644 --- a/include/random.h +++ b/include/random.h @@ -219,6 +219,8 @@ enum RandomTag RNG_BALLTHROW_SHAKE, RNG_PRESENT, RNG_MAGNITUDE, + RNG_FISHING_BITE, + RNG_FISHING_GEN3_STICKY, }; #define RandomWeighted(tag, ...) \ diff --git a/src/battle_setup.c b/src/battle_setup.c index d755fc1b95..f5925d86d7 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -52,7 +52,7 @@ #include "constants/trainers.h" #include "constants/trainer_hill.h" #include "constants/weather.h" -#include "wild_encounter.h" +#include "fishing.h" enum { TRANSITION_TYPE_NORMAL, @@ -627,7 +627,7 @@ enum BattleEnvironments BattleSetup_GetEnvironmentId(void) u16 tileBehavior; s16 x, y; - if (I_FISHING_ENVIRONMENT >= GEN_4 && gIsFishingEncounter) + if (ShouldUseFishingEnvironmentInBattle()) GetXYCoordsOneStepInFrontOfPlayer(&x, &y); else PlayerGetDestCoords(&x, &y); diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 8bee9c7644..4633e38d82 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -146,40 +146,6 @@ static void CreateStopSurfingTask(u8); static void Task_StopSurfingInit(u8); static void Task_WaitStopSurfing(u8); -static void Task_Fishing(u8); -static bool32 Fishing_Init(struct Task *); -static bool32 Fishing_GetRodOut(struct Task *); -static bool32 Fishing_WaitBeforeDots(struct Task *); -static bool32 Fishing_InitDots(struct Task *); -static bool32 Fishing_ShowDots(struct Task *); -static bool32 Fishing_CheckForBite(struct Task *); -static bool32 Fishing_GotBite(struct Task *); -static bool32 Fishing_ChangeMinigame(struct Task *); -static bool32 Fishing_WaitForA(struct Task *); -static bool32 Fishing_APressNoMinigame(struct Task *); -static bool32 Fishing_CheckMoreDots(struct Task *); -static bool32 Fishing_MonOnHook(struct Task *); -static bool32 Fishing_StartEncounter(struct Task *); -static bool32 Fishing_NotEvenNibble(struct Task *); -static bool32 Fishing_GotAway(struct Task *); -static bool32 Fishing_NoMon(struct Task *); -static bool32 Fishing_PutRodAway(struct Task *); -static bool32 Fishing_EndNoMon(struct Task *); -static void AlignFishingAnimationFrames(void); -static bool32 DoesFishingMinigameAllowCancel(void); -static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void); -static bool32 Fishing_RollForBite(u32, bool32); -static u32 CalculateFishingBiteOdds(u32, bool32); -static u32 CalculateFishingFollowerBoost(void); -static u32 CalculateFishingProximityBoost(u32 odds); -static void GetCoordinatesAroundBobber(s16[], s16[][AXIS_COUNT], u32); -static u32 CountQualifyingTiles(s16[][AXIS_COUNT], s16 player[], u8 facingDirection, struct ObjectEvent *objectEvent, bool32 isTileLand[]); -static bool32 CheckTileQualification(s16 tile[], s16 player[], u32 facingDirection, struct ObjectEvent* objectEvent, bool32 isTileLand[], u32 direction); -static u32 CountLandTiles(bool32 isTileLand[]); -static bool32 IsPlayerHere(s16, s16, s16, s16); -static bool32 IsMetatileBlocking(s16, s16, u32); -static bool32 IsMetatileLand(s16, s16, u32); - static u8 TrySpinPlayerForWarp(struct ObjectEvent *, s16 *); static bool8 (*const sForcedMovementTestFuncs[NUM_FORCED_MOVEMENTS])(u8) = @@ -1663,7 +1629,7 @@ void SetPlayerAvatarFieldMove(void) StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], ANIM_FIELD_MOVE); } -static void SetPlayerAvatarFishing(u8 direction) +void SetPlayerAvatarFishing(u8 direction) { ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FISHING)); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingDirectionAnimNum(direction)); @@ -1933,644 +1899,6 @@ static void Task_WaitStopSurfing(u8 taskId) } } -#define tStep data[0] -#define tFrameCounter data[1] -#define tNumDots data[2] -#define tDotsRequired data[3] -#define tRoundsPlayed data[12] -#define tMinRoundsRequired data[13] -#define tPlayerGfxId data[14] -#define tFishingRod data[15] - -#define FISHING_PROXIMITY_BOOST 4 -#define FISHING_STICKY_BOOST 36 - -#if I_FISHING_BITE_ODDS >= GEN_4 - #define FISHING_OLD_ROD_ODDS 75 - #define FISHING_GOOD_ROD_ODDS 50 - #define FISHING_SUPER_ROD_ODDS 25 -#elif I_FISHING_BITE_ODDS >= GEN_3 - #define FISHING_OLD_ROD_ODDS 50 - #define FISHING_GOOD_ROD_ODDS 50 - #define FISHING_SUPER_ROD_ODDS 50 -#else - #define FISHING_OLD_ROD_ODDS 0 - #define FISHING_GOOD_ROD_ODDS 33 - #define FISHING_SUPER_ROD_ODDS 50 -#endif - -enum -{ - FISHING_INIT, - FISHING_GET_ROD_OUT, - FISHING_WAIT_BEFORE_DOTS, - FISHING_INIT_DOTS, - FISHING_SHOW_DOTS, - FISHING_CHECK_FOR_BITE, - FISHING_GOT_BITE, - FISHING_CHANGE_MINIGAME, - FISHING_WAIT_FOR_A, - FISHING_A_PRESS_NO_MINIGAME, - FISHING_CHECK_MORE_DOTS, - FISHING_MON_ON_HOOK, - FISHING_START_ENCOUNTER, - FISHING_NOT_EVEN_NIBBLE, - FISHING_GOT_AWAY, - FISHING_NO_MON, - FISHING_PUT_ROD_AWAY, - FISHING_END_NO_MON, -}; - -static bool32 (*const sFishingStateFuncs[])(struct Task *) = -{ - [FISHING_INIT] = Fishing_Init, - [FISHING_GET_ROD_OUT] = Fishing_GetRodOut, - [FISHING_WAIT_BEFORE_DOTS] = Fishing_WaitBeforeDots, - [FISHING_INIT_DOTS] = Fishing_InitDots, - [FISHING_SHOW_DOTS] = Fishing_ShowDots, - [FISHING_CHECK_FOR_BITE] = Fishing_CheckForBite, - [FISHING_GOT_BITE] = Fishing_GotBite, - [FISHING_CHANGE_MINIGAME] = Fishing_ChangeMinigame, - [FISHING_WAIT_FOR_A] = Fishing_WaitForA, - [FISHING_A_PRESS_NO_MINIGAME] = Fishing_APressNoMinigame, - [FISHING_CHECK_MORE_DOTS] = Fishing_CheckMoreDots, - [FISHING_MON_ON_HOOK] = Fishing_MonOnHook, - [FISHING_START_ENCOUNTER] = Fishing_StartEncounter, - [FISHING_NOT_EVEN_NIBBLE] = Fishing_NotEvenNibble, - [FISHING_GOT_AWAY] = Fishing_GotAway, - [FISHING_NO_MON] = Fishing_NoMon, - [FISHING_PUT_ROD_AWAY] = Fishing_PutRodAway, - [FISHING_END_NO_MON] = Fishing_EndNoMon, -}; - -void StartFishing(u8 rod) -{ - u8 taskId = CreateTask(Task_Fishing, 0xFF); - - gTasks[taskId].tFishingRod = rod; - Task_Fishing(taskId); -} - -static void Task_Fishing(u8 taskId) -{ - while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId])) - ; -} - -static bool32 Fishing_Init(struct Task *task) -{ - LockPlayerFieldControls(); - gPlayerAvatar.preventStep = TRUE; - task->tStep = FISHING_GET_ROD_OUT; - return FALSE; -} - -static bool32 Fishing_GetRodOut(struct Task *task) -{ - struct ObjectEvent *playerObjEvent; - const s16 minRounds1[] = { - [OLD_ROD] = 1, - [GOOD_ROD] = 1, - [SUPER_ROD] = 1 - }; - const s16 minRounds2[] = { - [OLD_ROD] = 1, - [GOOD_ROD] = 3, - [SUPER_ROD] = 6 - }; - - task->tRoundsPlayed = 0; - task->tMinRoundsRequired = minRounds1[task->tFishingRod] + (Random() % minRounds2[task->tFishingRod]); - task->tPlayerGfxId = gObjectEvents[gPlayerAvatar.objectEventId].graphicsId; - playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - ObjectEventClearHeldMovementIfActive(playerObjEvent); - playerObjEvent->enableAnim = TRUE; - SetPlayerAvatarFishing(playerObjEvent->facingDirection); - task->tStep = FISHING_WAIT_BEFORE_DOTS; - return FALSE; -} - -static bool32 Fishing_WaitBeforeDots(struct Task *task) -{ - AlignFishingAnimationFrames(); - - // Wait one second - task->tFrameCounter++; - if (task->tFrameCounter >= 60) - task->tStep = FISHING_INIT_DOTS; - return FALSE; -} - -static bool32 Fishing_InitDots(struct Task *task) -{ - u32 randVal; - - LoadMessageBoxAndFrameGfx(0, TRUE); - task->tStep = FISHING_SHOW_DOTS; - task->tFrameCounter = 0; - task->tNumDots = 0; - randVal = Random(); - randVal %= 10; - task->tDotsRequired = randVal + 1; - if (task->tRoundsPlayed == 0) - task->tDotsRequired = randVal + 4; - if (task->tDotsRequired >= 10) - task->tDotsRequired = 10; - return TRUE; -} - -static bool32 Fishing_ShowDots(struct Task *task) -{ - const u8 dot[] = _("·"); - - AlignFishingAnimationFrames(); - task->tFrameCounter++; - if (JOY_NEW(A_BUTTON)) - { - if (!DoesFishingMinigameAllowCancel()) - return FALSE; - - task->tStep = FISHING_NOT_EVEN_NIBBLE; - if (task->tRoundsPlayed != 0) - task->tStep = FISHING_GOT_AWAY; - return TRUE; - } - else - { - if (task->tFrameCounter >= 20) - { - task->tFrameCounter = 0; - if (task->tNumDots >= task->tDotsRequired) - { - task->tStep = FISHING_CHECK_FOR_BITE; - if (task->tRoundsPlayed != 0) - task->tStep = FISHING_GOT_BITE; - task->tRoundsPlayed++; - } - else - { - AddTextPrinterParameterized(0, FONT_NORMAL, dot, task->tNumDots * 8, 1, 0, NULL); - task->tNumDots++; - } - } - return FALSE; - } -} - -static bool32 Fishing_CheckForBite(struct Task *task) -{ - bool32 bite, firstMonHasSuctionOrSticky; - - AlignFishingAnimationFrames(); - task->tStep = FISHING_GOT_BITE; - bite = FALSE; - - if (!DoesCurrentMapHaveFishingMons()) - { - task->tStep = FISHING_NOT_EVEN_NIBBLE; - return TRUE; - } - - firstMonHasSuctionOrSticky = Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(); - - if(firstMonHasSuctionOrSticky) - bite = Fishing_RollForBite(task->tFishingRod, firstMonHasSuctionOrSticky); - - if (!bite) - bite = Fishing_RollForBite(task->tFishingRod, FALSE); - - if (!bite) - task->tStep = FISHING_NOT_EVEN_NIBBLE; - - if (bite) - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingBiteDirectionAnimNum(GetPlayerFacingDirection())); - - return TRUE; -} - -static bool32 Fishing_GotBite(struct Task *task) -{ - AlignFishingAnimationFrames(); - AddTextPrinterParameterized(0, FONT_NORMAL, gText_OhABite, 0, 17, 0, NULL); - task->tStep = FISHING_CHANGE_MINIGAME; - task->tFrameCounter = 0; - return FALSE; -} - -static bool32 Fishing_ChangeMinigame(struct Task *task) -{ - switch (I_FISHING_MINIGAME) - { - case GEN_1: - case GEN_2: - task->tStep = FISHING_A_PRESS_NO_MINIGAME; - break; - case GEN_3: - default: - task->tStep = FISHING_WAIT_FOR_A; - break; - } - return TRUE; -} - -// We have a bite. Now, wait for the player to press A, or the timer to expire. -static bool32 Fishing_WaitForA(struct Task *task) -{ - const s16 reelTimeouts[3] = { - [OLD_ROD] = 36, - [GOOD_ROD] = 33, - [SUPER_ROD] = 30 - }; - - AlignFishingAnimationFrames(); - task->tFrameCounter++; - if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) - task->tStep = FISHING_GOT_AWAY; - else if (JOY_NEW(A_BUTTON)) - task->tStep = FISHING_CHECK_MORE_DOTS; - return FALSE; -} - -static bool32 Fishing_APressNoMinigame(struct Task *task) -{ - AlignFishingAnimationFrames(); - if (JOY_NEW(A_BUTTON)) - task->tStep = FISHING_MON_ON_HOOK; - return FALSE; -} - -// Determine if we're going to play the dot game again -static bool32 Fishing_CheckMoreDots(struct Task *task) -{ - const s16 moreDotsChance[][2] = - { - [OLD_ROD] = {0, 0}, - [GOOD_ROD] = {40, 10}, - [SUPER_ROD] = {70, 30} - }; - - AlignFishingAnimationFrames(); - task->tStep = FISHING_MON_ON_HOOK; - if (task->tRoundsPlayed < task->tMinRoundsRequired) - { - task->tStep = FISHING_INIT_DOTS; - } - else if (task->tRoundsPlayed < 2) - { - // probability of having to play another round - s16 probability = Random() % 100; - - if (moreDotsChance[task->tFishingRod][task->tRoundsPlayed] > probability) - task->tStep = FISHING_INIT_DOTS; - } - return FALSE; -} - -static bool32 Fishing_MonOnHook(struct Task *task) -{ - AlignFishingAnimationFrames(); - FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PokemonOnHook, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - task->tStep = FISHING_START_ENCOUNTER; - task->tFrameCounter = 0; - return FALSE; -} - -static bool32 Fishing_StartEncounter(struct Task *task) -{ - if (task->tFrameCounter == 0) - AlignFishingAnimationFrames(); - - RunTextPrinters(); - - if (task->tFrameCounter == 0) - { - if (!IsTextPrinterActive(0)) - { - struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - - ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); - ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); - gSprites[gPlayerAvatar.spriteId].x2 = 0; - gSprites[gPlayerAvatar.spriteId].y2 = 0; - ClearDialogWindowAndFrame(0, TRUE); - task->tFrameCounter++; - return FALSE; - } - } - - if (task->tFrameCounter != 0) - { - gPlayerAvatar.preventStep = FALSE; - UnlockPlayerFieldControls(); - FishingWildEncounter(task->tFishingRod); - RecordFishingAttemptForTV(TRUE); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - } - return FALSE; -} - -static bool32 Fishing_NotEvenNibble(struct Task *task) -{ - gChainFishingDexNavStreak = 0; - AlignFishingAnimationFrames(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); - FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, FONT_NORMAL, gText_NotEvenANibble, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - task->tStep = FISHING_NO_MON; - return TRUE; -} - -static bool32 Fishing_GotAway(struct Task *task) -{ - gChainFishingDexNavStreak = 0; - AlignFishingAnimationFrames(); - StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); - FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, FONT_NORMAL, gText_ItGotAway, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); - task->tStep = FISHING_NO_MON; - return TRUE; -} - -static bool32 Fishing_NoMon(struct Task *task) -{ - AlignFishingAnimationFrames(); - task->tStep = FISHING_PUT_ROD_AWAY; - return FALSE; -} - -static bool32 Fishing_PutRodAway(struct Task *task) -{ - AlignFishingAnimationFrames(); - if (gSprites[gPlayerAvatar.spriteId].animEnded) - { - struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - - ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); - ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); - gSprites[gPlayerAvatar.spriteId].x2 = 0; - gSprites[gPlayerAvatar.spriteId].y2 = 0; - task->tStep = FISHING_END_NO_MON; - } - return FALSE; -} - -static bool32 Fishing_EndNoMon(struct Task *task) -{ - RunTextPrinters(); - if (!IsTextPrinterActive(0)) - { - gPlayerAvatar.preventStep = FALSE; - UnlockPlayerFieldControls(); - UnfreezeObjectEvents(); - ClearDialogWindowAndFrame(0, TRUE); - RecordFishingAttemptForTV(FALSE); - DestroyTask(FindTaskIdByFunc(Task_Fishing)); - } - return FALSE; -} - -static bool32 DoesFishingMinigameAllowCancel(void) -{ - switch(I_FISHING_MINIGAME) - { - case GEN_1: - case GEN_2: - return FALSE; - case GEN_3: - default: - return TRUE; - } -} - -static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void) -{ - enum Ability ability; - - if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) - return FALSE; - - ability = GetMonAbility(&gPlayerParty[0]); - - return (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD); -} - -static bool32 Fishing_RollForBite(u32 rod, bool32 isStickyHold) -{ - return ((Random() % 100) > CalculateFishingBiteOdds(rod, isStickyHold)); -} - -static u32 CalculateFishingBiteOdds(u32 rod, bool32 isStickyHold) -{ - u32 odds; - - if (rod == OLD_ROD) - odds = FISHING_OLD_ROD_ODDS; - if (rod == GOOD_ROD) - odds = FISHING_GOOD_ROD_ODDS; - if (rod == SUPER_ROD) - odds = FISHING_SUPER_ROD_ODDS; - - odds -= CalculateFishingFollowerBoost(); - - if (isStickyHold) - { - if (I_FISHING_STICKY_BOOST >= GEN_4) - odds -= (100 - odds); - else - odds -= FISHING_STICKY_BOOST; - } - - odds -= CalculateFishingProximityBoost(odds); - - return odds; -} - -static u32 CalculateFishingFollowerBoost() -{ - u32 friendship; - struct Pokemon *mon = GetFirstLiveMon(); - - if (!I_FISHING_FOLLOWER_BOOST || !mon) - return 0; - - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); - if (friendship >= 250) - return 50; - else if (friendship >= 200) - return 40; - else if (friendship >= 150) - return 30; - else if (friendship >= 100) - return 20; - else - return 0; -} - -static u32 CalculateFishingProximityBoost(u32 odds) -{ - s16 player[AXIS_COUNT], bobber[AXIS_COUNT]; - s16 surroundingTile[CARDINAL_DIRECTION_COUNT][AXIS_COUNT] = {{0, 0}}; - bool32 isTileLand[CARDINAL_DIRECTION_COUNT] = {FALSE}; - u32 facingDirection, numQualifyingTile = 0; - struct ObjectEvent *objectEvent; - - if (!I_FISHING_PROXIMITY) - return 0; - - objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - - player[AXIS_X] = objectEvent->currentCoords.x; - player[AXIS_Y] = objectEvent->currentCoords.y; - bobber[AXIS_X] = objectEvent->currentCoords.x; - bobber[AXIS_Y] = objectEvent->currentCoords.y; - - facingDirection = GetPlayerFacingDirection(); - MoveCoords(facingDirection, &bobber[AXIS_X], &bobber[AXIS_Y]); - - GetCoordinatesAroundBobber(bobber, surroundingTile, facingDirection); - numQualifyingTile = CountQualifyingTiles(surroundingTile, player, facingDirection, objectEvent, isTileLand); - - numQualifyingTile += CountLandTiles(isTileLand); - - return (numQualifyingTile == 3) ? odds : (numQualifyingTile * FISHING_PROXIMITY_BOOST); -} - -static void GetCoordinatesAroundBobber(s16 bobber[], s16 surroundingTile[][AXIS_COUNT], u32 facingDirection) -{ - u32 direction; - - for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) - { - surroundingTile[direction][AXIS_X] = bobber[AXIS_X]; - surroundingTile[direction][AXIS_Y] = bobber[AXIS_Y]; - MoveCoords(direction, &surroundingTile[direction][AXIS_X], &surroundingTile[direction][AXIS_Y]); - } -} - -static u32 CountQualifyingTiles(s16 surroundingTile[][AXIS_COUNT], s16 player[], u8 facingDirection, struct ObjectEvent *objectEvent, bool32 isTileLand[]) -{ - u32 numQualifyingTile = 0; - s16 tile[AXIS_COUNT]; - u8 direction = DIR_SOUTH; - - for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) - { - tile[AXIS_X] = surroundingTile[direction][AXIS_X]; - tile[AXIS_Y] = surroundingTile[direction][AXIS_Y]; - - if (!CheckTileQualification(tile, player, facingDirection, objectEvent, isTileLand, direction)) - continue; - - numQualifyingTile++; - } - return numQualifyingTile; -} - -static bool32 CheckTileQualification(s16 tile[], s16 player[], u32 facingDirection, struct ObjectEvent* objectEvent, bool32 isTileLand[], u32 direction) -{ - u32 collison = GetCollisionAtCoords(objectEvent, tile[AXIS_X], tile[AXIS_Y], facingDirection); - - if (IsPlayerHere(tile[AXIS_X], tile[AXIS_Y], player[AXIS_X], player[AXIS_Y])) - return FALSE; - else if (IsMetatileBlocking(tile[AXIS_X], tile[AXIS_Y], collison)) - return TRUE; - else if (MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(tile[AXIS_X], tile[AXIS_Y]))) - return FALSE; - else if (IsMetatileLand(tile[AXIS_X], tile[AXIS_Y], collison)) - isTileLand[direction] = TRUE; - - return FALSE; -} - -static u32 CountLandTiles(bool32 isTileLand[]) -{ - u32 direction, numQualifyingTile = 0; - - for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) - if (isTileLand[direction]) - numQualifyingTile++; - - return (numQualifyingTile < 2) ? 0 : numQualifyingTile; -} - -static bool32 IsPlayerHere(s16 x, s16 y, s16 playerX, s16 playerY) -{ - return ((x == playerX) && (y == playerY)); -} - -static bool32 IsMetatileBlocking(s16 x, s16 y, u32 collison) -{ - switch(collison) - { - case COLLISION_NONE: - case COLLISION_STOP_SURFING: - case COLLISION_ELEVATION_MISMATCH: - return FALSE; - default: - return TRUE; - case COLLISION_OBJECT_EVENT: - return (gObjectEvents[GetObjectEventIdByXY(x,y)].inanimate); - } - return TRUE; -} - -static bool32 IsMetatileLand(s16 x, s16 y, u32 collison) -{ - switch(collison) - { - case COLLISION_NONE: - case COLLISION_STOP_SURFING: - case COLLISION_ELEVATION_MISMATCH: - return TRUE; - default: - return FALSE; - } -} - -#undef tStep -#undef tFrameCounter -#undef tFishingRod - -static void AlignFishingAnimationFrames(void) -{ - struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; - u8 animCmdIndex; - u8 animType; - - AnimateSprite(playerSprite); - playerSprite->x2 = 0; - playerSprite->y2 = 0; - animCmdIndex = playerSprite->animCmdIndex; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - { - animCmdIndex--; - } - else - { - playerSprite->animDelayCounter++; - if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) - animCmdIndex--; - } - animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; - if (animType == 1 || animType == 2 || animType == 3) - { - playerSprite->x2 = 8; - if (GetPlayerFacingDirection() == 3) - playerSprite->x2 = -8; - } - if (animType == 5) - playerSprite->y2 = -8; - if (animType == 10 || animType == 11) - playerSprite->y2 = 8; - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, TRUE, playerSprite->y2); -} - void SetSpinStartFacingDir(u8 direction) { sSpinStartFacingDir = direction; diff --git a/src/fishing.c b/src/fishing.c new file mode 100644 index 0000000000..7730351abb --- /dev/null +++ b/src/fishing.c @@ -0,0 +1,650 @@ +#include "global.h" +#include "main.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "field_effect_helpers.h" +#include "field_player_avatar.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "random.h" +#include "script.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "tv.h" +#include "wild_encounter.h" +#include "config/fishing.h" + +static void Task_Fishing(u8); +static bool32 Fishing_Init(struct Task *); +static bool32 Fishing_GetRodOut(struct Task *); +static bool32 Fishing_WaitBeforeDots(struct Task *); +static bool32 Fishing_InitDots(struct Task *); +static bool32 Fishing_ShowDots(struct Task *); +static bool32 Fishing_CheckForBite(struct Task *); +static bool32 Fishing_GotBite(struct Task *); +static bool32 Fishing_ChangeMinigame(struct Task *); +static bool32 Fishing_WaitForA(struct Task *); +static bool32 Fishing_APressNoMinigame(struct Task *); +static bool32 Fishing_CheckMoreDots(struct Task *); +static bool32 Fishing_MonOnHook(struct Task *); +static bool32 Fishing_StartEncounter(struct Task *); +static bool32 Fishing_NotEvenNibble(struct Task *); +static bool32 Fishing_GotAway(struct Task *); +static bool32 Fishing_NoMon(struct Task *); +static bool32 Fishing_PutRodAway(struct Task *); +static bool32 Fishing_EndNoMon(struct Task *); +static void AlignFishingAnimationFrames(void); +static bool32 DoesFishingMinigameAllowCancel(void); +static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void); +static bool32 Fishing_RollForBite(u32, bool32); +static u32 CalculateFishingBiteOdds(u32, bool32); +static u32 CalculateFishingFollowerBoost(void); +static u32 CalculateFishingProximityBoost(void); +static u32 CalculateFishingTimeOfDayBoost(void); + +#define FISHING_PROXIMITY_BOOST 20 //Active if config I_FISHING_PROXIMITY is TRUE +#define FISHING_TIME_OF_DAY_BOOST 20 //Active if config I_FISHING_TIME_OF_DAY_BOOST is TRUE +#define FISHING_GEN3_STICKY_CHANCE 85 //Active if config I_FISHING_STICKY_BOOST is set to GEN_3 or lower + +#if I_FISHING_BITE_ODDS >= GEN_4 + #define FISHING_OLD_ROD_ODDS 25 + #define FISHING_GOOD_ROD_ODDS 50 + #define FISHING_SUPER_ROD_ODDS 75 +#elif I_FISHING_BITE_ODDS >= GEN_3 + #define FISHING_OLD_ROD_ODDS 50 + #define FISHING_GOOD_ROD_ODDS 50 + #define FISHING_SUPER_ROD_ODDS 50 +#else + #define FISHING_OLD_ROD_ODDS 100 + #define FISHING_GOOD_ROD_ODDS 33 + #define FISHING_SUPER_ROD_ODDS 50 +#endif + +struct FriendshipHookChanceBoost +{ + u8 threshold; + u8 bonus; +}; + +//Needs to be defined in descending order and end with the 0 friendship boost +//Active if config I_FISHING_FOLLOWER_BOOST is TRUE +static const struct FriendshipHookChanceBoost sFriendshipHookChanceBoostArray[] = +{ + {.threshold = 250, .bonus = 50}, + {.threshold = 200, .bonus = 40}, + {.threshold = 150, .bonus = 30}, + {.threshold = 100, .bonus = 20}, + {.threshold = 0, .bonus = 0}, +}; + +#define FISHING_CHAIN_SHINY_STREAK_MAX 20 + +enum +{ + FISHING_INIT, + FISHING_GET_ROD_OUT, + FISHING_WAIT_BEFORE_DOTS, + FISHING_INIT_DOTS, + FISHING_SHOW_DOTS, + FISHING_CHECK_FOR_BITE, + FISHING_GOT_BITE, + FISHING_CHANGE_MINIGAME, + FISHING_WAIT_FOR_A, + FISHING_A_PRESS_NO_MINIGAME, + FISHING_CHECK_MORE_DOTS, + FISHING_MON_ON_HOOK, + FISHING_START_ENCOUNTER, + FISHING_NOT_EVEN_NIBBLE, + FISHING_GOT_AWAY, + FISHING_NO_MON, + FISHING_PUT_ROD_AWAY, + FISHING_END_NO_MON, +}; + +static bool32 (*const sFishingStateFuncs[])(struct Task *) = +{ + [FISHING_INIT] = Fishing_Init, + [FISHING_GET_ROD_OUT] = Fishing_GetRodOut, + [FISHING_WAIT_BEFORE_DOTS] = Fishing_WaitBeforeDots, + [FISHING_INIT_DOTS] = Fishing_InitDots, + [FISHING_SHOW_DOTS] = Fishing_ShowDots, + [FISHING_CHECK_FOR_BITE] = Fishing_CheckForBite, + [FISHING_GOT_BITE] = Fishing_GotBite, + [FISHING_CHANGE_MINIGAME] = Fishing_ChangeMinigame, + [FISHING_WAIT_FOR_A] = Fishing_WaitForA, + [FISHING_A_PRESS_NO_MINIGAME] = Fishing_APressNoMinigame, + [FISHING_CHECK_MORE_DOTS] = Fishing_CheckMoreDots, + [FISHING_MON_ON_HOOK] = Fishing_MonOnHook, + [FISHING_START_ENCOUNTER] = Fishing_StartEncounter, + [FISHING_NOT_EVEN_NIBBLE] = Fishing_NotEvenNibble, + [FISHING_GOT_AWAY] = Fishing_GotAway, + [FISHING_NO_MON] = Fishing_NoMon, + [FISHING_PUT_ROD_AWAY] = Fishing_PutRodAway, + [FISHING_END_NO_MON] = Fishing_EndNoMon, +}; + +#define tStep data[0] +#define tFrameCounter data[1] +#define tNumDots data[2] +#define tDotsRequired data[3] +#define tRoundsPlayed data[12] +#define tMinRoundsRequired data[13] +#define tPlayerGfxId data[14] +#define tFishingRod data[15] + +void StartFishing(u8 rod) +{ + u8 taskId = CreateTask(Task_Fishing, 0xFF); + + gTasks[taskId].tFishingRod = rod; + Task_Fishing(taskId); +} + +static void Task_Fishing(u8 taskId) +{ + while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId])) + ; +} + +static bool32 Fishing_Init(struct Task *task) +{ + LockPlayerFieldControls(); + gPlayerAvatar.preventStep = TRUE; + task->tStep = FISHING_GET_ROD_OUT; + return FALSE; +} + +static bool32 Fishing_GetRodOut(struct Task *task) +{ + struct ObjectEvent *playerObjEvent; + const s16 minRounds1[] = { + [OLD_ROD] = 1, + [GOOD_ROD] = 1, + [SUPER_ROD] = 1 + }; + const s16 minRounds2[] = { + [OLD_ROD] = 1, + [GOOD_ROD] = 3, + [SUPER_ROD] = 6 + }; + + task->tRoundsPlayed = 0; + task->tMinRoundsRequired = minRounds1[task->tFishingRod] + (Random() % minRounds2[task->tFishingRod]); + task->tPlayerGfxId = gObjectEvents[gPlayerAvatar.objectEventId].graphicsId; + playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + ObjectEventClearHeldMovementIfActive(playerObjEvent); + playerObjEvent->enableAnim = TRUE; + SetPlayerAvatarFishing(playerObjEvent->facingDirection); + task->tStep = FISHING_WAIT_BEFORE_DOTS; + return FALSE; +} + +static bool32 Fishing_WaitBeforeDots(struct Task *task) +{ + AlignFishingAnimationFrames(); + + // Wait one second + task->tFrameCounter++; + if (task->tFrameCounter >= 60) + task->tStep = FISHING_INIT_DOTS; + return FALSE; +} + +static bool32 Fishing_InitDots(struct Task *task) +{ + u32 randVal; + + LoadMessageBoxAndFrameGfx(0, TRUE); + task->tStep = FISHING_SHOW_DOTS; + task->tFrameCounter = 0; + task->tNumDots = 0; + randVal = Random(); + randVal %= 10; + task->tDotsRequired = randVal + 1; + if (task->tRoundsPlayed == 0) + task->tDotsRequired = randVal + 4; + if (task->tDotsRequired >= 10) + task->tDotsRequired = 10; + return TRUE; +} + +static bool32 Fishing_ShowDots(struct Task *task) +{ + const u8 dot[] = _("·"); + + AlignFishingAnimationFrames(); + task->tFrameCounter++; + if (JOY_NEW(A_BUTTON)) + { + if (!DoesFishingMinigameAllowCancel()) + return FALSE; + + task->tStep = FISHING_NOT_EVEN_NIBBLE; + if (task->tRoundsPlayed != 0) + task->tStep = FISHING_GOT_AWAY; + return TRUE; + } + else + { + if (task->tFrameCounter >= 20) + { + task->tFrameCounter = 0; + if (task->tNumDots >= task->tDotsRequired) + { + task->tStep = FISHING_CHECK_FOR_BITE; + if (task->tRoundsPlayed != 0) + task->tStep = FISHING_GOT_BITE; + task->tRoundsPlayed++; + } + else + { + AddTextPrinterParameterized(0, FONT_NORMAL, dot, task->tNumDots * 8, 1, 0, NULL); + task->tNumDots++; + } + } + return FALSE; + } +} + +static bool32 Fishing_CheckForBite(struct Task *task) +{ + bool32 bite, firstMonHasSuctionOrSticky; + + AlignFishingAnimationFrames(); + task->tStep = FISHING_GOT_BITE; + bite = FALSE; + + if (!DoesCurrentMapHaveFishingMons()) + { + task->tStep = FISHING_NOT_EVEN_NIBBLE; + return TRUE; + } + + firstMonHasSuctionOrSticky = Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(); + + if(firstMonHasSuctionOrSticky && I_FISHING_STICKY_BOOST < GEN_4) + bite = RandomPercentage(RNG_FISHING_GEN3_STICKY, FISHING_GEN3_STICKY_CHANCE); + + if (!bite) + bite = Fishing_RollForBite(task->tFishingRod, firstMonHasSuctionOrSticky); + + if (!bite) + task->tStep = FISHING_NOT_EVEN_NIBBLE; + + if (bite) + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingBiteDirectionAnimNum(GetPlayerFacingDirection())); + + return TRUE; +} + +static bool32 Fishing_GotBite(struct Task *task) +{ + AlignFishingAnimationFrames(); + AddTextPrinterParameterized(0, FONT_NORMAL, gText_OhABite, 0, 17, 0, NULL); + task->tStep = FISHING_CHANGE_MINIGAME; + task->tFrameCounter = 0; + return FALSE; +} + +static bool32 Fishing_ChangeMinigame(struct Task *task) +{ + switch (I_FISHING_MINIGAME) + { + case GEN_1: + case GEN_2: + task->tStep = FISHING_A_PRESS_NO_MINIGAME; + break; + case GEN_3: + default: + task->tStep = FISHING_WAIT_FOR_A; + break; + } + return TRUE; +} + +// We have a bite. Now, wait for the player to press A, or the timer to expire. +static bool32 Fishing_WaitForA(struct Task *task) +{ + const s16 reelTimeouts[3] = { + [OLD_ROD] = 36, + [GOOD_ROD] = 33, + [SUPER_ROD] = 30 + }; + + AlignFishingAnimationFrames(); + task->tFrameCounter++; + if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) + task->tStep = FISHING_GOT_AWAY; + else if (JOY_NEW(A_BUTTON)) + task->tStep = FISHING_CHECK_MORE_DOTS; + return FALSE; +} + +static bool32 Fishing_APressNoMinigame(struct Task *task) +{ + AlignFishingAnimationFrames(); + if (JOY_NEW(A_BUTTON)) + task->tStep = FISHING_MON_ON_HOOK; + return FALSE; +} + +// Determine if we're going to play the dot game again +static bool32 Fishing_CheckMoreDots(struct Task *task) +{ + const s16 moreDotsChance[][2] = + { + [OLD_ROD] = {0, 0}, + [GOOD_ROD] = {40, 10}, + [SUPER_ROD] = {70, 30} + }; + + AlignFishingAnimationFrames(); + task->tStep = FISHING_MON_ON_HOOK; + if (task->tRoundsPlayed < task->tMinRoundsRequired) + { + task->tStep = FISHING_INIT_DOTS; + } + else if (task->tRoundsPlayed < 2) + { + // probability of having to play another round + s16 probability = Random() % 100; + + if (moreDotsChance[task->tFishingRod][task->tRoundsPlayed] > probability) + task->tStep = FISHING_INIT_DOTS; + } + return FALSE; +} + +static bool32 Fishing_MonOnHook(struct Task *task) +{ + AlignFishingAnimationFrames(); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized2(0, FONT_NORMAL, gText_PokemonOnHook, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); + task->tStep = FISHING_START_ENCOUNTER; + task->tFrameCounter = 0; + return FALSE; +} + +static bool32 Fishing_StartEncounter(struct Task *task) +{ + if (task->tFrameCounter == 0) + AlignFishingAnimationFrames(); + + RunTextPrinters(); + + if (task->tFrameCounter == 0) + { + if (!IsTextPrinterActive(0)) + { + struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); + ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); + gSprites[gPlayerAvatar.spriteId].x2 = 0; + gSprites[gPlayerAvatar.spriteId].y2 = 0; + ClearDialogWindowAndFrame(0, TRUE); + task->tFrameCounter++; + return FALSE; + } + } + + if (task->tFrameCounter != 0) + { + gPlayerAvatar.preventStep = FALSE; + UnlockPlayerFieldControls(); + FishingWildEncounter(task->tFishingRod); + RecordFishingAttemptForTV(TRUE); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + } + return FALSE; +} + +static bool32 Fishing_NotEvenNibble(struct Task *task) +{ + gChainFishingDexNavStreak = 0; + AlignFishingAnimationFrames(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized2(0, FONT_NORMAL, gText_NotEvenANibble, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); + task->tStep = FISHING_NO_MON; + return TRUE; +} + +static bool32 Fishing_GotAway(struct Task *task) +{ + gChainFishingDexNavStreak = 0; + AlignFishingAnimationFrames(); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized2(0, FONT_NORMAL, gText_ItGotAway, 1, 0, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); + task->tStep = FISHING_NO_MON; + return TRUE; +} + +static bool32 Fishing_NoMon(struct Task *task) +{ + AlignFishingAnimationFrames(); + task->tStep = FISHING_PUT_ROD_AWAY; + return FALSE; +} + +static bool32 Fishing_PutRodAway(struct Task *task) +{ + AlignFishingAnimationFrames(); + if (gSprites[gPlayerAvatar.spriteId].animEnded) + { + struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); + ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); + gSprites[gPlayerAvatar.spriteId].x2 = 0; + gSprites[gPlayerAvatar.spriteId].y2 = 0; + task->tStep = FISHING_END_NO_MON; + } + return FALSE; +} + +static bool32 Fishing_EndNoMon(struct Task *task) +{ + RunTextPrinters(); + if (!IsTextPrinterActive(0)) + { + gPlayerAvatar.preventStep = FALSE; + UnlockPlayerFieldControls(); + UnfreezeObjectEvents(); + ClearDialogWindowAndFrame(0, TRUE); + RecordFishingAttemptForTV(FALSE); + DestroyTask(FindTaskIdByFunc(Task_Fishing)); + } + return FALSE; +} + +static bool32 DoesFishingMinigameAllowCancel(void) +{ + switch(I_FISHING_MINIGAME) + { + case GEN_1: + case GEN_2: + return FALSE; + case GEN_3: + default: + return TRUE; + } +} + +static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void) +{ + enum Ability ability; + + if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) + return FALSE; + + ability = GetMonAbility(&gPlayerParty[0]); + + return (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD); +} + +static bool32 Fishing_RollForBite(u32 rod, bool32 isStickyHold) +{ + return ((RandomUniform(RNG_FISHING_BITE, 1, 100)) <= CalculateFishingBiteOdds(rod, isStickyHold)); +} + +static u32 CalculateFishingBiteOdds(u32 rod, bool32 isStickyHold) +{ + u32 odds; + + if (rod == OLD_ROD) + odds = FISHING_OLD_ROD_ODDS; + if (rod == GOOD_ROD) + odds = FISHING_GOOD_ROD_ODDS; + if (rod == SUPER_ROD) + odds = FISHING_SUPER_ROD_ODDS; + + odds += CalculateFishingFollowerBoost(); + odds += CalculateFishingProximityBoost(); + odds += CalculateFishingTimeOfDayBoost(); + + if (isStickyHold && I_FISHING_STICKY_BOOST >= GEN_4) + odds *= 2; + + odds = min(100, odds); + DebugPrintf("Fishing odds: %d", odds); + return odds; +} + +static u32 CalculateFishingFollowerBoost() +{ + u32 friendship; + struct Pokemon *mon = GetFirstLiveMon(); + + if (!I_FISHING_FOLLOWER_BOOST || !mon) + return 0; + + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); + for (u32 i = 0;; i++) + { + if (friendship >= sFriendshipHookChanceBoostArray[i].threshold) + return sFriendshipHookChanceBoostArray[i].bonus; + } +} + +static u32 CalculateFishingProximityBoost() +{ + s16 bobber_x, bobber_y, tile_x, tile_y; + u32 direction, facingDirection, numQualifyingTile = 0; + struct ObjectEvent *objectEvent; + + if (!I_FISHING_PROXIMITY) + return 0; + + objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + bobber_x = objectEvent->currentCoords.x; + bobber_y = objectEvent->currentCoords.y; + + facingDirection = GetPlayerFacingDirection(); + MoveCoords(facingDirection, &bobber_x, &bobber_y); + + numQualifyingTile = 0; + for (direction = DIR_SOUTH; direction < CARDINAL_DIRECTION_COUNT; direction++) + { + tile_x = bobber_x; + tile_y = bobber_y; + MoveCoords(direction, &tile_x, &tile_y); + if (tile_x == objectEvent->currentCoords.x && tile_y == objectEvent->currentCoords.y) + continue; + if (!MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(tile_x, tile_y))) + numQualifyingTile++; + else if (MapGridGetCollisionAt(tile_x, tile_y)) + numQualifyingTile++; + else if (GetMapBorderIdAt(tile_x, tile_y) == -1) + numQualifyingTile++; + } + + return (numQualifyingTile * FISHING_PROXIMITY_BOOST); +} + +static u32 CalculateFishingTimeOfDayBoost() +{ + if (!I_FISHING_TIME_OF_DAY_BOOST) + return 0; + + enum TimeOfDay timeOfDay = GetTimeOfDay(); + if (timeOfDay == TIME_MORNING || timeOfDay == TIME_EVENING) + return FISHING_TIME_OF_DAY_BOOST; + return 0; +} + +#undef tStep +#undef tFrameCounter +#undef tNumDots +#undef tDotsRequired +#undef tRoundsPlayed +#undef tMinRoundsRequired +#undef tPlayerGfxId +#undef tFishingRod + +static void AlignFishingAnimationFrames(void) +{ + struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; + u8 animCmdIndex; + u8 animType; + + AnimateSprite(playerSprite); + playerSprite->x2 = 0; + playerSprite->y2 = 0; + animCmdIndex = playerSprite->animCmdIndex; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + { + animCmdIndex--; + } + else + { + playerSprite->animDelayCounter++; + if (playerSprite->anims[playerSprite->animNum][animCmdIndex].type == -1) + animCmdIndex--; + } + animType = playerSprite->anims[playerSprite->animNum][animCmdIndex].type; + if (animType == 1 || animType == 2 || animType == 3) + { + playerSprite->x2 = 8; + if (GetPlayerFacingDirection() == 3) + playerSprite->x2 = -8; + } + if (animType == 5) + playerSprite->y2 = -8; + if (animType == 10 || animType == 11) + playerSprite->y2 = 8; + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, TRUE, playerSprite->y2); +} + +void UpdateChainFishingStreak() +{ + if (!I_FISHING_CHAIN) + return; + + if (gChainFishingDexNavStreak == MAX_u8) + return; + + gChainFishingDexNavStreak++; +} + +u32 CalculateChainFishingShinyRolls(void) +{ + if (!I_FISHING_CHAIN || !gIsFishingEncounter) + return 0; + u32 a = 2 * min(gChainFishingDexNavStreak, FISHING_CHAIN_SHINY_STREAK_MAX); + DebugPrintf("Total Shiny Rolls %d", a); + return a; +} + +bool32 ShouldUseFishingEnvironmentInBattle() +{ + return (I_FISHING_ENVIRONMENT >= GEN_4 && gIsFishingEncounter); +} \ No newline at end of file diff --git a/src/item_use.c b/src/item_use.c index 3e0e0dbeb6..1b91dd76da 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -18,6 +18,7 @@ #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_weather.h" +#include "fishing.h" #include "fldeff.h" #include "follower_npc.h" #include "item.h" diff --git a/src/pokemon.c b/src/pokemon.c index 25f7cd5ed8..32fe01812b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -19,6 +19,7 @@ #include "field_player_avatar.h" #include "field_specials.h" #include "field_weather.h" +#include "fishing.h" #include "follower_npc.h" #include "graphics.h" #include "item.h" @@ -66,7 +67,6 @@ #include "constants/trainers.h" #include "constants/union_room.h" #include "constants/weather.h" -#include "wild_encounter.h" #define FRIENDSHIP_EVO_THRESHOLD ((P_FRIENDSHIP_EVO_THRESHOLD >= GEN_8) ? 160 : 220) @@ -1090,8 +1090,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, totalRerolls += I_SHINY_CHARM_ADDITIONAL_ROLLS; if (LURE_STEP_COUNT != 0) totalRerolls += 1; - if (I_FISHING_CHAIN && gIsFishingEncounter) - totalRerolls += CalculateChainFishingShinyRolls(); + totalRerolls += CalculateChainFishingShinyRolls(); if (gDexNavSpecies) totalRerolls += CalculateDexNavShinyRolls(); diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 9161797d25..f6bf7a7598 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -3,6 +3,7 @@ #include "pokemon.h" #include "metatile_behavior.h" #include "fieldmap.h" +#include "fishing.h" #include "follower_npc.h" #include "random.h" #include "field_player_avatar.h" @@ -43,7 +44,6 @@ extern const u8 EventScript_SprayWoreOff[]; static u16 FeebasRandom(void); static void FeebasSeedRng(u16 seed); -static void UpdateChainFishingStreak(); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); static void ApplyCleanseTagEncounterRateMod(u32 *encRate); @@ -964,22 +964,6 @@ bool8 DoesCurrentMapHaveFishingMons(void) return FALSE; } -u32 CalculateChainFishingShinyRolls(void) -{ - return (2 * min(gChainFishingDexNavStreak, FISHING_CHAIN_SHINY_STREAK_MAX)); -} - -static void UpdateChainFishingStreak() -{ - if (!I_FISHING_CHAIN) - return; - - if (gChainFishingDexNavStreak >= FISHING_CHAIN_LENGTH_MAX) - return; - - gChainFishingDexNavStreak++; -} - void FishingWildEncounter(u8 rod) { u16 species; From f0444f0d3ff7133f55e5f81143959fd14635cae7 Mon Sep 17 00:00:00 2001 From: surskitty Date: Mon, 6 Oct 2025 17:52:27 -0400 Subject: [PATCH 072/183] Improved AI for status curing; trainer items, Purify, Smelling Salts, Sparkling Aria (#7853) --- include/battle_ai_util.h | 2 + src/battle_ai_main.c | 43 +++++++++++-- src/battle_ai_switch_items.c | 19 +++--- src/battle_ai_util.c | 96 +++++++++++++++++++++++++++++ test/battle/ai/ai_check_viability.c | 19 ++++++ test/battle/move_effect/purify.c | 40 ++++++++++++ 6 files changed, 202 insertions(+), 17 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 415c4fb938..ea02bc5917 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -132,6 +132,8 @@ bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 mo bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage); bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent); bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect); +bool32 ShouldCureStatus(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); +bool32 ShouldCureStatusWithItem(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex); bool32 IsRecycleEncouragedItem(u32 item); bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index ec13d78a94..f48956cd5b 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2194,10 +2194,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); else if (battlerDef == BATTLE_PARTNER(battlerAtk)) break; //Always heal your ally - else if (AI_BattlerAtMaxHp(battlerAtk)) - ADJUST_SCORE(-10); - else if (aiData->hpPercents[battlerAtk] >= 90) - ADJUST_SCORE(-8); //No point in healing, but should at least do it if nothing better + else if (!ShouldCureStatus(battlerAtk, battlerDef, aiData)) + { + if (AI_BattlerAtMaxHp(battlerAtk)) + ADJUST_SCORE(-10); + else if (aiData->hpPercents[battlerAtk] >= 90) + ADJUST_SCORE(-8); //No point in healing, but should at least do it if nothing better + } break; case EFFECT_RECOIL_IF_MISS: if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] < 75 @@ -3602,8 +3605,18 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (gBattleMons[battlerAtkPartner].status1 & STATUS1_ANY) { if (gBattleMons[battlerAtkPartner].status1 & STATUS1_CAN_MOVE) + { + if (ShouldCureStatus(battlerAtk, battlerAtkPartner, aiData)) + ADJUST_SCORE(DECENT_EFFECT); + } + else + { + ADJUST_SCORE(DECENT_EFFECT); + } + + if ((!IsBattlerAlive(LEFT_FOE(battlerAtk)) || ShouldRecover(battlerAtk, LEFT_FOE(battlerAtk), move, 50)) + && (!IsBattlerAlive(RIGHT_FOE(battlerAtk)) || ShouldRecover(battlerAtk, RIGHT_FOE(battlerAtk), move, 50))) RETURN_SCORE_PLUS(WEAK_EFFECT); - RETURN_SCORE_PLUS(GOOD_EFFECT); } break; case EFFECT_SWAGGER: @@ -4557,6 +4570,15 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (ShouldUseWishAromatherapy(battlerAtk, battlerDef, move)) ADJUST_SCORE(DECENT_EFFECT); break; + case EFFECT_PURIFY: + if (gBattleMons[battlerDef].status1 & STATUS1_ANY) + { + if (ShouldCureStatus(battlerAtk, battlerDef, aiData)) + ADJUST_SCORE(GOOD_EFFECT); + if (ShouldRecover(battlerAtk, battlerDef, move, 50)) + RETURN_SCORE_PLUS(WEAK_EFFECT); + } + break; case EFFECT_CURSE: if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_GHOST)) { @@ -5909,6 +5931,17 @@ static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move if (ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(DECENT_EFFECT); break; + case MOVE_EFFECT_REMOVE_STATUS: + if (gBattleMons[battlerDef].status1 & GetMoveEffectArg_Status(move)) + { + if (ShouldCureStatus(battlerAtk, battlerDef, aiData)) + ADJUST_SCORE(DECENT_EFFECT); + else if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_FLAME_ORB || aiData->holdEffects[battlerDef] == HOLD_EFFECT_TOXIC_ORB) + ADJUST_SCORE(WEAK_EFFECT); + else + ADJUST_SCORE(BAD_EFFECT); + } + break; default: break; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 11a54290cf..bc2dedbcab 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -2505,18 +2505,13 @@ static bool32 ShouldUseItem(u32 battler) shouldUse = AI_ShouldHeal(battler, healAmount); break; case EFFECT_ITEM_CURE_STATUS: - if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[battler].status1 & STATUS1_SLEEP) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_POISON && gBattleMons[battler].status1 & STATUS1_PSN_ANY) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_BURN && gBattleMons[battler].status1 & STATUS1_BURN) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[battler].status1 & STATUS1_ICY_ANY) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) - shouldUse = TRUE; - if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].volatiles.confusionTurns > 0) - shouldUse = TRUE; + if ((itemEffects[3] & ITEM3_SLEEP && gBattleMons[battler].status1 & STATUS1_SLEEP) + || (itemEffects[3] & ITEM3_POISON && gBattleMons[battler].status1 & STATUS1_PSN_ANY) + || (itemEffects[3] & ITEM3_BURN && gBattleMons[battler].status1 & STATUS1_BURN) + || (itemEffects[3] & ITEM3_FREEZE && gBattleMons[battler].status1 & STATUS1_ICY_ANY) + || (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) + || (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].volatiles.confusionTurns > 0)) + shouldUse = ShouldCureStatusWithItem(battler, battler, gAiLogicData); break; case EFFECT_ITEM_INCREASE_STAT: case EFFECT_ITEM_INCREASE_ALL_STATS: diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3d9457cbde..3b2c12e63f 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3931,6 +3931,102 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo return FALSE; } +static bool32 ShouldCureStatusInternal(u32 battlerAtk, u32 battlerDef, bool32 usingItem, struct AiLogicData *aiData) +{ + bool32 targetingSelf = (battlerAtk == battlerDef); + bool32 targetingAlly = IsTargetingPartner(battlerAtk, battlerDef); + u32 status = gBattleMons[battlerDef].status1; + + if (status & STATUS1_SLEEP) + { + if (targetingAlly || targetingSelf) + { + if (HasMoveWithEffect(battlerDef, EFFECT_SLEEP_TALK) || HasMoveWithEffect(battlerDef, EFFECT_SNORE)) + return FALSE; + else + return usingItem || targetingAlly; + } + return FALSE; + } + + if (status & STATUS1_FREEZE) + { + if (targetingAlly || targetingSelf) + { + if (HasThawingMove(battlerDef)) + return FALSE; + return usingItem || targetingAlly; + } + return FALSE; + } + + bool32 isHarmless = FALSE; + + if (DoesBattlerBenefitFromAllVolatileStatus(battlerDef, aiData->abilities[battlerDef])) + isHarmless = TRUE; + + if (status & STATUS1_PSN_ANY) + { + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_TOXIC_ORB) + return FALSE; + + if (aiData->abilities[battlerDef] == ABILITY_POISON_HEAL) + isHarmless = TRUE; + + if (aiData->abilities[battlerDef] == ABILITY_TOXIC_BOOST && !isHarmless) + { + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + isHarmless = TRUE; + else if (!(targetingSelf || targetingAlly) && !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + isHarmless = TRUE; + } + } + + if (status & STATUS1_BURN) + { + if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_FLAME_ORB) + return FALSE; + + if (aiData->abilities[battlerDef] == ABILITY_FLARE_BOOST && !isHarmless) + { + if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) + isHarmless = TRUE; + else if (!(targetingSelf || targetingAlly) && !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) + isHarmless = TRUE; + } + } + +/* + if (status & STATUS1_PARALYSIS) + if (status & STATUS1_FROSTBITE) +*/ + + if (isHarmless) + { + if (targetingSelf || targetingAlly) + return FALSE; + else + return TRUE; + } + else + { + if (targetingSelf || targetingAlly) + return TRUE; + else + return FALSE; + } +} + +bool32 ShouldCureStatus(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData) +{ + return ShouldCureStatusInternal(battlerAtk, battlerDef, FALSE, aiData); +} + +bool32 ShouldCureStatusWithItem(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData) +{ + return ShouldCureStatusInternal(battlerAtk, battlerDef, TRUE, aiData); +} + // Partner Logic bool32 IsBattle1v1() { diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 8b6fd9797c..77de2ba1cb 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -439,3 +439,22 @@ AI_DOUBLE_BATTLE_TEST("AI sees type-changing moves as the correct type") TURN { NOT_EXPECT_MOVE(opponentLeft, fieldStatus); } } } + +AI_SINGLE_BATTLE_TEST("AI uses Sparkling Aria to cure an enemy with Guts") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_GUTS; } + PARAMETRIZE { ability = ABILITY_BULLETPROOF; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_URSALUNA) { Ability(ability); Moves(MOVE_HEADLONG_RUSH, MOVE_CELEBRATE); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_PRIMARINA) { Moves(MOVE_SPARKLING_ARIA, MOVE_SCALD); } + } WHEN { + if (ability == ABILITY_GUTS) + TURN { EXPECT_MOVE(opponent, MOVE_SPARKLING_ARIA); } + else + TURN { EXPECT_MOVE(opponent, MOVE_SCALD); } + } +} diff --git a/test/battle/move_effect/purify.c b/test/battle/move_effect/purify.c index 5f1651e96f..425d0a99a9 100644 --- a/test/battle/move_effect/purify.c +++ b/test/battle/move_effect/purify.c @@ -22,5 +22,45 @@ AI_DOUBLE_BATTLE_TEST("AI uses Purify") } } +AI_SINGLE_BATTLE_TEST("AI uses Purify to heal an enemy with Guts") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_GUTS; } + PARAMETRIZE { ability = ABILITY_BULLETPROOF; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_URSALUNA) { Ability(ability); Moves(MOVE_HEADLONG_RUSH, MOVE_CELEBRATE); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEADBUTT, MOVE_PURIFY); } + } WHEN { + if (ability == ABILITY_GUTS) + TURN { EXPECT_MOVE(opponent, MOVE_PURIFY); } + else + TURN { NOT_EXPECT_MOVE(opponent, MOVE_PURIFY); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI does not use Purify to heal an ally with Guts") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_GUTS; } + PARAMETRIZE { ability = ABILITY_BULLETPROOF; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEADBUTT, MOVE_PURIFY); } + OPPONENT(SPECIES_URSALUNA) { Ability(ability); Moves(MOVE_HEADLONG_RUSH); Status1(STATUS1_BURN); } + } WHEN { + if (ability == ABILITY_GUTS) + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_PURIFY); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_PURIFY, target: opponentRight); } + } +} + TO_DO_BATTLE_TEST("TODO: Write Purify (Move Effect) test titles") TO_DO_BATTLE_TEST("Purify doesn't heal HP if the target has Comatose") From 798bf0a32250935fe1a649a5b018eab154b62af1 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 11 Oct 2025 15:03:23 +0200 Subject: [PATCH 073/183] Removes a few redundant hitmarkers (#7915) --- data/battle_scripts_1.s | 18 ++++++++---------- include/constants/battle.h | 6 ++---- src/battle_script_commands.c | 7 +++---- src/battle_util.c | 3 +-- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8756e74236..b4bc6e9e69 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -508,10 +508,10 @@ BattleScript_TeatimeLoop: jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_Teatimesorb jumpifelectricabilityaffected BS_TARGET, ABILITY_MOTOR_DRIVE, BattleScript_Teatimemotor jumpifteainvulnerable BS_TARGET, BattleScript_Teatimevul @ in semi-invulnerable state OR held item is not a Berry - orword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems - bicword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE + bicword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE setbyte sBERRY_OVERRIDE, FALSE removeitem BS_TARGET moveendto MOVEEND_NEXT_TARGET @@ -780,7 +780,7 @@ BattleScript_FlingMissed: BattleScript_EffectClangorousSoul:: attackcanceler cutonethirdhpandraisestats BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_BIDE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_BIDE | HITMARKER_PASSIVE_HP_UPDATE attackanimation waitanimation healthbarupdate BS_ATTACKER @@ -2917,7 +2917,7 @@ BattleScript_RecoilIfMiss:: printstring STRINGID_PKMNCRASHED waitmessage B_WAIT_TIME_LONG jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER @@ -5706,7 +5706,7 @@ BattleScript_WishComesTrue:: playanimation BS_TARGET, B_ANIM_WISH_HEAL printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE healthbarupdate BS_TARGET datahpupdate BS_TARGET printstring STRINGID_PKMNREGAINEDHEALTH @@ -6486,7 +6486,7 @@ BattleScript_MoveEffectRecoil:: jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd BattleScript_DoRecoil:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_PKMNHITWITHRECOIL @@ -7895,7 +7895,7 @@ BattleScript_AirBaloonMsgPop:: return BattleScript_ItemHurtRet:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_IGNORE_DISGUISE + orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER printstring STRINGID_HURTBYITEM @@ -7913,7 +7913,7 @@ BattleScript_ItemHealHP_Ret:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHPALITTLE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE | HITMARKER_PASSIVE_HP_UPDATE + orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER return @@ -8934,10 +8934,8 @@ BattleScript_DynamaxEnds_Ret:: BattleScript_MoveBlockedByDynamax:: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE pause B_WAIT_TIME_SHORT - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_STRING_PRINTED, BattleScript_MoveEnd printstring STRINGID_MOVEBLOCKEDBYDYNAMAX waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_STRING_PRINTED goto BattleScript_MoveEnd BattleScript_PokemonCantUseTheMove:: diff --git a/include/constants/battle.h b/include/constants/battle.h index 45a74be518..775546c5c6 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -237,7 +237,6 @@ enum SemiInvulnerableExclusion EXCLUDE_COMMANDER, }; -#define HITMARKER_STRING_PRINTED (1 << 4) #define HITMARKER_IGNORE_BIDE (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) #define HITMARKER_NO_ANIMATIONS (1 << 7) // set from battleSceneOff. Never changed during battle @@ -249,7 +248,7 @@ enum SemiInvulnerableExclusion #define HITMARKER_STATUS_ABILITY_EFFECT (1 << 13) #define HITMARKER_UNUSED_14 (1 << 14) #define HITMARKER_RUN (1 << 15) -#define HITMARKER_IGNORE_DISGUISE (1 << 16) +#define HITMARKER_UNUSED_16 (1 << 16) #define HITMARKER_DISABLE_ANIMATION (1 << 17) // disable animations during battle scripts, e.g. for Bug Bite #define HITMARKER_UNUSED_18 (1 << 18) #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) @@ -261,8 +260,7 @@ enum SemiInvulnerableExclusion #define HITMARKER_OBEYS (1 << 25) #define HITMARKER_UNUSED_26 (1 << 26) #define HITMARKER_UNUSED_27 (1 << 27) -#define HITMARKER_FAINTED(battler) (1u << (battler + 28)) -#define HITMARKER_FAINTED2(battler) HITMARKER_FAINTED(battler) +#define HITMARKER_FAINTED(battler) (1u << (battler + 28)) // Also uses bits 29, 30 and 31 // Per-side statuses that affect an entire party #define SIDE_STATUS_REFLECT (1 << 0) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c8de9426ba..d61b9363dd 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4898,14 +4898,14 @@ static void Cmd_checkteamslost(void) for (emptyPlayerSpots = 0, i = 0; i < gBattlersCount; i += 2) { - if ((gHitMarker & HITMARKER_FAINTED2(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) + if ((gHitMarker & HITMARKER_FAINTED(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) emptyPlayerSpots++; } emptyOpponentSpots = 0; for (i = 1; i < gBattlersCount; i += 2) { - if ((gHitMarker & HITMARKER_FAINTED2(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) + if ((gHitMarker & HITMARKER_FAINTED(i)) && (!gSpecialStatuses[i].faintedHasReplacement)) emptyOpponentSpots++; } @@ -6025,7 +6025,7 @@ static void Cmd_moveend(void) gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE | HITMARKER_PASSIVE_HP_UPDATE; + gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE; effect = TRUE; if ((moveEffect == EFFECT_DREAM_EATER && GetGenConfig(GEN_DREAM_EATER_LIQUID_OOZE) < GEN_5) || GetBattlerAbility(gBattlerTarget) != ABILITY_LIQUID_OOZE) @@ -13269,7 +13269,6 @@ bool32 DoesDisguiseBlockMove(u32 battler, u32 move) if (!(gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) || gBattleMons[battler].volatiles.transformed || (!gProtectStructs[battler].confusionSelfDmg && (IsBattleMoveStatus(move) || gHitMarker & HITMARKER_PASSIVE_HP_UPDATE)) - || gHitMarker & HITMARKER_IGNORE_DISGUISE || !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_DISGUISE)) return FALSE; else diff --git a/src/battle_util.c b/src/battle_util.c index 8abb613adc..7ca5e86b50 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -897,8 +897,7 @@ void HandleAction_ActionFinished(void) | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_HP_UPDATE - | HITMARKER_OBEYS - | HITMARKER_IGNORE_DISGUISE); + | HITMARKER_OBEYS); ClearDamageCalcResults(); gCurrentMove = 0; From ca53ccb55e38c1b55c746e0de05a861c5918940d Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Sat, 11 Oct 2025 19:54:51 +0200 Subject: [PATCH 074/183] Fix shiny stars being freed before shiny animation was played (#7917) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle_controllers.h | 2 ++ src/battle_controller_link_opponent.c | 6 ++---- src/battle_controller_opponent.c | 6 ++---- src/battle_controller_player.c | 3 +-- src/battle_controller_recorded_opponent.c | 3 +-- src/battle_controller_recorded_player.c | 3 +-- src/battle_controller_wally.c | 3 +-- src/battle_controllers.c | 20 ++++++++++++++------ 8 files changed, 24 insertions(+), 22 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index f7788129ee..681ee519f4 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -438,4 +438,6 @@ void BtlController_HandleSwitchInSoundAndEnd(u32 battler); void BtlController_HandleSwitchInShowSubstitute(u32 battler); bool32 ShouldBattleRestrictionsApply(u32 battler); +void FreeShinyStars(void); + #endif // GUARD_BATTLE_CONTROLLERS_H diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 658a2d3831..3418293530 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -150,8 +150,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } else { @@ -163,8 +162,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT) { - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 8c469733c1..15985aa0b4 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -159,8 +159,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } else { @@ -174,8 +173,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim) { - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } else { diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index f98b3ca3d6..564afa3446 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1247,8 +1247,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); HandleLowHpMusicChange(GetBattlerMon(battler), battler); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index a27318aee8..21ecb79801 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -170,8 +170,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); } gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 0230451827..c86cf4a9d5 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -147,8 +147,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); HandleLowHpMusicChange(GetBattlerMon(battler), battler); if (IsDoubleBattle()) diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 932b4a26b4..11955787d9 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -255,8 +255,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(GetBattlerMon(battler), battler); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 3c9f0a21cd..9818879e7b 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2940,8 +2940,7 @@ void TryShinyAnimAfterMonAnim(u32 battler) { gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); BtlController_Complete(battler); } } @@ -3012,8 +3011,7 @@ void BtlController_HandleSwitchInShowHealthbox(u32 battler) { gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); if (side == B_SIDE_PLAYER) { @@ -3043,8 +3041,7 @@ static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler) // Reset shiny anim (even if it didn't occur) gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + FreeShinyStars(); // Check if Substitute should be shown if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) @@ -3129,3 +3126,14 @@ bool32 ShouldBattleRestrictionsApply(u32 battler) { return IsControllerPlayer(battler); } + +void FreeShinyStars(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + return; + } + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); +} From 94a6e126f3b3eeece3439a2874196b2038dbf463 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 11 Oct 2025 17:47:48 -0400 Subject: [PATCH 075/183] Changing all HasBattlerSideAbility to AI_IsAbilityOnSide. (#7927) --- include/battle_ai_util.h | 1 - src/battle_ai_field_statuses.c | 14 +++++++------- src/battle_ai_main.c | 4 ++-- src/battle_ai_util.c | 13 ++----------- 4 files changed, 11 insertions(+), 21 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index ea02bc5917..fb51dde639 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -307,7 +307,6 @@ bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); -bool32 HasBattlerSideAbility(u32 battlerDef, enum Ability ability, struct AiLogicData *aiData); bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); // These are for the purpose of not doubling up on moves during double battles. diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index 202955705e..7a1e1cbd58 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -411,9 +411,9 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (grounded || allyGrounded) { // harass priority - if (HasBattlerSideAbility(LEFT_FOE(battler), ABILITY_GALE_WINGS, gAiLogicData) - || HasBattlerSideAbility(LEFT_FOE(battler), ABILITY_TRIAGE, gAiLogicData) - || HasBattlerSideAbility(LEFT_FOE(battler), ABILITY_PRANKSTER, gAiLogicData)) + if (AI_IsAbilityOnSide(LEFT_FOE(battler), ABILITY_GALE_WINGS) + || AI_IsAbilityOnSide(LEFT_FOE(battler), ABILITY_TRIAGE) + || AI_IsAbilityOnSide(LEFT_FOE(battler), ABILITY_PRANKSTER)) return FIELD_EFFECT_POSITIVE; } @@ -423,9 +423,9 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_EXPANDING_FORCE)) return FIELD_EFFECT_NEGATIVE; - if (HasBattlerSideAbility(battler, ABILITY_GALE_WINGS, gAiLogicData) - || HasBattlerSideAbility(battler, ABILITY_TRIAGE, gAiLogicData) - || HasBattlerSideAbility(battler, ABILITY_PRANKSTER, gAiLogicData)) + if (AI_IsAbilityOnSide(battler, ABILITY_GALE_WINGS) + || AI_IsAbilityOnSide(battler, ABILITY_TRIAGE) + || AI_IsAbilityOnSide(battler, ABILITY_PRANKSTER)) return FIELD_EFFECT_NEGATIVE; return FIELD_EFFECT_NEUTRAL; @@ -436,7 +436,7 @@ static enum FieldEffectOutcome BenefitsFromGravity(u32 battler) if (!AI_IsBattlerGrounded(battler)) return FIELD_EFFECT_NEGATIVE; - if (HasBattlerSideAbility(battler, ABILITY_HUSTLE, gAiLogicData)) + if (AI_IsAbilityOnSide(battler, ABILITY_HUSTLE)) return FIELD_EFFECT_POSITIVE; if (HasMoveWithFlag(battler, IsMoveGravityBanned)) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index f48956cd5b..1cd06fb952 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1456,7 +1456,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_QUIVER_DANCE: case EFFECT_GEOMANCY: - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, aiData)) + if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) ADJUST_SCORE(-10); if (gBattleMons[battlerAtk].statStages[STAT_SPATK] >= MAX_STAT_STAGE || !HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)) ADJUST_SCORE(-10); @@ -1988,7 +1988,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_BELLY_DRUM: case EFFECT_FILLET_AWAY: - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, aiData)) + if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) ADJUST_SCORE(-10); if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) ADJUST_SCORE(-10); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3b2c12e63f..63060e0995 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1995,7 +1995,7 @@ bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef) return FALSE; // Don't increase stats if opposing battler has Unaware - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, gAiLogicData)) + if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) return FALSE; // Don't set up if AI is dead to residual damage from weather @@ -2003,7 +2003,7 @@ bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef) return FALSE; // Don't increase stats if opposing battler has Opportunist - if (HasBattlerSideAbility(battlerDef, ABILITY_OPPORTUNIST, gAiLogicData)) + if (AI_IsAbilityOnSide(battlerDef, ABILITY_OPPORTUNIST)) return FALSE; // Don't increase stats if opposing battler has Encore @@ -5631,15 +5631,6 @@ bool32 IsBattlerItemEnabled(u32 battler) return TRUE; } -bool32 HasBattlerSideAbility(u32 battler, enum Ability ability, struct AiLogicData *aiData) -{ - if (aiData->abilities[battler] == ability) - return TRUE; - if (HasPartnerIgnoreFlags(battler) && gAiLogicData->abilities[BATTLE_PARTNER(battler)] == ability) - return TRUE; - return FALSE; -} - u32 GetFriendlyFireKOThreshold(u32 battler) { if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) From eee546df06332c217961517163e7ab425290dd51 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 12 Oct 2025 08:59:33 +0200 Subject: [PATCH 076/183] Item battle effect refactor (#7857) --- asm/macros/battle_script.inc | 9 +- data/battle_scripts_1.s | 159 +- include/battle.h | 6 +- include/battle_ai_util.h | 6 +- include/battle_hold_effects.h | 52 + include/battle_main.h | 5 +- include/battle_script_commands.h | 4 +- include/battle_scripts.h | 18 +- include/battle_util.h | 62 +- include/config/battle.h | 2 - include/constants/battle_script_commands.h | 22 +- include/constants/battle_string_ids.h | 10 +- include/constants/hold_effects.h | 12 +- include/item.h | 2 +- src/battle_ai_field_statuses.c | 1 - src/battle_ai_main.c | 7 +- src/battle_ai_switch_items.c | 11 +- src/battle_ai_util.c | 25 +- src/battle_controller_player.c | 1 - src/battle_debug.c | 9 +- src/battle_dynamax.c | 3 +- src/battle_end_turn.c | 38 +- src/battle_hold_effects.c | 1293 +++++++++++++ src/battle_main.c | 46 +- src/battle_message.c | 22 +- src/battle_script_commands.c | 327 ++-- src/battle_terastal.c | 3 +- src/battle_util.c | 1657 +---------------- src/battle_z_move.c | 7 +- src/data/hold_effects.h | 647 +++++++ src/data/items.h | 8 +- src/daycare.c | 1 - src/item.c | 2 +- src/pokemon.c | 3 +- src/pokemon_summary_screen.c | 1 - test/battle/ability/unburden.c | 2 +- test/battle/hold_effect/kee_berry.c | 16 + test/battle/hold_effect/maranga_berry.c | 16 + test/battle/hold_effect/restore_hp.c | 17 - test/battle/hold_effect/seeds.c | 8 +- test/battle/move_effect/magic_room.c | 39 + .../battle/move_effect_secondary/steal_item.c | 22 +- test/test_runner_battle.c | 2 +- 43 files changed, 2566 insertions(+), 2037 deletions(-) create mode 100644 include/battle_hold_effects.h create mode 100644 src/battle_hold_effects.c create mode 100644 src/data/hold_effects.h diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 19a4da0e95..32eef8a357 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -13,7 +13,7 @@ .byte 0x2 .endm - .macro unused0x3 + .macro unused_0x3 .byte 0x3 .endm @@ -1011,9 +1011,10 @@ .4byte \jumpInstr .endm - .macro tryrestorehpberry battler:req + .macro tryactivateitem battler:req, flag:req .byte 0xbb .byte \battler + .byte \flag .endm .macro halvehp failInstr:req @@ -1762,6 +1763,10 @@ .2byte \flags .endm + .macro clearspecialstatuses + callnative BS_ClearSpecialStatuses + .endm + .macro clearmoveresultflags flags:req callnative BS_ClearMoveResultFlags .2byte \flags diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b4bc6e9e69..760d421696 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -722,7 +722,7 @@ BattleScript_EffectFlingConsumeBerry: battleritemtolastuseditem setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries orword gHitMarker, HITMARKER_DISABLE_ANIMATION - consumeberry BS_TARGET, TRUE + consumeberry BS_TARGET, FALSE bicword gHitMarker, HITMARKER_DISABLE_ANIMATION setbyte sBERRY_OVERRIDE, 0 restorebattleritem @@ -1404,7 +1404,7 @@ BattleScript_FlowerShieldMoveTargetEnd: moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_FlowerShieldLoop restoretarget - moveendfrom MOVEEND_ITEM_EFFECTS_ATTACKER + moveendfrom MOVEEND_ITEM_EFFECTS_ATTACKER_1 end BattleScript_EffectRototiller:: @@ -1460,6 +1460,7 @@ BattleScript_EffectBestow:: waitanimation printstring STRINGID_BESTOWITEMGIVING waitmessage B_WAIT_TIME_LONG + tryactivateitem BS_TARGET, ON_ITEM_USABLE_AGAIN trysymbiosis BS_ATTACKER goto BattleScript_MoveEnd @@ -4970,7 +4971,7 @@ BattleScript_MagicRoomEnds:: setbyte gBattlerTarget, 0 BattleScript_MagicRoomHealingItemsLoop: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattlerTarget, 1 - tryrestorehpberry BS_ATTACKER + tryactivateitem BS_ATTACKER, ON_ITEM_USABLE_AGAIN addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MagicRoomHealingItemsLoop end2 @@ -5416,7 +5417,6 @@ BattleScript_BerserkActivates:: call BattleScript_StatUp BattleScript_BerserkActivatesTryBerry: restoreattacker - tryrestorehpberry BS_EFFECT_BATTLER return BattleScript_AngerShellActivates:: @@ -5437,7 +5437,6 @@ BattleScript_AngerShellTrySpAtk: BattleScript_AngerShellTrySpeed: modifybattlerstatstage BS_EFFECT_BATTLER, STAT_SPEED, INCREASE, 1, BattleScript_AngerShellRet, ANIM_ON BattleScript_AngerShellRet: - tryrestorehpberry BS_EFFECT_BATTLER return BattleScript_WindPowerActivates:: @@ -5574,15 +5573,17 @@ BattleScript_FutureAttackEnd:: moveendcase MOVEEND_RAGE moveendcase MOVEEND_ABILITIES moveendcase MOVEEND_COLOR_CHANGE - moveendfromto MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_UPDATE_LAST_MOVES - setmoveresultflags 0 - end2 + moveendcase MOVEEND_ITEM_EFFECTS_TARGET + moveendfromto MOVEEND_SYMBIOSIS, MOVEEND_UPDATE_LAST_MOVES + goto BattleScript_FutureAttackClearResults BattleScript_FutureAttackMiss:: pause B_WAIT_TIME_SHORT setmoveresultflags MOVE_RESULT_FAILED resultmessage waitmessage B_WAIT_TIME_LONG +BattleScript_FutureAttackClearResults: setmoveresultflags 0 + clearspecialstatuses end2 BattleScript_NoMovesLeft:: @@ -6157,7 +6158,7 @@ BattleScript_DoTurnDmg: datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd - tryrestorehpberry BS_ATTACKER + tryactivateitem BS_ATTACKER, ON_ITEM_HP_THRESHOLD BattleScript_DoTurnDmgEnd: end2 @@ -6399,7 +6400,7 @@ BattleScript_YawnEnd: BattleScript_EmbargoEndTurn:: printstring STRINGID_EMBARGOENDS waitmessage B_WAIT_TIME_LONG - tryrestorehpberry BS_ATTACKER + tryactivateitem BS_ATTACKER, ON_ITEM_USABLE_AGAIN end2 BattleScript_TelekinesisEndTurn:: @@ -6689,7 +6690,7 @@ BattleScript_PickupActivates:: call BattleScript_AbilityPopUp printstring STRINGID_XFOUNDONEY waitmessage B_WAIT_TIME_LONG - tryrestorehpberry BS_ATTACKER + tryactivateitem BS_ATTACKER, ON_ITEM_PICK_UP BattleScript_PickupActivatesEnd: end2 @@ -6699,7 +6700,7 @@ BattleScript_HarvestActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HARVESTBERRY waitmessage B_WAIT_TIME_LONG - tryrestorehpberry BS_ATTACKER + tryactivateitem BS_ATTACKER, ON_BERRY_HARVEST BattleScript_HarvestActivatesEnd: end2 @@ -7222,6 +7223,7 @@ BattleScript_FlinchPrevention:: BattleScript_OwnTempoPrevents:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + copybyte sBATTLER, gBattlerTarget printstring STRINGID_PKMNPREVENTSCONFUSIONWITH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -7271,11 +7273,15 @@ BattleScript_AbilityNoSpecificStatLoss:: return BattleScript_StickyHoldActivates:: + call BattleScript_StickyHoldActivatesRet + goto BattleScript_MoveEnd + +BattleScript_StickyHoldActivatesRet:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYINEFFECTIVE waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + return BattleScript_ColorChangeActivates:: call BattleScript_AbilityPopUp @@ -7696,73 +7702,13 @@ BattleScript_SubstituteFade:: printstring STRINGID_PKMNSUBSTITUTEFADED return -BattleScript_BerryCurePrlzEnd2:: - call BattleScript_BerryCureParRet +BattleScript_BerryCureStatusEnd2:: + call BattleScript_BerryCureStatusRet end2 -BattleScript_BerryCureParRet:: +BattleScript_BerryCureStatusRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMCUREDPARALYSIS - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCurePsnEnd2:: - call BattleScript_BerryCurePsnRet - end2 - -BattleScript_BerryCurePsnRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMCUREDPOISON - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureBrnEnd2:: - call BattleScript_BerryCureBrnRet - end2 - -BattleScript_BerryCureBrnRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMHEALEDBURN - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureFrzEnd2:: - call BattleScript_BerryCureFrzRet - end2 - -BattleScript_BerryCureFrzRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMDEFROSTEDIT - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureFrbEnd2:: - call BattleScript_BerryCureFrzRet - end2 - -BattleScript_BerryCureFrbRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMHEALEDFROSTBITE - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - -BattleScript_BerryCureSlpEnd2:: - call BattleScript_BerryCureSlpRet - end2 - -BattleScript_BerryCureSlpRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMWOKEIT + printfromtable CureStatusBerryEffectStringID waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING @@ -7797,25 +7743,12 @@ BattleScript_BerryCureConfusionRet:: removeitem BS_SCRIPTING return -BattleScript_BerryCureChosenStatusEnd2:: - call BattleScript_BerryCureChosenStatusRet - end2 - -BattleScript_BerryCureChosenStatusRet:: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printfromtable gBerryEffectStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - removeitem BS_SCRIPTING - return - BattleScript_MentalHerbCureRet:: - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printfromtable gMentalHerbCureStringIds waitmessage B_WAIT_TIME_LONG updatestatusicon BS_SCRIPTING removeitem BS_SCRIPTING - copybyte gBattlerAttacker, sSAVED_BATTLER @ restore the original attacker just to be safe return BattleScript_MentalHerbCureEnd2:: @@ -7837,7 +7770,7 @@ BattleScript_ItemHealHP_RemoveItemRet:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp goto BattleScript_ItemHealHP_RemoveItemRet_Anim BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting BattleScript_ItemHealHP_RemoveItemRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH @@ -7852,7 +7785,7 @@ BattleScript_ItemHealHP_RemoveItemEnd2:: jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp goto BattleScript_ItemHealHP_RemoveItemEnd2_Anim BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting BattleScript_ItemHealHP_RemoveItemEnd2_Anim: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH @@ -7888,6 +7821,11 @@ BattleScript_AirBaloonMsgIn:: waitmessage B_WAIT_TIME_LONG end3 +BattleScript_AirBalloonMsgInRet:: + printstring STRINGID_AIRBALLOONFLOAT + waitmessage B_WAIT_TIME_LONG + return + BattleScript_AirBaloonMsgPop:: printstring STRINGID_AIRBALLOONPOP waitmessage B_WAIT_TIME_LONG @@ -7996,24 +7934,22 @@ BattleScript_ConsumableStatRaiseEnd2:: end2 BattleScript_ConsumableStatRaiseRet:: - @ to ensure `statbuffchange` has correct battler id, backup and use target - savetarget - copybyte gBattlerTarget, sBATTLER jumpifnotberry BS_SCRIPTING, BattleScript_ConsumableStatRaiseRet_Anim - @ check ripen popup if consuming berry jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ConsumableStatRaiseRet_AbilityPopup goto BattleScript_ConsumableStatRaiseRet_Anim BattleScript_ConsumableStatRaiseRet_AbilityPopup: call BattleScript_AbilityPopUp BattleScript_ConsumableStatRaiseRet_Anim: - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ConsumableStatRaiseRet_End + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_ConsumableStatRaiseRet_End playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGED_ITEM + savetarget + copybyte gBattlerTarget, sBATTLER @ BattleScript_StatUp uses target as a message arg call BattleScript_StatUp + restoretarget removeitem BS_SCRIPTING BattleScript_ConsumableStatRaiseRet_End: - restoretarget return BattleScript_BerryFocusEnergyRet:: @@ -8177,7 +8113,7 @@ BattleScript_MirrorHerbCopyStatChange:: removeitem BS_SCRIPTING BattleScript_MirrorHerbStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_MirrorHerbStartReturn - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_MirrorHerbStartReturn setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once goto BattleScript_MirrorHerbStartCopyStats BattleScript_MirrorHerbStartReturn: @@ -8283,7 +8219,7 @@ BattleScript_MicleBerryActivateRet:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_MicleBerryActivateRet_Ripen goto BattleScript_MicleBerryActivateRet_Anim BattleScript_MicleBerryActivateRet_Ripen: - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting BattleScript_MicleBerryActivateRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_MICLEBERRYACTIVATES @@ -8950,18 +8886,15 @@ BattleScript_CouldntFullyProtect:: return BattleScript_BerserkGeneRet:: - saveattacker - savetarget - copybyte gBattlerTarget, sBATTLER - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_BerserkGeneRet_TryConfuse - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_BerserkGeneRet_TryConfuse + playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_BerserkGeneRet_TryConfuse setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGED_ITEM call BattleScript_StatUp BattleScript_BerserkGeneRet_TryConfuse: - jumpifability BS_ATTACKER, ABILITY_OWN_TEMPO, BattleScript_BerserkGeneRet_OwnTempoPrevents + jumpifability BS_SCRIPTING, ABILITY_OWN_TEMPO, BattleScript_BerserkGeneRet_OwnTempoPrevents jumpifsafeguard BattleScript_BerserkGeneRet_SafeguardProtected - seteffectprimary BS_ATTACKER, BS_ATTACKER, MOVE_EFFECT_CONFUSION + seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION goto BattleScript_BerserkGeneRet_End BattleScript_BerserkGeneRet_SafeguardProtected:: pause B_WAIT_TIME_SHORT @@ -8970,13 +8903,11 @@ BattleScript_BerserkGeneRet_SafeguardProtected:: goto BattleScript_BerserkGeneRet_End BattleScript_BerserkGeneRet_OwnTempoPrevents: pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp + call BattleScript_AbilityPopUpScripting printstring STRINGID_PKMNPREVENTSCONFUSIONWITH waitmessage B_WAIT_TIME_LONG BattleScript_BerserkGeneRet_End: - restoreattacker - restoretarget - removeitem BS_ATTACKER + removeitem BS_SCRIPTING return BattleScript_BerserkGeneRetEnd2:: diff --git a/include/battle.h b/include/battle.h index 8f6498061b..74e9f1c611 100644 --- a/include/battle.h +++ b/include/battle.h @@ -5,6 +5,7 @@ #include "constants/abilities.h" #include "constants/battle.h" #include "constants/form_change_types.h" +#include "constants/hold_effects.h" #include "battle_main.h" #include "battle_message.h" #include "battle_util.h" @@ -581,10 +582,9 @@ struct BattlerState u32 pursuitTarget:1; u32 stompingTantrumTimer:2; u32 canPickupItem:1; - u32 itemCanBeKnockedOff:1; u32 ateBoost:1; u32 commanderSpecies:11; - u32 padding:4; + u32 padding:5; // End of Word }; @@ -780,7 +780,7 @@ struct BattleStruct u8 numHazards[NUM_BATTLE_SIDES]; u8 hazardsCounter:4; // Counter for applying hazard on switch in enum SubmoveState submoveAnnouncement:2; - u8 padding2:2; + u8 padding1:2; }; struct AiBattleData diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index fb51dde639..f175f88c40 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -115,7 +115,7 @@ u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits); bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod); enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId); -enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); +enum HoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move); u32 AI_GetWeather(void); u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon); @@ -141,7 +141,7 @@ bool32 IsStatBoostingBerry(u32 item); bool32 CanKnockOffItem(u32 battler, u32 item); bool32 IsAbilityOfRating(enum Ability ability, s8 rating); bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability); -bool32 AI_MoveMakesContact(enum Ability ability, enum ItemHoldEffect holdEffect, u32 move); +bool32 AI_MoveMakesContact(enum Ability ability, enum HoldEffect holdEffect, u32 move); bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); @@ -159,7 +159,7 @@ u32 CountNegativeStatStages(u32 battlerId); // move checks bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); -bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect); +bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum HoldEffect holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category); enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); diff --git a/include/battle_hold_effects.h b/include/battle_hold_effects.h new file mode 100644 index 0000000000..5ee1d4a494 --- /dev/null +++ b/include/battle_hold_effects.h @@ -0,0 +1,52 @@ +#ifndef GUARD_BATTLE_HOLD_EFFECTS +#define GUARD_BATTLE_HOLD_EFFECTS + +struct HoldEffectInfo +{ + u32 onSwitchIn:1; + u32 onSwitchInFirstTurn:1; + u32 mirrorHerb:1; + u32 mirrorHerbFirstTurn:1; + u32 whiteHerb:1; + u32 whiteHerbFirstTurn:1; + u32 whiteHerbEndTurn:1; + u32 onStatusChange:1; + u32 onHpThreshold:1; + u32 keeMarangaBerry:1; + u32 MentalHerb:1; + u32 onTargetAfterHit:1; + u32 onAttackerAfterHit:1; + u32 lifeOrbShellBell:1; + u32 leftovers:1; + u32 orbs:1; + u32 onEffect:1; + u32 padding:15; +}; + +extern const struct HoldEffectInfo gHoldEffectsInfo[]; + +typedef bool32 (*ActivationTiming)(enum HoldEffect holdEffect); +enum ItemEffect ItemBattleEffects(u32 primaryBattler, u32 secondaryBattler, enum HoldEffect holdEffect, ActivationTiming timing); +enum ItemEffect TryBoosterEnergy(u32 battler, enum Ability ability, ActivationTiming timing); +enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, ActivationTiming timing); + +bool32 IsOnSwitchInActivation(enum HoldEffect holdEffect); +bool32 IsOnSwitchInFirstTurnActivation(enum HoldEffect holdEffect); +bool32 IsMirrorHerbActivation(enum HoldEffect holdEffect); +bool32 IsMirrorHerbFirstTurnActivation(enum HoldEffect holdEffect); +bool32 IsWhiteHerbActivation(enum HoldEffect holdEffect); +bool32 IsWhiteHerbFirstTurnActivation(enum HoldEffect holdEffect); +bool32 IsWhiteHerbEndTurnActivation(enum HoldEffect holdEffect); +bool32 IsOnStatusChangeActivation(enum HoldEffect holdEffect); +bool32 IsOnHpThresholdActivation(enum HoldEffect holdEffect); +bool32 IsKeeMarangaBerryActivation(enum HoldEffect holdEffect); +bool32 IsOnTargetHitActivation(enum HoldEffect holdEffect); +bool32 IsOnAttackerAfterHitActivation(enum HoldEffect holdEffect); +bool32 IsLifeOrbShellBellActivation(enum HoldEffect holdEffect); +bool32 IsLeftoversActivation(enum HoldEffect holdEffect); +bool32 IsOrbsActivation(enum HoldEffect holdEffect); +bool32 IsOnEffectActivation(enum HoldEffect holdEffect); +bool32 IsActivationForceTriggerItem(enum HoldEffect holdEffect); +bool32 IsActivationOnBerry(enum HoldEffect holdEffect); + +#endif // GUARD_BATTLE_HOLD_EFFECTS diff --git a/include/battle_main.h b/include/battle_main.h index 58b44504d9..844da53033 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -97,17 +97,16 @@ u8 IsRunningFromBattleImpossible(u32 battler); void SwitchTwoBattlersInParty(u32 battler, u32 battler2); void SwitchPartyOrder(u32 battler); void SwapTurnOrder(u8 id1, u8 id2); -u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect); +u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum HoldEffect holdEffect); u32 GetBattlerTotalSpeedStat(u32 battler); s32 GetChosenMovePriority(u32 battler, enum Ability ability); s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move); s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2, - enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); + enum HoldEffect holdEffectBattler1, enum HoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); -void SpecialStatusesClear(void); u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState monInBattle); void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk); bool32 IsWildMonSmart(void); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 17ccb58c59..df30037f4c 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -40,8 +40,8 @@ union TRANSPARENT StatChangeFlags }; }; -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk); -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk); +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); s32 GetCritHitOdds(s32 critChanceIndex); u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 HasBattlerActedThisTurn(u32 battler); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 28c24f6eff..d179ad880c 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -191,6 +191,7 @@ extern const u8 BattleScript_OwnTempoPrevents[]; extern const u8 BattleScript_SoundproofProtected[]; extern const u8 BattleScript_AbilityNoSpecificStatLoss[]; extern const u8 BattleScript_StickyHoldActivates[]; +extern const u8 BattleScript_StickyHoldActivatesRet[]; extern const u8 BattleScript_ColorChangeActivates[]; extern const u8 BattleScript_RoughSkinActivates[]; extern const u8 BattleScript_CuteCharmActivates[]; @@ -206,22 +207,10 @@ extern const u8 BattleScript_TruantLoafingAround[]; extern const u8 BattleScript_IgnoresAndFallsAsleep[]; extern const u8 BattleScript_IgnoresAndHitsItself[]; extern const u8 BattleScript_SubstituteFade[]; -extern const u8 BattleScript_BerryCurePrlzEnd2[]; -extern const u8 BattleScript_BerryCureParRet[]; -extern const u8 BattleScript_BerryCurePsnEnd2[]; -extern const u8 BattleScript_BerryCurePsnRet[]; -extern const u8 BattleScript_BerryCureBrnEnd2[]; -extern const u8 BattleScript_BerryCureBrnRet[]; -extern const u8 BattleScript_BerryCureFrzEnd2[]; -extern const u8 BattleScript_BerryCureFrzRet[]; -extern const u8 BattleScript_BerryCureFrbEnd2[]; -extern const u8 BattleScript_BerryCureFrbRet[]; -extern const u8 BattleScript_BerryCureSlpEnd2[]; -extern const u8 BattleScript_BerryCureSlpRet[]; +extern const u8 BattleScript_BerryCureStatusEnd2[]; +extern const u8 BattleScript_BerryCureStatusRet[]; extern const u8 BattleScript_BerryCureConfusionEnd2[]; extern const u8 BattleScript_BerryCureConfusionRet[]; -extern const u8 BattleScript_BerryCureChosenStatusEnd2[]; -extern const u8 BattleScript_BerryCureChosenStatusRet[]; extern const u8 BattleScript_WhiteHerbEnd2[]; extern const u8 BattleScript_WhiteHerbRet[]; extern const u8 BattleScript_ItemHealHP_RemoveItemRet[]; @@ -356,6 +345,7 @@ extern const u8 BattleScript_TargetItemStatRaise[]; extern const u8 BattleScript_RockyHelmetActivates[]; extern const u8 BattleScript_ItemHurtEnd2[]; extern const u8 BattleScript_AirBaloonMsgIn[]; +extern const u8 BattleScript_AirBalloonMsgInRet[]; extern const u8 BattleScript_AirBaloonMsgPop[]; extern const u8 BattleScript_ItemHurtRet[]; extern const u8 BattleScript_ToxicOrb[]; diff --git a/include/battle_util.h b/include/battle_util.h index 47c5238f19..819b4a5b65 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -3,6 +3,7 @@ #include "move.h" #include "constants/battle_string_ids.h" +#include "constants/hold_effects.h" #define MOVE_LIMITATION_ZEROMOVE (1 << 0) #define MOVE_LIMITATION_PP (1 << 1) @@ -61,28 +62,6 @@ enum { ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES, }; -// For the first argument of ItemBattleEffects, to deteremine which block of item effects to try -enum ItemCaseId -{ - ITEMEFFECT_NONE, - ITEMEFFECT_ON_SWITCH_IN, - ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, - ITEMEFFECT_LEFTOVERS, // Leftovers, Black Sludge - ITEMEFFECT_NORMAL, - ITEMEFFECT_TRY_HEALING, - ITEMEFFECT_MOVE_END, - ITEMEFFECT_KINGSROCK, - ITEMEFFECT_TARGET, - ITEMEFFECT_ORBS, - ITEMEFFECT_LIFEORB_SHELLBELL, - ITEMEFFECT_USE_LAST_ITEM, // move end effects for just the battler, not whole field - ITEMEFFECT_WHITE_HERB, - ITEMEFFECT_WHITE_HERB_ENDTURN, - ITEMEFFECT_WHITE_HERB_FIRST_TURN, - ITEMEFFECT_MIRROR_HERB, - ITEMEFFECT_MIRROR_HERB_FIRST_TURN, -}; - enum ItemEffect { ITEM_NO_EFFECT, @@ -185,8 +164,8 @@ struct DamageContext uq4_12_t typeEffectivenessModifier; enum Ability abilityAtk; enum Ability abilityDef; - enum ItemHoldEffect holdEffectAtk:16; - enum ItemHoldEffect holdEffectDef:16; + enum HoldEffect holdEffectAtk; + enum HoldEffect holdEffectDef; }; struct BattleContext @@ -217,9 +196,17 @@ enum SkyDropState #define SKY_DROP_NO_TARGET 0xFF #define SKY_DROP_RELEASED_TARGET 0xFE +enum EjectPackTiming +{ + FIRST_TURN, + END_TURN, + OTHER, +}; + void HandleAction_ThrowBall(void); u32 GetCurrentBattleWeather(void); bool32 EndOrContinueWeather(void); +bool32 IsUnnerveBlocked(u32 battler, u32 itemId); bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); bool32 HandleMoveTargetRedirection(void); void HandleAction_UseMove(void); @@ -283,20 +270,19 @@ u32 GetProtectType(enum ProtectMethod method); bool32 CanBattlerEscape(u32 battler); // no ability check void BattleScriptExecute(const u8 *BS_ptr); void BattleScriptPushCursorAndCallback(const u8 *BS_ptr); -u32 ItemBattleEffects(enum ItemCaseId, u32 battler); void ClearVariousBattlerFlags(u32 battler); void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); u32 GetBattleMoveTarget(u16 move, u8 setTarget); u8 GetAttackerObedienceForAction(); -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler); -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler); -enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler); -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability); +enum HoldEffect GetBattlerHoldEffect(u32 battler); +enum HoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler); +enum HoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler); +enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability); u32 GetBattlerHoldEffectParam(u32 battler); -bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); -bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); -bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect); +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move); +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move); +bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum HoldEffect holdEffect); u32 GetMoveSlot(u16 *moves, u32 move); u32 GetBattlerWeight(u32 battler); u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); @@ -338,7 +324,7 @@ bool32 CanFling(u32 battler); bool32 IsTelekinesisBannedSpecies(u16 species); bool32 IsHealBlockPreventingMove(u32 battler, u32 move); bool32 IsBelchPreventingMove(u32 battler, u32 move); -bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId); +bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, u32 itemId); bool32 IsPartnerMonFromSameTrainer(u32 battler); enum DamageCategory GetCategoryBasedOnStats(u32 battler); void SetShellSideArmCategory(void); @@ -348,11 +334,9 @@ void TryRestoreHeldItems(void); bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item); void TrySaveExchangedItem(u32 battler, u16 stolenItem); bool32 IsPartnerMonFromSameTrainer(u32 battler); -enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, enum ItemCaseId caseID); bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes); void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast); bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind); -bool32 TryRoomService(u32 battler); bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); u16 GetUsedHeldItem(u32 battler); bool32 PickupHasValidTarget(u32 battler); @@ -382,7 +366,7 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); bool32 CanBeConfused(u32 battler); -bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, u32 terrainFlag); +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); void TryToRevertMimicryAndFlags(void); bool32 BattleArenaTurnEnd(void); @@ -414,12 +398,11 @@ bool32 HasWeatherEffect(void); bool32 IsAnyTargetAffected(u32 battlerAtk); bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); +void ChooseStatBoostAnimation(u32 battler); void UpdateStallMons(void); -bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); -bool32 TrySwitchInEjectPack(enum ItemCaseId caseID); +bool32 TrySwitchInEjectPack(enum EjectPackTiming timing); u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile); void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue); -u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID); bool32 ItemHealMonVolatile(u32 battler, u16 itemId); void PushHazardTypeToQueue(u32 side, enum Hazards hazardType); bool32 IsHazardOnSide(u32 side, enum Hazards hazardType); @@ -436,5 +419,6 @@ u32 GetNaturePowerMove(u32 battler); void RemoveAbilityFlags(u32 battler); bool32 IsDazzlingAbility(enum Ability ability); bool32 IsAllowedToUseBag(void); +bool32 IsAnyTargetTurnDamaged(u32 battlerAtk); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/config/battle.h b/include/config/battle.h index 20fcc85109..c16f930950 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -168,8 +168,6 @@ #define B_DEFIANT_STICKY_WEB GEN_LATEST // In Gen9+, Defiant activates on Sticky Web regardless of who set it up. In Gen8, Defiant does not activate on Sticky Web set up by an ally after Court Change swaps its side. // Item settings -#define B_HP_BERRIES GEN_LATEST // In Gen4+, berries which restore HP activate immediately after HP drops to half. In Gen3, the effect occurs at the end of the turn. -#define B_BERRIES_INSTANT GEN_LATEST // In Gen4+, most berries activate on battle start/switch-in if applicable. In Gen3, they only activate either at the move end or turn end. #define B_CONFUSE_BERRIES_HEAL GEN_LATEST // Before Gen7, Figy and similar berries restore 1/8th of HP and trigger at half HP. In Gen7 they restore half HP, triggering at 25% HP. In Gen8 they heal 1/3rd of HP. #define B_X_ITEMS_BUFF GEN_LATEST // In Gen7+, the X Items raise a stat by 2 stages instead of 1. #define B_MENTAL_HERB GEN_LATEST // In Gen5+, the Mental Herb cures Taunt, Encore, Torment, Heal Block, and Disable in addition to Infatuation from before. diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 49b83b3a19..8d8517df7f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -135,39 +135,40 @@ enum MoveEndEffects MOVEEND_SYNCHRONIZE_TARGET, MOVEEND_ABILITIES, MOVEEND_ABILITIES_ATTACKER, - MOVEEND_STATUS_IMMUNITY_ABILITIES, + MOVEEND_STATUS_IMMUNITY_ABILITIES, // TODO: Do berries come before???? MOVEEND_SYNCHRONIZE_ATTACKER, MOVEEND_ATTACKER_INVISIBLE, MOVEEND_ATTACKER_VISIBLE, MOVEEND_TARGET_VISIBLE, MOVEEND_ITEM_EFFECTS_TARGET, - MOVEEND_ITEM_EFFECTS_ALL, + MOVEEND_ITEM_EFFECTS_ATTACKER_1, MOVEEND_SYMBIOSIS, - MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move MOVEEND_SUBSTITUTE, MOVEEND_SKY_DROP_CONFUSE, MOVEEND_UPDATE_LAST_MOVES, MOVEEND_MIRROR_MOVE, MOVEEND_DEFROST, MOVEEND_NEXT_TARGET, // Everything up until here is handled for each strike of a spread move + MOVEEND_HP_THRESHHOLD_ITEMS_TARGET, // Activation only during a multi hit move / ability (Parental Bond)) MOVEEND_MULTIHIT_MOVE, MOVEEND_MOVE_BLOCK, - MOVEEND_ITEM_EFFECTS_ATTACKER, - MOVEEND_ITEM_THROAT_SPRAY, + MOVEEND_ITEM_EFFECTS_ATTACKER_2, MOVEEND_ABILITY_BLOCK, - MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip until Opportunist + MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip to Eject Pack MOVEEND_COLOR_CHANGE, // Color Change / Berserk / Anger Shell - MOVEEND_RED_CARD, + MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET, + MOVEEND_RED_CARD, MOVEEND_EJECT_BUTTON, - MOVEEND_LIFEORB_SHELLBELL, + MOVEEND_LIFE_ORB_SHELL_BELL, MOVEEND_FORM_CHANGE, MOVEEND_EMERGENCY_EXIT, MOVEEND_EJECT_PACK, MOVEEND_HIT_ESCAPE, + MOVEEND_ITEMS_EFFECTS_ALL, + MOVEEND_WHITE_HERB, MOVEEND_OPPORTUNIST, MOVEEND_MIRROR_HERB, MOVEEND_PICKPOCKET, - MOVEEND_WHITE_HERB, MOVEEND_THIRD_MOVE_BLOCK, MOVEEND_CHANGED_ITEMS, MOVEEND_SAME_MOVE_TURNS, @@ -175,6 +176,9 @@ enum MoveEndEffects MOVEEND_DANCER, MOVEEND_PURSUIT_NEXT_ACTION, MOVEEND_COUNT, + + // This guarantees a correct jump if new moveends are added directly after MOVEEND_HIT_ESCAPE + MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE = (MOVEEND_HIT_ESCAPE + 1), }; // switch cases diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 35bf757580..43e0e050f4 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -977,9 +977,15 @@ enum FlashFireStringID B_MSG_FLASH_FIRE_NO_BOOST, }; -// gBerryEffectStringIds -enum BerryEffectStringID +// CureStatusBerryEffectStringID +enum CureStatusBerryEffectStringID { + B_MSG_CURED_PARALYSIS, + B_MSG_CURED_POISON, + B_MSG_CURED_BURN, + B_MSG_CURED_FREEEZE, + B_MSG_CURED_FROSTBITE, + B_MSG_CURED_SLEEP, B_MSG_CURED_PROBLEM, B_MSG_NORMALIZED_STATUS, }; diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 101a198b81..f91ea6d5c9 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -1,7 +1,7 @@ #ifndef GUARD_HOLD_EFFECTS_H #define GUARD_HOLD_EFFECTS_H -enum ItemHoldEffect +enum __attribute__((packed)) HoldEffect { HOLD_EFFECT_NONE, HOLD_EFFECT_RESTORE_HP, @@ -120,7 +120,7 @@ enum ItemHoldEffect // Gen7 hold effects HOLD_EFFECT_PROTECTIVE_PADS, HOLD_EFFECT_TERRAIN_EXTENDER, - HOLD_EFFECT_SEEDS, + HOLD_EFFECT_TERRAIN_SEED, HOLD_EFFECT_ADRENALINE_ORB, HOLD_EFFECT_MEMORY, HOLD_EFFECT_Z_CRYSTAL, @@ -151,4 +151,12 @@ enum ItemHoldEffect #define HOLD_EFFECT_PARAM_MISTY_TERRAIN 2 #define HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN 3 +enum ActivationState +{ + ON_ITEM_USABLE_AGAIN, + ON_ITEM_PICK_UP, + ON_BERRY_HARVEST, + ON_ITEM_HP_THRESHOLD, +}; + #endif // GUARD_HOLD_EFFECTS_H diff --git a/include/item.h b/include/item.h index 1f3b1fab1b..eaec831fe5 100644 --- a/include/item.h +++ b/include/item.h @@ -245,6 +245,6 @@ u32 GetItemFlingPower(u32 itemId); u32 GetItemStatus1Mask(u16 itemId); bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile volatile); u32 GetItemSellPrice(u32 itemId); -bool32 IsHoldEffectChoice(enum ItemHoldEffect holdEffect); +bool32 IsHoldEffectChoice(enum HoldEffect holdEffect); #endif // GUARD_ITEM_H diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index 7a1e1cbd58..81d80d29c5 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -20,7 +20,6 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/items.h" diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1cd06fb952..3bd1e3a164 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -23,7 +23,6 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/items.h" #include "constants/trainers.h" @@ -38,7 +37,7 @@ static u32 ChooseMoveOrAction_Singles(u32 battler); static u32 ChooseMoveOrAction_Doubles(u32 battler); static inline void BattleAI_DoAIProcessing(struct AiThinkingStruct *aiThink, u32 battlerAtk, u32 battlerDef); static inline void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef); -static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect); +static bool32 IsPinchBerryItemEffect(enum HoldEffect holdEffect); static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef); // ewram @@ -3781,7 +3780,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } -static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect) +static bool32 IsPinchBerryItemEffect(enum HoldEffect holdEffect) { switch (holdEffect) { @@ -4014,7 +4013,7 @@ static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef) static s32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) { - enum ItemHoldEffect holdEffect = aiData->holdEffects[battlerAtk]; + enum HoldEffect holdEffect = aiData->holdEffects[battlerAtk]; s32 score = 0; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index bc2dedbcab..8099ea9c0d 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -7,7 +7,6 @@ #include "battle_anim.h" #include "battle_controllers.h" #include "battle_main.h" -#include "constants/hold_effects.h" #include "battle_setup.h" #include "data.h" #include "item.h" @@ -668,7 +667,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) { bool32 switchMon = FALSE; enum Ability monAbility = gAiLogicData->abilities[battler]; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u8 opposingBattler = GetBattlerAtPosition(opposingPosition); bool32 hasStatRaised = AnyStatIsRaised(battler); @@ -1027,7 +1026,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u32 lastUsedMove = gAiLogicData->lastUsedMove[battler]; u32 opposingBattler = GetOppositeBattler(battler); bool32 moveAffectsTarget = TRUE; @@ -1616,7 +1615,7 @@ static s32 GetSwitchinWeatherImpact(void) { s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); if (HasWeatherEffect()) { @@ -1681,7 +1680,7 @@ static u32 GetSwitchinRecurringHealing(void) { u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_KLUTZ) @@ -1716,7 +1715,7 @@ static u32 GetSwitchinRecurringDamage(void) { u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_MAGIC_GUARD && ability != ABILITY_KLUTZ) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 63060e0995..07c98fba3a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -20,7 +20,6 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/items.h" @@ -473,7 +472,7 @@ bool32 AI_BattlerAtMaxHp(u32 battlerId) bool32 AI_CanBattlerEscape(u32 battler) { - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; @@ -542,7 +541,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) } // move checks -bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect) +bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum HoldEffect holdEffect) { if (ability == ABILITY_OVERCOAT || (GetGenConfig(GEN_CONFIG_POWDER_GRASS) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) @@ -1359,8 +1358,8 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority) { u32 speedBattlerAI, speedBattler; - enum ItemHoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; - enum ItemHoldEffect holdEffectPlayer = gAiLogicData->holdEffects[battler]; + enum HoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; + enum HoldEffect holdEffectPlayer = gAiLogicData->holdEffects[battler]; enum Ability abilityAI = gAiLogicData->abilities[battlerAI]; enum Ability abilityPlayer = gAiLogicData->abilities[battler]; @@ -1698,9 +1697,9 @@ enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId) return ABILITY_NONE; // Unknown. } -enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) +enum HoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) { - enum ItemHoldEffect holdEffect = HOLD_EFFECT_NONE; + enum HoldEffect holdEffect = HOLD_EFFECT_NONE; if (gBattleMons[battlerId].item == ITEM_NONE) // Failsafe for when user recorded an item but it was consumed return holdEffect; @@ -1959,7 +1958,7 @@ bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbil bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move) { - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; u32 accuracy = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; gPotentialItemEffectBattler = battlerDef; @@ -3056,7 +3055,7 @@ static u32 GetTrapDamage(u32 battlerId) { // ai has no knowledge about turns remaining u32 damage = 0; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[gBattleStruct->wrappedBy[battlerId]]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[gBattleStruct->wrappedBy[battlerId]]; if (gBattleMons[battlerId].volatiles.wrapped) { if (holdEffect == HOLD_EFFECT_BINDING_BAND) @@ -3120,7 +3119,7 @@ static bool32 BattlerAffectedByHail(u32 battlerId, enum Ability ability) static u32 GetWeatherDamage(u32 battlerId) { enum Ability ability = gAiLogicData->abilities[battlerId]; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerId]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battlerId]; u32 damage = 0; u32 weather = AI_GetWeather(); if (!weather) @@ -3218,7 +3217,7 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) { struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler]; enum Ability ability = GetMonAbility(mon); // we know our own party data - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; u32 species = GetMonData(mon, MON_DATA_SPECIES); s32 hazardDamage = 0; u32 type1 = GetSpeciesType(species, 0); @@ -3747,7 +3746,7 @@ bool32 HasChoiceEffect(u32 battler) if (ability == ABILITY_KLUTZ) return FALSE; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; switch (holdEffect) { case HOLD_EFFECT_CHOICE_BAND: @@ -5023,7 +5022,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score } } -bool32 AI_MoveMakesContact(enum Ability ability, enum ItemHoldEffect holdEffect, u32 move) +bool32 AI_MoveMakesContact(enum Ability ability, enum HoldEffect holdEffect, u32 move) { if (MoveMakesContact(move) && ability != ABILITY_LONG_REACH diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 564afa3446..3b572198c3 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -35,7 +35,6 @@ #include "constants/battle_anim.h" #include "constants/battle_move_effects.h" #include "constants/battle_partner.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/party_menu.h" diff --git a/src/battle_debug.c b/src/battle_debug.c index 5c2e0735a1..6a96b52e88 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -35,7 +35,6 @@ #include "constants/moves.h" #include "constants/items.h" #include "constants/rgb.h" -#include "constants/hold_effects.h" #define MAX_MODIFY_DIGITS 4 @@ -230,7 +229,7 @@ enum }; // Static Declarations -static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect); +static const u8 *GetHoldEffectName(enum HoldEffect holdEffect); // const rom data static const u8 sText_Ability[] = _("Ability"); @@ -921,7 +920,7 @@ static void PutAiInfoText(struct BattleDebugMenu *data) if (IsOnPlayerSide(i) && IsBattlerAlive(i)) { enum Ability ability = gAiLogicData->abilities[i]; - enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[i]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[i]; u16 item = gAiLogicData->items[i]; u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75; AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, gAbilitiesInfo[ability].name, x, 0, 0, NULL); @@ -2272,7 +2271,7 @@ static const u8 *const sHoldEffectNames[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_PRIMAL_ORB] = COMPOUND_STRING("Primal Orb"), [HOLD_EFFECT_PROTECTIVE_PADS] = COMPOUND_STRING("Protective Pads"), [HOLD_EFFECT_TERRAIN_EXTENDER] = COMPOUND_STRING("Terrain Extender"), - [HOLD_EFFECT_SEEDS] = COMPOUND_STRING("Seeds"), + [HOLD_EFFECT_TERRAIN_SEED] = COMPOUND_STRING("Seeds"), [HOLD_EFFECT_ADRENALINE_ORB] = COMPOUND_STRING("Adrenaline Orb"), [HOLD_EFFECT_MEMORY] = COMPOUND_STRING("Memory"), [HOLD_EFFECT_Z_CRYSTAL] = COMPOUND_STRING("Z-Crystal"), @@ -2292,7 +2291,7 @@ static const u8 *const sHoldEffectNames[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_OGERPON_MASK] = COMPOUND_STRING("Ogerpon Mask"), [HOLD_EFFECT_BERSERK_GENE] = COMPOUND_STRING("Berserk Gene"), }; -static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect) +static const u8 *GetHoldEffectName(enum HoldEffect holdEffect) { if (sHoldEffectNames[holdEffect] == NULL) return sHoldEffectNames[0]; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 1ddc2b2b01..a95225bf44 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -19,7 +19,6 @@ #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/flags.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" @@ -74,7 +73,7 @@ static const struct GMaxMove sGMaxMoveTable[] = bool32 CanDynamax(u32 battler) { u16 species = GetBattlerVisualSpecies(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Prevents Zigzagoon from dynamaxing in vanilla. if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && !IsOnPlayerSide(battler)) diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 2041f9ecca..4b42d05efd 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_hold_effects.h" #include "battle_util.h" #include "battle_controllers.h" #include "battle_ai_util.h" @@ -7,7 +8,6 @@ #include "battle_scripts.h" #include "constants/battle.h" #include "constants/battle_string_ids.h" -#include "constants/hold_effects.h" #include "constants/abilities.h" #include "constants/items.h" #include "constants/moves.h" @@ -20,7 +20,6 @@ enum EndTurnResolutionOrder ENDTURN_VARIOUS, ENDTURN_WEATHER, ENDTURN_WEATHER_DAMAGE, - ENDTURN_GEN_3_BERRY_ACTIVATION, ENDTURN_EMERGENCY_EXIT_1, ENDTURN_AFFECTION, ENDTURN_FUTURE_SIGHT, @@ -270,20 +269,6 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) return effect; } -static bool32 HandleEndTurnGenThreeBerryActivation(u32 battler) -{ - bool32 effect = FALSE; - - if (B_HP_BERRIES >= GEN_4) // Skip handler for > Gen3 - { - gBattleStruct->endTurnEventsCounter++; - return effect; - } - gBattleStruct->turnEffectsBattlerId++; - effect = TryRestoreHPBerries(battler, ITEMEFFECT_NORMAL); - return effect; -} - static bool32 HandleEndTurnEmergencyExit(u32 battler) { bool32 effect = FALSE; @@ -514,7 +499,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) break; } case FIRST_EVENT_BLOCK_HEAL_ITEMS: - if (ItemBattleEffects(ITEMEFFECT_LEFTOVERS, battler)) + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsLeftoversActivation)) effect = TRUE; gBattleStruct->eventBlockCounter = 0; gBattleStruct->turnEffectsBattlerId++; @@ -849,6 +834,7 @@ static bool32 HandleEndTurnTaunt(u32 battler) if (gDisableStructs[battler].tauntTimer && --gDisableStructs[battler].tauntTimer == 0) { + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_BufferEndTurn); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); effect = TRUE; @@ -866,6 +852,7 @@ static bool32 HandleEndTurnTorment(u32 battler) if (gDisableStructs[battler].tormentTimer == gBattleTurnCounter) { gBattleMons[battler].volatiles.torment = FALSE; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_TormentEnds); effect = TRUE; } @@ -891,6 +878,7 @@ static bool32 HandleEndTurnEncore(u32 battler) { gDisableStructs[battler].encoredMove = 0; gDisableStructs[battler].encoreTimer = 0; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_EncoredNoMore); effect = TRUE; } @@ -921,6 +909,7 @@ static bool32 HandleEndTurnDisable(u32 battler) else if (--gDisableStructs[battler].disableTimer == 0) // disable ends { gDisableStructs[battler].disabledMove = 0; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_DisabledNoMore); effect = TRUE; } @@ -971,6 +960,7 @@ static bool32 HandleEndTurnHealBlock(u32 battler) if (gBattleMons[battler].volatiles.healBlock && gDisableStructs[battler].healBlockTimer == gBattleTurnCounter) { gBattleMons[battler].volatiles.healBlock = FALSE; + gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_BufferEndTurn); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_HEAL_BLOCK); effect = TRUE; @@ -1014,7 +1004,7 @@ static bool32 HandleEndTurnYawn(u32 battler) && !IsLeafGuardProtected(battler, ability)) { gEffectBattler = gBattlerTarget = battler; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; @@ -1424,17 +1414,18 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) } case THIRD_EVENT_BLOCK_ITEMS: { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + // TODO: simplify + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); switch (holdEffect) { case HOLD_EFFECT_FLAME_ORB: case HOLD_EFFECT_STICKY_BARB: case HOLD_EFFECT_TOXIC_ORB: - if (ItemBattleEffects(ITEMEFFECT_ORBS, battler)) + if (ItemBattleEffects(battler, 0, holdEffect, IsOrbsActivation)) effect = TRUE; break; case HOLD_EFFECT_WHITE_HERB: - if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB_ENDTURN, battler)) + if (ItemBattleEffects(battler, 0, holdEffect, IsWhiteHerbEndTurnActivation)) effect = TRUE; break; default: @@ -1475,8 +1466,8 @@ static bool32 HandleEndTurnFormChangeAbilities(u32 battler) static bool32 HandleEndTurnEjectPack(u32 battler) { - gBattleStruct->turnEffectsBattlerId++; - return TrySwitchInEjectPack(ITEMEFFECT_NORMAL); + gBattleStruct->endTurnEventsCounter++; + return TrySwitchInEjectPack(END_TURN); } static bool32 HandleEndTurnDynamax(u32 battler) @@ -1515,7 +1506,6 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = [ENDTURN_VARIOUS] = HandleEndTurnVarious, [ENDTURN_WEATHER] = HandleEndTurnWeather, [ENDTURN_WEATHER_DAMAGE] = HandleEndTurnWeatherDamage, - [ENDTURN_GEN_3_BERRY_ACTIVATION] = HandleEndTurnGenThreeBerryActivation, [ENDTURN_EMERGENCY_EXIT_1] = HandleEndTurnEmergencyExit, [ENDTURN_AFFECTION] = HandleEndTurnAffection, [ENDTURN_FUTURE_SIGHT] = HandleEndTurnFutureSight, diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c new file mode 100644 index 0000000000..fc8678a613 --- /dev/null +++ b/src/battle_hold_effects.c @@ -0,0 +1,1293 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_ai_util.h" // maybe move some stuff over to battle.h +#include "battle_controllers.h" +#include "battle_util.h" +#include "battle_hold_effects.h" +#include "battle_scripts.h" +#include "item.h" +#include "string_util.h" +#include "data/hold_effects.h" +#include "constants/berry.h" + +bool32 IsOnSwitchInActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onSwitchIn; } +bool32 IsOnSwitchInFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onSwitchInFirstTurn; } +bool32 IsMirrorHerbActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].mirrorHerb; } +bool32 IsMirrorHerbFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].mirrorHerbFirstTurn; } +bool32 IsWhiteHerbActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerb; } +bool32 IsWhiteHerbFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerbFirstTurn; } +bool32 IsWhiteHerbEndTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerbEndTurn; } +bool32 IsOnStatusChangeActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onStatusChange; } +bool32 IsOnHpThresholdActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onHpThreshold; } +bool32 IsKeeMarangaBerryActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].keeMarangaBerry; } +bool32 IsOnTargetHitActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onTargetAfterHit; } +bool32 IsOnAttackerAfterHitActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onAttackerAfterHit; } +bool32 IsLifeOrbShellBellActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].lifeOrbShellBell; } +bool32 IsLeftoversActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].leftovers; } +bool32 IsOrbsActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].orbs; } +bool32 IsOnEffectActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onEffect; } +bool32 IsActivationOnBerry(enum HoldEffect holdEffect) { return GetItemPocket(gLastUsedItem) == POCKET_BERRIES; } + +bool32 IsActivationForceTriggerItem(enum HoldEffect holdEffect) +{ + return gHoldEffectsInfo[holdEffect].onSwitchIn + || gHoldEffectsInfo[holdEffect].whiteHerb + || gHoldEffectsInfo[holdEffect].onStatusChange + || gHoldEffectsInfo[holdEffect].onHpThreshold; +} + +static enum ItemEffect TryDoublePrize(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsOnPlayerSide(battler) && !gBattleStruct->moneyMultiplierItem) + { + gBattleStruct->moneyMultiplier *= 2; + gBattleStruct->moneyMultiplierItem = TRUE; + } + + return effect; +} + +enum ItemEffect TryBoosterEnergy(u32 battler, enum Ability ability, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].volatiles.transformed) + return ITEM_NO_EFFECT; + + if (((ability == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) + || ((ability == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) + { + PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); + gBattlerAbility = gBattleScripting.battler = battler; + gDisableStructs[battler].boosterEnergyActivated = TRUE; + gLastUsedItem = ITEM_BOOSTER_ENERGY; + RecordAbilityBattle(battler, ability); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BoosterEnergyEnd2); + else + BattleScriptCall(BattleScript_BoosterEnergyRet); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryRoomService(u32 battler, ActivationTiming timing) +{ + if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && CompareStat(battler, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN)) + { + gEffectBattler = gBattleScripting.battler = battler; + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_SPEED; + gBattleScripting.animArg2 = 0; + gLastUsedItem = gBattleMons[battler].item; + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + + return ITEM_STATS_CHANGE; + } + + return ITEM_NO_EFFECT; +} + +enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, ActivationTiming timing) +{ + if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gLastUsedItem = itemId; // For surge abilities + gEffectBattler = gBattleScripting.battler = battler; + SET_STATCHANGER(statId, 1, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; + gBattleScripting.animArg2 = 0; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + return ITEM_STATS_CHANGE; + } + return ITEM_NO_EFFECT; +} + +static enum ItemEffect TryTerrainSeeds(u32 battler, u32 item, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + switch (GetItemHoldEffectParam(item)) + { + case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, timing); + break; + case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, timing); + break; + case HOLD_EFFECT_PARAM_MISTY_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, timing); + break; + case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: + effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, timing); + break; + } + + return effect; +} + +static bool32 CanBeInfinitelyConfused(u32 battler) +{ + enum Ability ability = GetBattlerAbility(battler); + if (ability == ABILITY_OWN_TEMPO + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) + || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) + return FALSE; + return TRUE; +} + +static enum ItemEffect TryBerserkGene(u32 battler, ActivationTiming timing) +{ + if (CanBeInfinitelyConfused(battler)) + gBattleMons[battler].volatiles.infiniteConfusion = TRUE; + + SET_STATCHANGER(STAT_ATK, 2, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; + gBattleScripting.animArg2 = 0; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerserkGeneRetEnd2); + else + BattleScriptCall(BattleScript_BerserkGeneRet); + + return ITEM_STATS_CHANGE; +} + +static enum ItemEffect RestoreWhiteHerbStats(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + for (u32 i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) + { + gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; + effect = ITEM_STATS_CHANGE; + } + } + if (effect != ITEM_NO_EFFECT) + { + if (timing == IsWhiteHerbActivation) + BattleScriptCall(BattleScript_WhiteHerbRet); + else + BattleScriptExecute(BattleScript_WhiteHerbEnd2); + } + + return effect; +} + +static enum ItemEffect TryConsumeMirrorHerb(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gProtectStructs[battler].eatMirrorHerb) + { + gProtectStructs[battler].eatMirrorHerb = 0; + ChooseStatBoostAnimation(battler); + if (timing == IsMirrorHerbFirstTurnActivation) + BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); + else + BattleScriptCall(BattleScript_MirrorHerbCopyStatChange); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryKingsRock(u32 battlerAtk, u32 battlerDef, u32 item) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battlerAtk); + u32 holdEffectParam = GetItemHoldEffectParam(item); + + if (B_SERENE_GRACE_BOOST >= GEN_5 && ability == ABILITY_SERENE_GRACE) + holdEffectParam *= 2; + if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) + holdEffectParam *= 2; + if (IsBattlerTurnDamaged(battlerDef) + && !MoveIgnoresKingsRock(gCurrentMove) + && IsBattlerAlive(battlerDef) + && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, holdEffectParam) + && ability != ABILITY_STENCH) + { + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; + BattleScriptPushCursor(); + SetMoveEffect(battlerAtk, battlerDef, FALSE, FALSE); + BattleScriptPop(); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryAirBallon(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (timing == IsOnTargetHitActivation) + { + if (IsBattlerTurnDamaged(battler)) + { + BattleScriptCall(BattleScript_AirBaloonMsgPop); + effect = ITEM_EFFECT_OTHER; + } + } + else if (!gSpecialStatuses[battler].switchInItemDone) + { + gSpecialStatuses[battler].switchInItemDone = TRUE; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptPushCursorAndCallback(BattleScript_AirBaloonMsgIn); + else + BattleScriptCall(BattleScript_AirBalloonMsgInRet); + RecordItemEffectBattle(battler, HOLD_EFFECT_AIR_BALLOON); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryRockyHelmet(u32 battlerDef, u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battlerAtk); + + if (IsBattlerTurnDamaged(battlerDef) + && IsBattlerAlive(battlerAtk) + && !CanBattlerAvoidContactEffects(battlerAtk, battlerDef, ability, GetBattlerHoldEffect(battlerAtk), gCurrentMove) + && !IsAbilityAndRecord(battlerAtk, ability, ABILITY_MAGIC_GUARD)) + { + gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 6; + if (gBattleStruct->moveDamage[battlerAtk] == 0) + gBattleStruct->moveDamage[battlerAtk] = 1; + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item); + BattleScriptCall(BattleScript_RockyHelmetActivates); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryWeaknessPolicy(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SUPER_EFFECTIVE) + { + BattleScriptCall(BattleScript_WeaknessPolicy); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TrySnowball(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_ICE) + { + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_ATK, 1, FALSE); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryLuminousMoss(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_WATER) + { + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_SPDEF, 1, FALSE); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCellBattery(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_ELECTRIC) + { + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_ATK, 1, FALSE); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryAbsorbBulb(u32 battlerDef) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && IsBattlerTurnDamaged(battlerDef) + && GetBattleMoveType(gCurrentMove) == TYPE_WATER) + { + effect = ITEM_STATS_CHANGE; + BattleScriptCall(BattleScript_TargetItemStatRaise); + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + } + + return effect; +} + +static enum ItemEffect TryJabocaBerry(u32 battlerDef, u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerAtk) + && IsBattlerTurnDamaged(battlerDef) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && IsBattleMovePhysical(gCurrentMove) + && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD)) + { + gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 8; + if (gBattleStruct->moveDamage[battlerAtk] == 0) + gBattleStruct->moveDamage[battlerAtk] = 1; + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + gBattleStruct->moveDamage[gBattlerAttacker] *= 2; + + BattleScriptCall(BattleScript_JabocaRowapBerryActivates); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryRowapBerry(u32 battlerDef, u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerAtk) + && IsBattlerTurnDamaged(battlerDef) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && IsBattleMoveSpecial(gCurrentMove) + && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD)) + { + gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 8; + if (gBattleStruct->moveDamage[battlerAtk] == 0) + gBattleStruct->moveDamage[battlerAtk] = 1; + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + gBattleStruct->moveDamage[battlerAtk] *= 2; + + BattleScriptCall(BattleScript_JabocaRowapBerryActivates); + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TrySetEnigmaBerry(u32 battlerDef, u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerDef) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && ((IsBattlerTurnDamaged(battlerDef) && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) + && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) + { + gBattleStruct->moveDamage[battlerDef] = (gBattleMons[battlerDef].maxHP * 25 / 100) * -1; + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + gBattleStruct->moveDamage[battlerDef] *= 2; + + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryBlunderPolicy(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleStruct->blunderPolicy + && IsBattlerAlive(battlerAtk) + && CompareStat(battlerAtk, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) + { + gBattleStruct->blunderPolicy = FALSE; + SET_STATCHANGER(STAT_SPEED, 2, FALSE); + BattleScriptCall(BattleScript_AttackerItemStatRaise); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryMentalHerb(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + // Check infatuation + if (gBattleMons[battler].volatiles.infatuation) + { + gBattleMons[battler].volatiles.infatuation = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; + StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); + effect = ITEM_EFFECT_OTHER; + } + if (B_MENTAL_HERB >= GEN_5) + { + // Check taunt + if (gDisableStructs[battler].tauntTimer != 0) + { + gDisableStructs[battler].tauntTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); + effect = ITEM_EFFECT_OTHER; + } + // Check encore + if (gDisableStructs[battler].encoreTimer != 0) + { + gDisableStructs[battler].encoredMove = 0; + gDisableStructs[battler].encoreTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; + effect = ITEM_EFFECT_OTHER; + } + // Check torment + if (gBattleMons[battler].volatiles.torment == TRUE) + { + gBattleMons[battler].volatiles.torment = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; + effect = ITEM_EFFECT_OTHER; + } + // Check heal block + if (gBattleMons[battler].volatiles.healBlock) + { + gBattleMons[battler].volatiles.healBlock = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; + effect = ITEM_EFFECT_OTHER; + } + // Check disable + if (gDisableStructs[battler].disableTimer != 0) + { + gDisableStructs[battler].disableTimer = 0; + gDisableStructs[battler].disabledMove = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; + effect = ITEM_EFFECT_OTHER; + } + } + + if (effect) + BattleScriptCall(BattleScript_MentalHerbCureRet); + + return effect; +} + +static enum ItemEffect TryThroatSray(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsSoundMove(gCurrentMove) + && gMultiHitCounter == 0 + && IsBattlerAlive(battlerAtk) + && IsAnyTargetTurnDamaged(battlerAtk) + && CompareStat(battlerAtk, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN) + && !NoAliveMonsForEitherParty()) // Don't activate if battle will end + { + SET_STATCHANGER(STAT_SPATK, 1, FALSE); + BattleScriptCall(BattleScript_AttackerItemStatRaise); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect DamagedStatBoostBerryEffect(u32 battlerDef, u32 battlerAtk, u32 statId, enum DamageCategory category) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsBattlerAlive(battlerDef) || !CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) + return effect; + + if (gBattleScripting.overrideBerryRequirements + || (!DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && GetBattleMoveCategory(gCurrentMove) == category + && IsBattlerTurnDamaged(battlerDef))) + { + if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) + SET_STATCHANGER(statId, 2, FALSE); + else + SET_STATCHANGER(statId, 1, FALSE); + + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; + gBattleScripting.animArg2 = 0; + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryShellBell(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleScripting.savedDmg > 0 + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && (IsAnyTargetTurnDamaged(battlerAtk) || gBattleScripting.savedDmg > 0) + && !IsBattlerAtMaxHp(battlerAtk) + && IsBattlerAlive(battlerAtk) + && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT + && !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerAtk].volatiles.healBlock)) + { + gBattleStruct->moveDamage[battlerAtk] = (gBattleScripting.savedDmg / GetBattlerHoldEffectParam(battlerAtk)) * -1; + if (gBattleStruct->moveDamage[battlerAtk] == 0) + gBattleStruct->moveDamage[battlerAtk] = -1; + BattleScriptCall(BattleScript_ItemHealHP_Ret); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryLifeOrb(u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerAlive(battlerAtk) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && (IsAnyTargetTurnDamaged(battlerAtk) || gBattleScripting.savedDmg > 0) + && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD) + && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT + && !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove)) + { + DebugPrintf("move %d", gCurrentMove); + gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 10; + if (gBattleStruct->moveDamage[battlerAtk] == 0) + gBattleStruct->moveDamage[battlerAtk] = 1; + BattleScriptCall(BattleScript_ItemHurtRet); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryStickyBarbOnTargetHit(u32 battlerDef, u32 battlerAtk) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (IsBattlerTurnDamaged(battlerDef) + && !CanBattlerAvoidContactEffects(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), GetBattlerHoldEffect(battlerAtk), gCurrentMove) + && !DoesSubstituteBlockMove(battlerAtk, battlerDef, gCurrentMove) + && IsBattlerAlive(battlerAtk) + && CanStealItem(battlerAtk, battlerDef, gBattleMons[battlerDef].item) + && gBattleMons[battlerAtk].item == ITEM_NONE) + { + // No sticky hold checks. + gEffectBattler = battlerDef; + StealTargetItem(battlerAtk, battlerDef); // Attacker takes target's barb + BattleScriptCall(BattleScript_StickyBarbTransfer); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryStickyBarbOnEndTurn(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battler].item); + BattleScriptExecute(BattleScript_ItemHurtEnd2); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryToxicOrb(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (CanBePoisoned(battler, battler, ability, ability)) // Can corrosion trigger toxic orb on itself? + { + gBattleMons[battler].status1 = STATUS1_TOXIC_POISON; + BattleScriptExecute(BattleScript_ToxicOrb); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryFlameOrb(u32 battler) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (CanBeBurned(battler, battler, ability)) + { + gBattleMons[battler].status1 = STATUS1_BURN; + BattleScriptExecute(BattleScript_FlameOrb); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryLeftovers(u32 battler, enum HoldEffect holdEffect) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].hp < gBattleMons[battler].maxHP + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock)) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; + RecordItemEffectBattle(battler, holdEffect); + BattleScriptExecute(BattleScript_ItemHealHP_End2); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryBlackSludge(u32 battler, enum HoldEffect holdEffect) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) + { + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + RecordItemEffectBattle(battler, holdEffect); + BattleScriptExecute(BattleScript_ItemHurtEnd2); + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureParalysis(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) + { + gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PARALYSIS; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCurePoison(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) + { + gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_POISON; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureBurn(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_BURN) + { + gBattleMons[battler].status1 &= ~STATUS1_BURN; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_BURN; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureFreezeOrFrostbite(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_FREEZE) + { + gBattleMons[battler].status1 &= ~STATUS1_FREEZE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_FREEEZE; + effect = ITEM_STATUS_CHANGE; + } + else if (gBattleMons[battler].status1 & STATUS1_FROSTBITE) + { + gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_FROSTBITE; + effect = ITEM_STATUS_CHANGE; + } + + if (effect == ITEM_STATUS_CHANGE) + { + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + } + + return effect; +} + +static enum ItemEffect TryCureSleep(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { + gBattleMons[battler].status1 &= ~STATUS1_SLEEP; + gBattleMons[battler].volatiles.nightmare = FALSE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_SLEEP; + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TryCureConfusion(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (gBattleMons[battler].volatiles.confusionTurns > 0) + { + RemoveConfusionStatus(battler); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); + else + BattleScriptCall(BattleScript_BerryCureConfusionRet); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect TryCureAnyStatus(u32 battler, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + u32 string = 0; + + if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].volatiles.confusionTurns > 0)) + { + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + { + gBattleMons[battler].volatiles.nightmare = FALSE; + StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_BURN) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); + string++; + } + if (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); + string++; + } + if (gBattleMons[battler].volatiles.confusionTurns > 0) + { + StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); + string++; + } + if (string <= 1) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; + else + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; + gBattleMons[battler].status1 = 0; + RemoveConfusionStatus(battler); + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryCureStatusEnd2); + else + BattleScriptCall(BattleScript_BerryCureStatusRet); + effect = ITEM_STATUS_CHANGE; + } + + return effect; +} + +enum HealAmount +{ + FIXED_HEAL_AMOUNT, + PERCENT_HEAL_AMOUNT, +}; + +static u32 ItemHealHp(u32 battler, u32 itemId, enum HealAmount percentHeal, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (!(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock) + && HasEnoughHpToEatBerry(battler, ability, 2, itemId)) + { + if (percentHeal == PERCENT_HEAL_AMOUNT) + gBattleStruct->moveDamage[battler] = (GetNonDynamaxMaxHP(battler) * GetItemHoldEffectParam(itemId) / 100) * -1; + else + gBattleStruct->moveDamage[battler] = GetItemHoldEffectParam(itemId) * -1; + + if (ability == ABILITY_RIPEN && GetItemPocket(itemId) == POCKET_BERRIES) + gBattleStruct->moveDamage[battler] *= 2; + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + else + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); + + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static u32 ItemRestorePp(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + struct Pokemon *mon = GetBattlerMon(battler); + u32 i, changedPP = 0; + enum Ability ability = GetBattlerAbility(battler); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); + u32 currentPP = GetMonData(mon, MON_DATA_PP1 + i); + u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + u32 maxPP = CalculatePPWithBonus(move, ppBonuses, i); + if (move && (currentPP == 0 || (gBattleScripting.overrideBerryRequirements && currentPP != maxPP))) + { + u32 ppRestored = GetItemHoldEffectParam(itemId); + + if (ability == ABILITY_RIPEN) + { + ppRestored *= 2; + gBattlerAbility = battler; + } + if (currentPP + ppRestored > maxPP) + changedPP = maxPP; + else + changedPP = currentPP + ppRestored; + + PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryPPHealEnd2); + else + BattleScriptCall(BattleScript_BerryPPHealRet); + + gBattleScripting.battler = battler; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + MarkBattlerForControllerExec(battler); + if (MOVE_IS_PERMANENT(battler, i)) + gBattleMons[battler].pp[i] = changedPP; + effect = ITEM_PP_CHANGE; + } + } + return effect; +} + +static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + u32 hpFraction = B_CONFUSE_BERRIES_HEAL >= GEN_7 ? 4 : 2; + u32 ability = GetBattlerAbility(battler); + + if (HasEnoughHpToEatBerry(battler, ability, hpFraction, itemId) + && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock)) + { + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); + + gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / GetItemHoldEffectParam(itemId); + if (gBattleStruct->moveDamage[battler] == 0) + gBattleStruct->moveDamage[battler] = 1; + gBattleStruct->moveDamage[battler] *= -1; + + if (ability == ABILITY_RIPEN) + gBattleStruct->moveDamage[battler] *= 2; + + if (timing == IsOnSwitchInFirstTurnActivation) + { + if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) + BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); + else + BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); + } + else + { + if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) + BattleScriptCall(BattleScript_BerryConfuseHealRet); + else + BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); + } + + effect = ITEM_HP_CHANGE; + } + + return effect; +} + +static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + enum Ability ability = GetBattlerAbility(battler); + + if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) + && HasEnoughHpToEatBerry(battler, ability, GetItemHoldEffectParam(itemId), itemId)) + { + gEffectBattler = gBattleScripting.battler = battler; + SET_STATCHANGER(statId, ability == ABILITY_RIPEN ? 2 : 1, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; + gBattleScripting.animArg2 = 0; + + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect CriticalHitRatioUp(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!gBattleMons[battler].volatiles.focusEnergy + && !gBattleMons[battler].volatiles.dragonCheer + && HasEnoughHpToEatBerry(battler, GetBattlerAbility(battler), GetItemHoldEffectParam(itemId), itemId)) + { + gBattleMons[battler].volatiles.focusEnergy = TRUE; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); + else + BattleScriptCall(BattleScript_BerryFocusEnergyRet); + effect = ITEM_EFFECT_OTHER; + } + + return effect; +} + +static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + s32 stat; + + for (stat = STAT_ATK; stat < NUM_STATS; stat++) + { + if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) + break; + } + + if (stat == NUM_STATS) + return effect; + + enum Ability ability = GetBattlerAbility(battler); + if (HasEnoughHpToEatBerry(battler, ability, GetItemHoldEffectParam(itemId), itemId)) + { + u32 savedAttacker = gBattlerAttacker; + // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker + gBattlerAttacker = gBattleScripting.battler = battler; + gBattleScripting.statChanger = 0; + if (ability != ABILITY_CONTRARY) + stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); + else + stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantLowerStat); + gBattlerAttacker = savedAttacker; + + PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); + SET_STATCHANGER(stat, ability == ABILITY_RIPEN ? 4 : 2, FALSE); + gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + stat; + gBattleScripting.animArg2 = 0; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); + else + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + effect = ITEM_STATS_CHANGE; + } + + return effect; +} + +static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + + if (HasEnoughHpToEatBerry(battler, GetBattlerAbility(battler), 4, itemId)) + { + gBattleStruct->battlerState[battler].usedMicleBerry = TRUE; + if (timing == IsOnSwitchInFirstTurnActivation) + BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); + else + BattleScriptCall(BattleScript_MicleBerryActivateRet); + effect = ITEM_EFFECT_OTHER; + } + return effect; +} + +enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect holdEffect, ActivationTiming timing) +{ + enum ItemEffect effect = ITEM_NO_EFFECT; + u32 item = (timing == IsActivationOnBerry) ? gLastUsedItem : gBattleMons[itemBattler].item; + + if (holdEffect == HOLD_EFFECT_NONE + || !timing(holdEffect) + || IsUnnerveBlocked(itemBattler, item)) + return effect; + + if (!IsBattlerAlive(itemBattler) + && holdEffect != HOLD_EFFECT_ROWAP_BERRY // Hacky workaround for them right now + && holdEffect != HOLD_EFFECT_JABOCA_BERRY + && holdEffect != HOLD_EFFECT_ROCKY_HELMET) + return effect; + + switch (holdEffect) + { + case HOLD_EFFECT_DOUBLE_PRIZE: + effect = TryDoublePrize(itemBattler); + break; + case HOLD_EFFECT_ROOM_SERVICE: + effect = TryRoomService(itemBattler, timing); + break; + case HOLD_EFFECT_TERRAIN_SEED: + effect = TryTerrainSeeds(itemBattler, item, timing); + break; + case HOLD_EFFECT_BERSERK_GENE: + effect = TryBerserkGene(itemBattler, timing); + break; + case HOLD_EFFECT_BOOSTER_ENERGY: + effect = TryBoosterEnergy(itemBattler, GetBattlerAbility(itemBattler), timing); + break; + case HOLD_EFFECT_WHITE_HERB: + effect = RestoreWhiteHerbStats(itemBattler, timing); + break; + case HOLD_EFFECT_MIRROR_HERB: + effect = TryConsumeMirrorHerb(itemBattler, timing); + break; + case HOLD_EFFECT_FLINCH: // Kings Rock + effect = TryKingsRock(itemBattler, battler, item); + break; + case HOLD_EFFECT_AIR_BALLOON: + effect = TryAirBallon(itemBattler, timing); + break; + case HOLD_EFFECT_ROCKY_HELMET: + effect = TryRockyHelmet(itemBattler, battler); + break; + case HOLD_EFFECT_WEAKNESS_POLICY: + effect = TryWeaknessPolicy(itemBattler); + break; + case HOLD_EFFECT_SNOWBALL: + effect = TrySnowball(itemBattler); + break; + case HOLD_EFFECT_LUMINOUS_MOSS: + effect = TryLuminousMoss(itemBattler); + break; + case HOLD_EFFECT_CELL_BATTERY: + effect = TryCellBattery(itemBattler); + break; + case HOLD_EFFECT_ABSORB_BULB: + effect = TryAbsorbBulb(itemBattler); + break; + case HOLD_EFFECT_JABOCA_BERRY: + effect = TryJabocaBerry(itemBattler, battler); + break; + case HOLD_EFFECT_ROWAP_BERRY: + effect = TryRowapBerry(itemBattler, battler); + break; + case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move + effect = TrySetEnigmaBerry(itemBattler, battler); + break; + case HOLD_EFFECT_BLUNDER_POLICY: + effect = TryBlunderPolicy(itemBattler); + break; + case HOLD_EFFECT_MENTAL_HERB: + effect = TryMentalHerb(itemBattler); + break; + case HOLD_EFFECT_THROAT_SPRAY: + effect = TryThroatSray(itemBattler); + break; + case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move + effect = DamagedStatBoostBerryEffect(itemBattler, battler, STAT_DEF, DAMAGE_CATEGORY_PHYSICAL); + break; + case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move + effect = DamagedStatBoostBerryEffect(itemBattler, battler, STAT_SPDEF, DAMAGE_CATEGORY_SPECIAL); + break; + case HOLD_EFFECT_SHELL_BELL: + effect = TryShellBell(itemBattler); + break; + case HOLD_EFFECT_LIFE_ORB: + effect = TryLifeOrb(itemBattler); + break; + case HOLD_EFFECT_STICKY_BARB: + if (timing == IsOnTargetHitActivation) + effect = TryStickyBarbOnTargetHit(itemBattler, battler); + else + effect = TryStickyBarbOnEndTurn(itemBattler); + break; + case HOLD_EFFECT_TOXIC_ORB: + effect = TryToxicOrb(itemBattler); + break; + case HOLD_EFFECT_FLAME_ORB: + effect = TryFlameOrb(itemBattler); + break; + case HOLD_EFFECT_LEFTOVERS: + effect = TryLeftovers(itemBattler, holdEffect); + break; + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(itemBattler, TYPE_POISON)) + effect = TryLeftovers(itemBattler, holdEffect); + else + effect = TryBlackSludge(itemBattler, holdEffect); + break; + case HOLD_EFFECT_CURE_PAR: // Cheri Berry + effect = TryCureParalysis(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_PSN: // Pecha Berry + effect = TryCurePoison(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_BRN: // Rawst Berry + effect = TryCureBurn(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_FRZ: // Aspear Berry + effect = TryCureFreezeOrFrostbite(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_SLP: // Chesto Berry + effect = TryCureSleep(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_CONFUSION: // Persim Berry + effect = TryCureConfusion(itemBattler, timing); + break; + case HOLD_EFFECT_CURE_STATUS: // Lum Berry + effect = TryCureAnyStatus(itemBattler, timing); + break; + case HOLD_EFFECT_RESTORE_HP: // Oran Berry / Berry Juice + effect = ItemHealHp(itemBattler, item, FIXED_HEAL_AMOUNT, timing); + break; + case HOLD_EFFECT_RESTORE_PCT_HP: // Sitrus Berry + effect = ItemHealHp(itemBattler, item, PERCENT_HEAL_AMOUNT, timing); + break; + case HOLD_EFFECT_RESTORE_PP: // Leppa Berry + effect = ItemRestorePp(itemBattler, item, timing); + break; + case HOLD_EFFECT_CONFUSE_SPICY: // Figy Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SPICY, timing); + break; + case HOLD_EFFECT_CONFUSE_DRY: // Wiki Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_DRY, timing); + break; + case HOLD_EFFECT_CONFUSE_SWEET: // Mago Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SWEET, timing); + break; + case HOLD_EFFECT_CONFUSE_BITTER: // Aguav Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_BITTER, timing); + break; + case HOLD_EFFECT_CONFUSE_SOUR: // Iapapa Berry + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SOUR, timing); + break; + case HOLD_EFFECT_ATTACK_UP: // Liechi Berry + effect = StatRaiseBerry(itemBattler, item, STAT_ATK, timing); + break; + case HOLD_EFFECT_DEFENSE_UP: // Ganlon Berry + effect = StatRaiseBerry(itemBattler, item, STAT_DEF, timing); + break; + case HOLD_EFFECT_SPEED_UP: // Salac Berry + effect = StatRaiseBerry(itemBattler, item, STAT_SPEED, timing); + break; + case HOLD_EFFECT_SP_ATTACK_UP: // Petaya Berry + effect = StatRaiseBerry(itemBattler, item, STAT_SPATK, timing); + break; + case HOLD_EFFECT_SP_DEFENSE_UP: // Apicot Berry + effect = StatRaiseBerry(itemBattler, item, STAT_SPDEF, timing); + break; + case HOLD_EFFECT_CRITICAL_UP: // Lansat Berry + effect = CriticalHitRatioUp(itemBattler, item, timing); + break; + case HOLD_EFFECT_RANDOM_STAT_UP: // Starf Berry + effect = RandomStatRaiseBerry(itemBattler, item, timing); + break; + case HOLD_EFFECT_MICLE_BERRY: + effect = TrySetMicleBerry(itemBattler, item, timing); + break; + default: + break; + } + + if (effect == ITEM_STATUS_CHANGE) + { + BtlController_EmitSetMonData(itemBattler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[itemBattler].status1); + MarkBattlerForControllerExec(itemBattler); + } + + if (effect) + { + gLastUsedItem = item; + gBattleScripting.battler = gPotentialItemEffectBattler = itemBattler; + if ((item >= FIRST_BERRY_INDEX && item <= LAST_BERRY_INDEX)) + GetBattlerPartyState(itemBattler)->ateBerry = TRUE; + } + + return effect; +} diff --git a/src/battle_main.c b/src/battle_main.c index 5e64ca8cb8..81a5205250 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -6,6 +6,7 @@ #include "battle_arena.h" #include "battle_controllers.h" #include "battle_end_turn.h" +#include "battle_hold_effects.h" #include "battle_interface.h" #include "battle_main.h" #include "battle_message.h" @@ -66,7 +67,6 @@ #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/battle_partner.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/party_menu.h" @@ -3012,7 +3012,7 @@ static void BattleStartClearSetData(void) s32 i; TurnValuesCleanUp(FALSE); - SpecialStatusesClear(); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); memset(&gDisableStructs, 0, sizeof(gDisableStructs)); memset(&gFieldTimers, 0, sizeof(gFieldTimers)); @@ -3884,7 +3884,8 @@ static void TryDoEventsBeforeFirstTurn(void) case FIRST_TURN_EVENTS_ITEM_EFFECTS: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { - if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++])) + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnSwitchInFirstTurnActivation)) return; } gBattleStruct->switchInBattlerCounter = 0; @@ -3893,7 +3894,8 @@ static void TryDoEventsBeforeFirstTurn(void) case FIRST_TURN_EVENTS_WHITE_HERB: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { - if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++])) + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbFirstTurnActivation)) return; } gBattleStruct->switchInBattlerCounter = 0; @@ -3912,7 +3914,8 @@ static void TryDoEventsBeforeFirstTurn(void) case FIRST_TURN_EVENTS_MIRROR_HERB: while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest { - if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB_FIRST_TURN, gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++])) + u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbFirstTurnActivation)) return; } gBattleStruct->switchInBattlerCounter = 0; @@ -3920,7 +3923,7 @@ static void TryDoEventsBeforeFirstTurn(void) break; case FIRST_TURN_EVENTS_EJECT_PACK: gBattleStruct->eventsBeforeFirstTurnState++; - if (TrySwitchInEjectPack(ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN)) + if (TrySwitchInEjectPack(FIRST_TURN)) return; break; case FIRST_TURN_EVENTS_END: @@ -3931,7 +3934,7 @@ static void TryDoEventsBeforeFirstTurn(void) gChosenMoveByBattler[i] = MOVE_NONE; } TurnValuesCleanUp(FALSE); - SpecialStatusesClear(); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); AssignUsableGimmicks(); gBattleMainFunc = HandleTurnActionSelectionState; @@ -4083,7 +4086,7 @@ void BattleTurnPassed(void) u8 IsRunningFromBattleImpossible(u32 battler) { - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; u32 i; if (FlagGet(B_FLAG_NO_RUNNING)) @@ -4756,7 +4759,7 @@ void SwapTurnOrder(u8 id1, u8 id2) } // For AI, so it doesn't 'cheat' by knowing player's ability -u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect) +u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum HoldEffect holdEffect) { u32 speed = gBattleMons[battler].speed; @@ -4826,7 +4829,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum ItemHol u32 GetBattlerTotalSpeedStat(u32 battler) { enum Ability ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); } @@ -4884,7 +4887,7 @@ s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) } s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2, - enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) + enum HoldEffect holdEffectBattler1, enum HoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) { u32 strikesFirst = 0; @@ -4951,9 +4954,9 @@ s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenM s32 priority1 = 0, priority2 = 0; enum Ability ability1 = GetBattlerAbility(battler1); u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); + enum HoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); + enum HoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); enum Ability ability2 = GetBattlerAbility(battler2); if (!ignoreChosenMoves) @@ -5180,11 +5183,6 @@ static void TurnValuesCleanUp(bool8 var0) ClearDamageCalcResults(); } -void SpecialStatusesClear(void) -{ - memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); -} - static void PopulateArrayWithBattlers(u8 *battlers) { u32 i; @@ -5292,8 +5290,8 @@ static void TryChangeTurnOrder(void) static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) { enum Ability ability1 = GetBattlerAbility(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); + enum HoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); + enum HoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); enum Ability ability2 = GetBattlerAbility(battler2); // Battler 1 @@ -5303,7 +5301,7 @@ static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickCl // Quick Claw and Custap Berry if (!gProtectStructs[battler1].quickDraw && ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler1]) - || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item)))) + || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, ability1, 4, gBattleMons[battler1].item)))) gProtectStructs[battler1].usedCustapBerry = TRUE; // Battler 2 @@ -5313,7 +5311,7 @@ static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickCl // Quick Claw and Custap Berry if (!gProtectStructs[battler2].quickDraw && ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && quickClawRandom[battler2]) - || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item)))) + || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, ability2, 4, gBattleMons[battler2].item)))) gProtectStructs[battler2].usedCustapBerry = TRUE; } @@ -5885,7 +5883,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState enum BattleMoveEffects moveEffect = GetMoveEffect(move); u32 species, heldItem, type1, type2, type3; enum Ability ability; - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; enum Gimmick gimmick = GetActiveGimmick(battler); if (move == MOVE_STRUGGLE) @@ -6120,7 +6118,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) { u32 moveType; u32 heldItem = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); gBattleStruct->dynamicMoveType = 0; gBattleStruct->battlerState[battler].ateBoost = FALSE; diff --git a/src/battle_message.c b/src/battle_message.c index 591f28f7fc..087c436d91 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -289,10 +289,10 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNRAGEBUILDING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s rage is building!"), [STRINGID_PKMNMOVEWASDISABLED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled!"), [STRINGID_PKMNMOVEISDISABLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} is disabled!\p"), - [STRINGID_PKMNMOVEDISABLEDNOMORE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s move is no longer disabled!"), + [STRINGID_PKMNMOVEDISABLEDNOMORE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s move is no longer disabled!"), [STRINGID_PKMNGOTENCORE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} must do an encore!"), [STRINGID_PKMNGOTENCOREDMOVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} can only use {B_CURRENT_MOVE}!\p"), - [STRINGID_PKMNENCOREENDED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} ended its encore!"), + [STRINGID_PKMNENCOREENDED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} ended its encore!"), [STRINGID_PKMNTOOKAIM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} took aim at {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNSKETCHEDMOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} sketched {B_BUFF1}!"), [STRINGID_PKMNTRYINGTOTAKEFOE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is hoping to take its attacker down with it!"), @@ -354,7 +354,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNRESTOREDHPUSING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} restored HP using its {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_PKMNCHANGEDTYPEWITH] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} made it the {B_BUFF1} type!"), //not in gen 5+, ability popup [STRINGID_PKMNPREVENTSROMANCEWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents romance!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSCONFUSIONWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} prevents confusion!"), //not in gen 5+, ability popup + [STRINGID_PKMNPREVENTSCONFUSIONWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents confusion!"), //not in gen 5+, ability popup [STRINGID_PKMNRAISEDFIREPOWERWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} raised the power of Fire-type moves!"), //not in gen 5+, ability popup [STRINGID_PKMNANCHORSITSELFWITH] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} anchors itself with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_PKMNCUTSATTACKWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"), //not in gen 5+, ability popup @@ -574,7 +574,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TRANSFERHELDITEM] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} received {B_LAST_ITEM} from {B_ATK_NAME_WITH_PREFIX2}"), [STRINGID_EMBARGOENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can use items again!"), [STRINGID_ELECTROMAGNETISM] = COMPOUND_STRING("electromagnetism"), - [STRINGID_BUFFERENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} wore off!"), + [STRINGID_BUFFERENDS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} wore off!"), [STRINGID_TELEKINESISENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was freed from the telekinesis!"), [STRINGID_TAILWINDENDS] = COMPOUND_STRING("{B_ATK_TEAM1} team's Tailwind petered out!"), [STRINGID_LUCKYCHANTENDS] = COMPOUND_STRING("{B_ATK_TEAM1} team's Lucky Chant wore off!"), @@ -710,9 +710,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNBURNHEALED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s burn was cured!"), [STRINGID_REDCARDACTIVATE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} held up its Red Card against {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_EJECTBUTTONACTIVATE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is switched out with the {B_LAST_ITEM}!"), - [STRINGID_ATKGOTOVERINFATUATION] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} got over its infatuation!"), - [STRINGID_TORMENTEDNOMORE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is no longer tormented!"), - [STRINGID_HEALBLOCKEDNOMORE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is cured of its heal block!"), + [STRINGID_ATKGOTOVERINFATUATION] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} got over its infatuation!"), + [STRINGID_TORMENTEDNOMORE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is no longer tormented!"), + [STRINGID_HEALBLOCKEDNOMORE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is cured of its heal block!"), [STRINGID_ATTACKERBECAMEFULLYCHARGED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became fully charged due to its bond with its trainer!\p"), [STRINGID_ATTACKERBECAMEASHSPECIES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became Ash-Greninja!\p"), [STRINGID_EXTREMELYHARSHSUNLIGHT] = COMPOUND_STRING("The sunlight turned extremely harsh!"), @@ -1292,8 +1292,14 @@ const u16 gSafariPokeblockResultStringIds[] = [B_MSG_MON_IGNORED] = STRINGID_PKMNIGNOREDX }; -const u16 gBerryEffectStringIds[] = +const u16 CureStatusBerryEffectStringID[] = { + [B_MSG_CURED_PARALYSIS] = STRINGID_PKMNSITEMCUREDPARALYSIS, + [B_MSG_CURED_POISON] = STRINGID_PKMNSITEMCUREDPOISON, + [B_MSG_CURED_BURN] = STRINGID_PKMNSITEMHEALEDBURN, + [B_MSG_CURED_FREEEZE] = STRINGID_PKMNSITEMDEFROSTEDIT, + [B_MSG_CURED_FROSTBITE] = STRINGID_PKMNSITEMHEALEDFROSTBITE, + [B_MSG_CURED_SLEEP] = STRINGID_PKMNSITEMWOKEIT, [B_MSG_CURED_PROBLEM] = STRINGID_PKMNSITEMCUREDPROBLEM, [B_MSG_NORMALIZED_STATUS] = STRINGID_PKMNSITEMNORMALIZEDSTATUS }; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d61b9363dd..fedc5cfe73 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_hold_effects.h" #include "battle_message.h" #include "battle_anim.h" #include "battle_ai_main.h" @@ -53,7 +54,6 @@ #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/battle_partner.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/item_effects.h" #include "constants/moves.h" @@ -340,7 +340,7 @@ static bool32 CanAbilityShieldActivateForBattler(u32 battler); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); static void Cmd_printattackstring(void); -static void Cmd_unused0x3(void); +static void Cmd_unused_0x3(void); static void Cmd_critcalc(void); static void Cmd_damagecalc(void); static void Cmd_typecalc(void); @@ -524,7 +524,7 @@ static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); static void Cmd_jumpifnopursuitswitchdmg(void); -static void Cmd_tryrestorehpberry(void); +static void Cmd_tryactivateitem(void); static void Cmd_halvehp(void); static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); @@ -599,7 +599,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_attackcanceler, //0x0 Cmd_accuracycheck, //0x1 Cmd_printattackstring, //0x2 - Cmd_unused0x3, //0x3 + Cmd_unused_0x3, //0x3 Cmd_critcalc, //0x4 Cmd_damagecalc, //0x5 Cmd_typecalc, //0x6 @@ -783,7 +783,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setsafeguard, //0xB8 Cmd_magnitudedamagecalculation, //0xB9 Cmd_jumpifnopursuitswitchdmg, //0xBA - Cmd_tryrestorehpberry, //0xBB + Cmd_tryactivateitem, //0xBB Cmd_halvehp, //0xBC Cmd_copyfoestats, //0xBD Cmd_rapidspinfree, //0xBE @@ -1363,7 +1363,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u enum BattleMoveEffects effect = GetMoveEffect(move); enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); if (move == NO_ACC_CALC_CHECK_LOCK_ON) { @@ -1503,7 +1503,7 @@ static void Cmd_printattackstring(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused0x3(void) +static void Cmd_unused_0x3(void) { } @@ -1525,7 +1525,7 @@ static inline u32 GetCriticalHitOdds(u32 critChance) return sCriticalHitOdds[critChance]; } -static inline u32 IsBattlerLeekAffected(u32 battler, enum ItemHoldEffect holdEffect) +static inline u32 IsBattlerLeekAffected(u32 battler, enum HoldEffect holdEffect) { if (holdEffect == HOLD_EFFECT_LEEK) { @@ -1535,7 +1535,7 @@ static inline u32 IsBattlerLeekAffected(u32 battler, enum ItemHoldEffect holdEff return FALSE; } -static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum ItemHoldEffect holdEffect) +static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum HoldEffect holdEffect) { u32 critStageIncrease = 0; @@ -1560,7 +1560,7 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum ItemHoldEffe return critStageIncrease; } -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk) +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk) { s32 critChance = 0; @@ -1609,7 +1609,7 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA // Threshold = Base Speed / 2 // High crit move = 8 * (Base Speed / 2) // Focus Energy = 4 * (Base Speed / 2) -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk) +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk) { s32 critChance = 0; s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove); @@ -1677,7 +1677,7 @@ static void Cmd_critcalc(void) moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), battlerDef; bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); gPotentialItemEffectBattler = gBattlerAttacker; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -1810,7 +1810,7 @@ static void Cmd_adjustdamage(void) { CMD_ARGS(); - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; u8 param; u32 battlerDef; u32 rand = Random() % 100; @@ -2386,15 +2386,6 @@ static void Cmd_datahpupdate(void) && IsBattlerTurnDamaged(gBattlerTarget)) GetBattlerPartyState(gBattlerTarget)->timesGotHit++; - if (GetMoveEffect(gCurrentMove) == EFFECT_KNOCK_OFF - && !isPassiveHpUpdate - && IsBattlerTurnDamaged(gBattlerTarget) - && gBattleMons[gBattlerTarget].item != ITEM_NONE - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) - && !NoAliveMonsForEitherParty()) - gBattleStruct->battlerState[gBattlerTarget].itemCanBeKnockedOff = TRUE; - if (disguiseActivates) return; } @@ -4454,7 +4445,7 @@ static bool32 BattleTypeAllowsExp(void) static u32 GetMonHoldEffect(struct Pokemon *mon) { - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); if (item == ITEM_ENIGMA_BERRY_E_READER) @@ -4473,7 +4464,7 @@ static void Cmd_getexp(void) { CMD_ARGS(u8 battler); - enum ItemHoldEffect holdEffect; + enum HoldEffect holdEffect; s32 i; // also used as stringId u8 *expMonId = &gBattleStruct->expGetterMonId; u32 currLvl; @@ -5492,7 +5483,7 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) return battler; } -static inline bool32 IsProtectivePadsProtected(u32 battler, enum ItemHoldEffect holdEffect) +static inline bool32 IsProtectivePadsProtected(u32 battler, enum HoldEffect holdEffect) { if (holdEffect != HOLD_EFFECT_PROTECTIVE_PADS) return FALSE; @@ -5658,12 +5649,23 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) switch (moveEffect) { case EFFECT_KNOCK_OFF: - if (gBattleStruct->battlerState[gBattlerTarget].itemCanBeKnockedOff - && gBattleMons[gBattlerTarget].item != ITEM_NONE + if (gBattleMons[gBattlerTarget].item != ITEM_NONE + && IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker)) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) + && CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) + && !NoAliveMonsForEitherParty()) { u32 side = GetBattlerSide(gBattlerTarget); + + if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) + { + gBattlerAbility = gBattlerTarget; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StickyHoldActivatesRet; + effect = TRUE; + break; + } gLastUsedItem = gBattleMons[gBattlerTarget].item; gBattleMons[gBattlerTarget].item = 0; if (gBattleMons[gBattlerTarget].ability != ABILITY_GORILLA_TACTICS) @@ -5681,11 +5683,9 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) gWishFutureKnock.knockedOffMons[side] |= 1u << gBattlerPartyIndexes[gBattlerTarget]; } - gBattleStruct->battlerState[gBattlerTarget].itemCanBeKnockedOff = FALSE; BattleScriptCall(BattleScript_KnockedOff); effect = TRUE; } - gBattleStruct->battlerState[gBattlerTarget].itemCanBeKnockedOff = FALSE; break; case EFFECT_STEAL_ITEM: if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) @@ -6097,10 +6097,24 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_ITEM_EFFECTS_TARGET: - if (ItemBattleEffects(ITEMEFFECT_TARGET, gBattlerTarget)) + { + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + if (ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnTargetHitActivation) + || ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnStatusChangeActivation)) effect = TRUE; gBattleScripting.moveendState++; break; + } + case MOVEEND_ITEM_EFFECTS_ATTACKER_1: + { + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); + if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnAttackerAfterHitActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) + effect = TRUE; + gBattleScripting.moveendState++; + break; + } case MOVEEND_SYMBIOSIS: for (i = 0; i < gBattlersCount; i++) { @@ -6120,12 +6134,6 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_ITEM_EFFECTS_ALL: // item effects for all battlers - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, 0)) - effect = TRUE; - else - gBattleScripting.moveendState++; - break; case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible if (IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) && gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) @@ -6163,12 +6171,6 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_KINGSROCK: // King's rock - // These effects will occur at each hit in a multi-strike move - if (ItemBattleEffects(ITEMEFFECT_KINGSROCK, 0)) - effect = TRUE; - gBattleScripting.moveendState++; - break; case MOVEEND_SUBSTITUTE: for (i = 0; i < gBattlersCount; i++) { @@ -6392,6 +6394,12 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; } + case MOVEEND_HP_THRESHHOLD_ITEMS_TARGET: + if (gMultiHitCounter + && ItemBattleEffects(gBattlerTarget, gBattlerAttacker, GetBattlerHoldEffect(gBattlerTarget), IsOnHpThresholdActivation)) + effect = TRUE; + gBattleScripting.moveendState++; + break; case MOVEEND_MULTIHIT_MOVE: { if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) @@ -6456,31 +6464,15 @@ static void Cmd_moveend(void) effect = HandleMoveEndMoveBlock(moveEffect); gBattleScripting.moveendState++; break; - case MOVEEND_ITEM_EFFECTS_ATTACKER: - // ITEMEFFECT_MOVE_END loops over all battlers, not just attacker. - // It will executre only the first mon with an applicable item. - // So presumably it is a bug - if (ItemBattleEffects(ITEMEFFECT_MOVE_END, gBattlerAttacker)) + case MOVEEND_ITEM_EFFECTS_ATTACKER_2: + { + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); + if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) effect = TRUE; gBattleScripting.moveendState++; break; - case MOVEEND_ITEM_THROAT_SPRAY: - if (IsSoundMove(gCurrentMove) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_THROAT_SPRAY - && IsBattlerAlive(gBattlerAttacker) - && IsAnyTargetAffected(gBattlerAttacker) - && CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN) - && !NoAliveMonsForEitherParty()) // Don't activate if battle will end - { - gLastUsedItem = gBattleMons[gBattlerAttacker].item; - gBattleScripting.battler = gBattlerAttacker; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - effect = TRUE; - BattleScriptCall(BattleScript_AttackerItemStatRaise); - } - gBattleScripting.moveendState++; - break; + } case MOVEEND_ABILITY_BLOCK: effect = HandleMoveEndAbilityBlock(gBattlerAttacker, gBattlerTarget, gCurrentMove); gBattleScripting.moveendState++; @@ -6503,6 +6495,19 @@ static void Cmd_moveend(void) gBattleStruct->moveEndBattlerId = 0; gBattleScripting.moveendState++; break; + case MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET: + while (gBattleStruct->moveEndBattlerId < gBattlersCount) + { + u32 battlerDef = gBattleStruct->moveEndBattlerId++; + if (battlerDef == gBattlerAttacker) + continue; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battlerDef); + if (ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsKeeMarangaBerryActivation) + || ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsOnHpThresholdActivation)) + return; + } + gBattleScripting.moveendState++; + break; case MOVEEND_RED_CARD: { u32 redCardBattlers = 0, i; @@ -6550,7 +6555,7 @@ static void Cmd_moveend(void) } } if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; else gBattleScripting.moveendState++; break; @@ -6599,12 +6604,12 @@ static void Cmd_moveend(void) } } if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; else gBattleScripting.moveendState++; break; - case MOVEEND_LIFEORB_SHELLBELL: - if (ItemBattleEffects(ITEMEFFECT_LIFEORB_SHELLBELL, 0)) + case MOVEEND_LIFE_ORB_SHELL_BELL: + if (ItemBattleEffects(gBattlerAttacker, 0, GetBattlerHoldEffect(gBattlerAttacker), IsLifeOrbShellBellActivation)) effect = TRUE; gBattleScripting.moveendState++; break; @@ -6664,10 +6669,22 @@ static void Cmd_moveend(void) } } if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; else gBattleScripting.moveendState++; break; + case MOVEEND_HIT_ESCAPE: + if (moveEffect == EFFECT_HIT_ESCAPE + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && !NoAliveMonsForBattlerSide(gBattlerTarget)) + { + effect = TRUE; + BattleScriptCall(BattleScript_EffectHitEscape); + } + gBattleScripting.moveendState++; + break; case MOVEEND_EJECT_PACK: { // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. @@ -6703,10 +6720,6 @@ static void Cmd_moveend(void) if (!(ejectPackBattlers & 1u << battler)) continue; - // Hit escape moves activate before Eject Pack for user - if (moveEffect == EFFECT_HIT_ESCAPE && gBattlerAttacker == battler) - continue; - gBattleScripting.battler = battler; gLastUsedItem = gBattleMons[battler].item; effect = TRUE; @@ -6716,21 +6729,32 @@ static void Cmd_moveend(void) break; // Only the fastest Eject item activates } } - if (effect) - gBattleScripting.moveendState = MOVEEND_OPPORTUNIST; - else - gBattleScripting.moveendState++; + gBattleScripting.moveendState++; break; - case MOVEEND_HIT_ESCAPE: - if (moveEffect == EFFECT_HIT_ESCAPE - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && !NoAliveMonsForBattlerSide(gBattlerTarget)) + + case MOVEEND_ITEMS_EFFECTS_ALL: + while (gBattleStruct->moveEndBattlerId < gBattlersCount) { - effect = TRUE; - BattleScriptCall(BattleScript_EffectHitEscape); + u32 battler = gBattleStruct->moveEndBattlerId++; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (ItemBattleEffects(battler, 0, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(battler, 0, holdEffect, IsOnHpThresholdActivation)) + return; } + gBattleStruct->moveEndBattlerId = 0; + gBattleScripting.moveendState++; + break; + case MOVEEND_WHITE_HERB: + while (gBattleStruct->moveEndBattlerId < gBattlersCount) + { + u32 battler = gBattleStruct->moveEndBattlerId++; + if (!IsBattlerAlive(battler)) + continue; + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbActivation)) + return; + } + gBattleStruct->moveEndBattlerId = 0; gBattleScripting.moveendState++; break; case MOVEEND_OPPORTUNIST: @@ -6751,7 +6775,8 @@ static void Cmd_moveend(void) u32 battler = gBattleStruct->moveEndBattlerId++; if (!IsBattlerAlive(battler)) continue; - if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, battler)) + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbActivation)) return; } gBattleStruct->moveEndBattlerId = 0; @@ -6792,17 +6817,6 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; - case MOVEEND_WHITE_HERB: - for (i = 0; i < gBattlersCount; i++) - { - if (!IsBattlerAlive(i)) - continue; - - if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB, i)) - return; - } - gBattleScripting.moveendState++; - break; case MOVEEND_THIRD_MOVE_BLOCK: // Special case for Steel Roller since it has to check the chosen move if (GetMoveEffect(gChosenMove) == EFFECT_STEEL_ROLLER && IsBattlerTurnDamaged(gBattlerTarget)) @@ -7813,7 +7827,10 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gDisableStructs[battler].truantSwitchInHack = 0; - if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler)) + if (DoSwitchInAbilities(battler)) + return TRUE; + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnSwitchInActivation)) return TRUE; for (i = 0; i < gBattlersCount; i++) @@ -7844,7 +7861,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) for (i = 0; i < gBattlersCount; i++) { - if (ItemBattleEffects(ITEMEFFECT_WHITE_HERB, i)) + if (ItemBattleEffects(i, 0, GetBattlerHoldEffect(i), IsWhiteHerbActivation)) return TRUE; } for (i = 0; i < gBattlersCount; i++) @@ -7854,7 +7871,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) } for (i = 0; i < gBattlersCount; i++) { - if (ItemBattleEffects(ITEMEFFECT_MIRROR_HERB, i)) + if (ItemBattleEffects(i, 0, GetBattlerHoldEffect(i), IsMirrorHerbActivation)) return TRUE; } @@ -7866,6 +7883,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) gBattleStruct->hpOnSwitchout[GetBattlerSide(i)] = gBattleMons[i].hp; } + gSpecialStatuses[battler].switchInItemDone = FALSE; gDisableStructs[battler].hazardsDone = FALSE; gBattleStruct->battlerState[battler].forcedSwitch = FALSE; return FALSE; @@ -7918,7 +7936,7 @@ static void Cmd_switchineffects(void) return; } } - if (TrySwitchInEjectPack(ITEMEFFECT_NONE)) + if (TrySwitchInEjectPack(OTHER)) return; // All battlers done, end for (i = 0; i < gBattlersCount; i++) @@ -7930,7 +7948,7 @@ static void Cmd_switchineffects(void) break; default: UpdateSentMonFlags(battler); - if (!DoSwitchInEffectsForBattler(battler) && !TrySwitchInEjectPack(ITEMEFFECT_NONE)) + if (!DoSwitchInEffectsForBattler(battler) && !TrySwitchInEjectPack(OTHER)) gBattlescriptCurrInstr = cmd->nextInstr; break; } @@ -9767,7 +9785,7 @@ static void Cmd_trysetrest(void) gBattlerTarget = gBattlerAttacker; gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); enum Ability ability = GetBattlerAbility(gBattlerTarget); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { @@ -10095,7 +10113,7 @@ static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 st static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr) { u32 index, battlerAbility; - enum ItemHoldEffect battlerHoldEffect; + enum HoldEffect battlerHoldEffect; battlerAbility = GetBattlerAbility(battler); battlerHoldEffect = GetBattlerHoldEffect(battler); gSpecialStatuses[battler].changedStatsBattlerId = gBattlerAttacker; @@ -10796,7 +10814,7 @@ static void Cmd_tryKO(void) CMD_ARGS(const u8 *failInstr); enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); enum Ability targetAbility = GetBattlerAbility(gBattlerTarget); u32 rand = Random() % 100; u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); @@ -12099,12 +12117,28 @@ static void Cmd_jumpifnopursuitswitchdmg(void) } } -static void Cmd_tryrestorehpberry(void) +static void Cmd_tryactivateitem(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 battler, u8 flag); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (TryRestoreHPBerries(battler, ITEMEFFECT_TRY_HEALING)) - return; + + switch (cmd->flag) + { + case ON_ITEM_USABLE_AGAIN: + case ON_ITEM_PICK_UP: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsActivationForceTriggerItem)) + return; + break; + case ON_BERRY_HARVEST: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsActivationOnBerry)) + return; + break; + case ON_ITEM_HP_THRESHOLD: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnHpThresholdActivation)) + return; + break; + } + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12584,7 +12618,7 @@ static void Cmd_trysethelpinghand(void) } } -// Trick +// Trick // TODO: Sticky Hold static void Cmd_tryswapitems(void) { CMD_ARGS(const u8 *failInstr); @@ -12804,7 +12838,7 @@ static void Cmd_setyawn(void) { CMD_ARGS(const u8 *failInstr); enum Ability ability = GetBattlerAbility(gBattlerTarget); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (gBattleMons[gBattlerTarget].volatiles.yawn || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) @@ -14734,7 +14768,7 @@ u8 GetFirstFaintedPartyIndex(u8 battler) void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler) { - enum ItemHoldEffect holdEffect = GetMonHoldEffect(&gPlayerParty[expGetterMonId]); + enum HoldEffect holdEffect = GetMonHoldEffect(&gPlayerParty[expGetterMonId]); if (IsTradedMon(&gPlayerParty[expGetterMonId])) *expAmount = (*expAmount * 150) / 100; @@ -15025,7 +15059,7 @@ void BS_SetTerrain(void) default: break; } - enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker); + enum HoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker); gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; @@ -15992,6 +16026,13 @@ void BS_ClearMoveResultFlags(void) gBattlescriptCurrInstr = cmd->nextInstr; } +void BS_ClearSpecialStatuses(void) +{ + NATIVE_ARGS(); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); + gBattlescriptCurrInstr = cmd->nextInstr; +} + void BS_JumpIfMoveResultFlags(void) { NATIVE_ARGS(u16 value, const u8 *jumpInstr); @@ -16337,7 +16378,7 @@ void BS_TryBoosterEnergy(void) && !(ability == ABILITY_QUARK_DRIVE && cmd->onFieldStatus != ON_WEATHER)) continue; - if (TryBoosterEnergy(battlerByTurnOrder, ability, ITEMEFFECT_NONE)) + if (TryBoosterEnergy(battlerByTurnOrder, ability, IsOnEffectActivation)) return; } @@ -17514,8 +17555,14 @@ void BS_GetTotemBoost(void) void BS_ActivateItemEffects(void) { NATIVE_ARGS(); - if (ItemBattleEffects(ITEMEFFECT_TRY_HEALING, gBattlerTarget)) - return; + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (!IsBattlerAlive(battler)) + continue; + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsActivationForceTriggerItem)) + return; + } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17523,37 +17570,33 @@ void BS_TryRoomService(void) { NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) - { - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (holdEffect == HOLD_EFFECT_ROOM_SERVICE && ItemBattleEffects(battler, 0, holdEffect, IsOnEffectActivation)) + return; + gBattlescriptCurrInstr = cmd->failInstr; } void BS_TryTerrainSeed(void) { NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_SEEDS) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_TERRAIN_SEED) { enum ItemEffect effect = ITEM_NO_EFFECT; u16 item = gBattleMons[battler].item; switch (GetBattlerHoldEffectParam(battler)) { case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); + effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, item, IsOnEffectActivation); break; case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, ITEMEFFECT_NONE); + effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, item, IsOnEffectActivation); break; case HOLD_EFFECT_PARAM_MISTY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); + effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, item, IsOnEffectActivation); break; case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, ITEMEFFECT_NONE); + effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, item, IsOnEffectActivation); break; } @@ -17793,23 +17836,29 @@ void BS_JumpIfNotRototillerAffected(void) } } +// TODO: There might be a way to do it without a flag void BS_ConsumeBerry(void) { NATIVE_ARGS(u8 battler, bool8 fromBattler); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gBattleScripting.overrideBerryRequirements == 2) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } if (cmd->fromBattler) gLastUsedItem = gBattleMons[battler].item; - GetBattlerPartyState(battler)->ateBerry = TRUE; - gBattleScripting.battler = gEffectBattler = gBattlerTarget = battler; // Cover all berry effect battler cases. e.g. ChangeStatBuffs uses target ID - if (ItemBattleEffects(ITEMEFFECT_USE_LAST_ITEM, battler)) + if (GetItemPocket(gLastUsedItem) != POCKET_BERRIES || gBattleScripting.overrideBerryRequirements == 2) + { + gBattleScripting.overrideBerryRequirements = 0; + gBattlescriptCurrInstr = cmd->nextInstr; return; + } + + gBattleScripting.overrideBerryRequirements = 1; + GetBattlerPartyState(battler)->ateBerry = TRUE; + if (ItemBattleEffects(battler, 0, GetItemHoldEffect(gLastUsedItem), IsActivationOnBerry)) + { + gBattleScripting.overrideBerryRequirements = 2; + return; + } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17934,6 +17983,8 @@ void BS_CureCertainStatuses(void) gDisableStructs[gBattlerTarget].disabledMove = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; } + + gBattleScripting.battler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 05b27a48ff..0c552953b8 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -14,7 +14,6 @@ #include "sprite.h" #include "util.h" #include "constants/abilities.h" -#include "constants/hold_effects.h" #include "constants/rgb.h" // Sets flags and variables upon a battler's Terastallization. @@ -62,7 +61,7 @@ void ApplyBattlerVisualsForTeraAnim(u32 battler) // Returns whether a battler can Terastallize. bool32 CanTerastallize(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); if (gBattleMons[battler].volatiles.transformed && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) return FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 7ca5e86b50..b95fdd3a28 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10,6 +10,7 @@ #include "battle_setup.h" #include "battle_z_move.h" #include "battle_gimmick.h" +#include "battle_hold_effects.h" #include "generational_changes.h" #include "party_menu.h" #include "pokemon.h" @@ -43,7 +44,6 @@ #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/battle_string_ids.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/item_effects.h" #include "constants/moves.h" @@ -64,8 +64,6 @@ static bool32 TryRemoveScreens(u32 battler); static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler); static u32 GetFlingPowerFromItemId(u32 itemId); static void SetRandomMultiHitCounter(); -static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item); -static bool32 CanBeInfinitelyConfused(u32 battler); static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option); static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option); @@ -302,6 +300,45 @@ static inline bool32 IsDragonDartsSecondHit(u32 effect) return FALSE; } +bool32 IsUnnerveBlocked(u32 battler, u32 itemId) +{ + if (GetItemPocket(itemId) != POCKET_BERRIES) + return FALSE; + + if (gBattleScripting.overrideBerryRequirements > 0) // Berries that aren't eaten naturally ignore unnerve + return FALSE; + + if (IsUnnerveAbilityOnOpposingSide(battler)) + return TRUE; + + return FALSE; +} + +static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler) +{ + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) + continue; + + if (!IsBattlerAlive(battlerDef)) + continue; + + enum Ability ability = GetBattlerAbility(battlerDef); + switch (ability) + { + case ABILITY_UNNERVE: + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_AS_ONE_SHADOW_RIDER: + return TRUE; + default: + break; + } + } + + return FALSE; +} + bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) { enum Ability ability = GetBattlerAbility(battlerAtk); @@ -891,7 +928,7 @@ void HandleAction_ActionFinished(void) gBattleStruct->monToSwitchIntoId[gBattlerByTurnOrder[gCurrentTurnActionNumber]] = gSelectedMonPartyId = PARTY_SIZE; gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; - SpecialStatusesClear(); + memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED @@ -1336,7 +1373,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 limitations = 0; u8 moveId = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; u32 move = gBattleMons[battler].moves[moveId]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -1598,7 +1635,7 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) { u32 move; enum BattleMoveEffects moveEffect; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; s32 i; @@ -2325,7 +2362,7 @@ static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) { u16 *choicedMoveAtk = &gBattleStruct->choicedMove[ctx->battlerAtk]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk); + enum HoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk); if (gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) @@ -3291,7 +3328,7 @@ bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) #define ANIM_STAT_SPEED 5 #define ANIM_STAT_ACC 6 #define ANIM_STAT_EVASION 7 -static void ChooseStatBoostAnimation(u32 battler) +void ChooseStatBoostAnimation(u32 battler) { u32 stat; bool32 statBuffMoreThan1 = FALSE; @@ -3820,6 +3857,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec } break; case ABILITYEFFECT_ON_SWITCHIN: + if (gHoldEffectsInfo[HOLD_EFFECT_MIRROR_HERB].onSwitchIn) + break; gBattleScripting.battler = battler; switch (gLastUsedAbility) { @@ -4777,16 +4816,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec case ABILITYEFFECT_MOVE_END: // Think contact abilities. switch (gLastUsedAbility) { - case ABILITY_STICKY_HOLD: - if (gBattleStruct->battlerState[gBattlerTarget].itemCanBeKnockedOff && IsBattlerAlive(gBattlerTarget)) - { - gBattleStruct->battlerState[gBattlerTarget].itemCanBeKnockedOff = FALSE; - gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; - effect++; - } - break; case ABILITY_JUSTIFIED: if (IsBattlerTurnDamaged(battler) && IsBattlerAlive(battler) @@ -5774,7 +5803,7 @@ void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) gBattleMainFunc = RunBattleScriptCommands; } -bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, u32 terrainFlag) +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 terrainFlag) { if (!(gFieldStatuses & terrainFlag)) return FALSE; @@ -6092,21 +6121,16 @@ bool32 CanBeConfused(u32 battler) } // second argument is 1/X of current hp compared to max hp -bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId) +bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, u32 itemId) { - bool32 isBerry = (GetItemPocket(itemId) == POCKET_BERRIES); - if (!IsBattlerAlive(battler)) return FALSE; if (gBattleScripting.overrideBerryRequirements) return TRUE; - // Unnerve prevents consumption of opponents' berries. - if (isBerry && IsUnnerveAbilityOnOpposingSide(battler)) - return FALSE; if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / hpFraction) return TRUE; - if (hpFraction <= 4 && isBerry + if (hpFraction <= 4 && GetItemPocket(itemId) == POCKET_BERRIES && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2 && IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_GLUTTONY)) return TRUE; @@ -6114,1454 +6138,6 @@ bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId) return FALSE; } -static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, enum ItemCaseId caseID) -{ - if (HasEnoughHpToEatBerry(battler, (B_CONFUSE_BERRIES_HEAL >= GEN_7 ? 4 : 2), itemId) - && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) - { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); - - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / GetBattlerItemHoldEffectParam(battler, itemId); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - { - gBattleStruct->moveDamage[battler] *= 2; - gBattlerAbility = battler; - } - gBattleScripting.battler = battler; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - } - else - { - if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) - BattleScriptCall(BattleScript_BerryConfuseHealRet); - else - BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); - } - - return ITEM_HP_CHANGE; - } - return ITEM_NO_EFFECT; -} - -static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum ItemCaseId caseID) -{ - if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId)) - { - gEffectBattler = gBattleScripting.battler = battler; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - SET_STATCHANGER(statId, 2, FALSE); - else - SET_STATCHANGER(statId, 1, FALSE); - - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; - gBattleScripting.animArg2 = 0; - - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - else - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; -} - -static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCaseId caseID) -{ - s32 stat; - - for (stat = STAT_ATK; stat < NUM_STATS; stat++) - { - if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) - break; - } - if (stat != NUM_STATS && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId)) - { - enum Ability battlerAbility = GetBattlerAbility(battler); - u32 savedAttacker = gBattlerAttacker; - // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker - gBattlerAttacker = gBattleScripting.battler = battler; - gBattleScripting.statChanger = 0; - if (battlerAbility != ABILITY_CONTRARY) - stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); - else - stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantLowerStat); - gBattlerAttacker = savedAttacker; - - PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); - gEffectBattler = battler; - if (battlerAbility == ABILITY_RIPEN) - SET_STATCHANGER(stat, 4, FALSE); - else - SET_STATCHANGER(stat, 2, FALSE); - - gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + stat; - gBattleScripting.animArg2 = 0; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - else - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; -} - -static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, enum ItemCaseId caseID) -{ - if (HasEnoughHpToEatBerry(battler, 4, itemId)) - { - gBattleStruct->battlerState[battler].usedMicleBerry = TRUE; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - { - BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); - } - else - { - BattleScriptCall(BattleScript_MicleBerryActivateRet); - } - return ITEM_EFFECT_OTHER; - } - return ITEM_NO_EFFECT; -} - -static enum ItemEffect TrySetEnigmaBerry(u32 battler) -{ - if (IsBattlerAlive(battler) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && ((IsBattlerTurnDamaged(battler) && gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) - && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) - && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = (gBattleMons[battler].maxHP * 25 / 100) * -1; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[battler] *= 2; - - BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); - return ITEM_HP_CHANGE; - } - return ITEM_NO_EFFECT; -} - -static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, enum DamageCategory category) -{ - if (IsBattlerAlive(battler) - && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) - && (gBattleScripting.overrideBerryRequirements - || (!DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && GetBattleMoveCategory(gCurrentMove) == category - && battler != gBattlerAttacker - && IsBattlerTurnDamaged(battler))) - ) - { - gEffectBattler = battler; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - SET_STATCHANGER(statId, 2, FALSE); - else - SET_STATCHANGER(statId, 1, FALSE); - - gBattleScripting.battler = battler; - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; - gBattleScripting.animArg2 = 0; - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; -} - -enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, enum ItemCaseId caseID) -{ - if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - gLastUsedItem = itemId; // For surge abilities - gEffectBattler = gBattleScripting.battler = battler; - SET_STATCHANGER(statId, 1, FALSE); - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; - gBattleScripting.animArg2 = 0; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - else - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); - return ITEM_STATS_CHANGE; - } - return ITEM_NO_EFFECT; -} - -static enum ItemEffect ConsumeBerserkGene(u32 battler, enum ItemCaseId caseID) -{ - if (CanBeInfinitelyConfused(battler)) - gBattleMons[battler].volatiles.infiniteConfusion = TRUE; - - gBattlerAttacker = gEffectBattler = battler; - SET_STATCHANGER(STAT_ATK, 2, FALSE); - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; - gBattleScripting.animArg2 = 0; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - BattleScriptExecute(BattleScript_BerserkGeneRetEnd2); - else - BattleScriptCall(BattleScript_BerserkGeneRet); - return ITEM_STATS_CHANGE; -} - -static u32 ItemRestorePp(u32 battler, u32 itemId, enum ItemCaseId caseID) -{ - struct Pokemon *mon = GetBattlerMon(battler); - u32 i, changedPP = 0; - - for (i = 0; i < MAX_MON_MOVES; i++) - { - u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); - u32 currentPP = GetMonData(mon, MON_DATA_PP1 + i); - u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); - u32 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (move && (currentPP == 0 || (gBattleScripting.overrideBerryRequirements && currentPP != maxPP))) - { - u32 ppRestored = GetBattlerItemHoldEffectParam(battler, itemId); - - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - { - ppRestored *= 2; - gBattlerAbility = battler; - } - if (currentPP + ppRestored > maxPP) - changedPP = maxPP; - else - changedPP = currentPP + ppRestored; - - PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); - - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - BattleScriptExecute(BattleScript_BerryPPHealEnd2); - else - BattleScriptCall(BattleScript_BerryPPHealRet); - - gBattleScripting.battler = battler; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); - MarkBattlerForControllerExec(battler); - if (MOVE_IS_PERMANENT(battler, i)) - gBattleMons[battler].pp[i] = changedPP; - return ITEM_PP_CHANGE; - } - } - return 0; -} - -static u32 ItemHealHp(u32 battler, u32 itemId, enum ItemCaseId caseID, bool32 percentHeal) -{ - if (!(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) - && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock) - && HasEnoughHpToEatBerry(battler, 2, itemId)) - { - if (percentHeal) - gBattleStruct->moveDamage[battler] = (GetNonDynamaxMaxHP(battler) * GetBattlerItemHoldEffectParam(battler, itemId) / 100) * -1; - else - gBattleStruct->moveDamage[battler] = GetBattlerItemHoldEffectParam(battler, itemId) * -1; - - // check ripen - if (GetItemPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[battler] *= 2; - - gBattlerAbility = battler; // in SWSH, berry juice shows ability pop up but has no effect. This is mimicked here - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - else - BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); - - return ITEM_HP_CHANGE; - } - return 0; -} - -static bool32 UnnerveOn(u32 battler, u32 itemId) -{ - if (gBattleScripting.overrideBerryRequirements > 0) // Berries that aren't eaten naturally ignore unnerve - return FALSE; - - if (GetItemPocket(itemId) == POCKET_BERRIES && IsUnnerveAbilityOnOpposingSide(battler)) - return TRUE; - return FALSE; -} - -static bool32 GetMentalHerbEffect(u32 battler) -{ - bool32 ret = FALSE; - - // Check infatuation - if (gBattleMons[battler].volatiles.infatuation) - { - gBattleMons[battler].volatiles.infatuation = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - ret = TRUE; - } - if (B_MENTAL_HERB >= GEN_5) - { - // Check taunt - if (gDisableStructs[battler].tauntTimer != 0) - { - gDisableStructs[battler].tauntTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); - ret = TRUE; - } - // Check encore - if (gDisableStructs[battler].encoreTimer != 0) - { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED - ret = TRUE; - } - // Check torment - if (gBattleMons[battler].volatiles.torment == TRUE) - { - gBattleMons[battler].volatiles.torment = FALSE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; - ret = TRUE; - } - // Check heal block - if (gBattleMons[battler].volatiles.healBlock) - { - gBattleMons[battler].volatiles.healBlock = FALSE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; - ret = TRUE; - } - // Check disable - if (gDisableStructs[battler].disableTimer != 0) - { - gDisableStructs[battler].disableTimer = 0; - gDisableStructs[battler].disabledMove = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; - ret = TRUE; - } - } - return ret; -} - -static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID) -{ - u32 effect = 0; - - if (gProtectStructs[battler].eatMirrorHerb) - { - gLastUsedItem = gBattleMons[battler].item; - gBattleScripting.battler = battler; - gProtectStructs[battler].eatMirrorHerb = 0; - ChooseStatBoostAnimation(battler); - if (caseID == ITEMEFFECT_MIRROR_HERB_FIRST_TURN) - BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); - else - BattleScriptCall(BattleScript_MirrorHerbCopyStatChange); - effect = ITEM_STATS_CHANGE; - } - return effect; -} - -u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID) -{ - if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].volatiles.transformed) - return ITEM_NO_EFFECT; - - if (((ability == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) - || ((ability == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) - { - PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); - gBattlerAbility = gBattleScripting.battler = battler; - gDisableStructs[battler].boosterEnergyActivated = TRUE; - gLastUsedItem = ITEM_BOOSTER_ENERGY; - RecordAbilityBattle(battler, ability); - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) - BattleScriptExecute(BattleScript_BoosterEnergyEnd2); - else - BattleScriptCall(BattleScript_BoosterEnergyRet); - return ITEM_EFFECT_OTHER; - } - - return ITEM_NO_EFFECT; -} - -static u32 RestoreWhiteHerbStats(u32 battler, enum ItemCaseId caseID) -{ - u32 i, effect = 0; - - for (i = 0; i < NUM_BATTLE_STATS; i++) - { - if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) - { - gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; - effect = ITEM_STATS_CHANGE; - } - } - if (effect != 0) - { - gLastUsedItem = gBattleMons[battler].item; - gBattleScripting.battler = battler; - gPotentialItemEffectBattler = battler; - if (caseID == ITEMEFFECT_WHITE_HERB) - BattleScriptCall(BattleScript_WhiteHerbRet); - else - BattleScriptExecute(BattleScript_WhiteHerbEnd2); -} - - return effect; -} - -static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) -{ - u8 effect = 0; - - switch (holdEffect) - { - case HOLD_EFFECT_MICLE_BERRY: - if (B_HP_BERRIES >= GEN_4) - effect = TrySetMicleBerry(battler, gLastUsedItem, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_RESTORE_HP: - if (B_HP_BERRIES >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, ITEMEFFECT_NONE, FALSE); - break; - case HOLD_EFFECT_RESTORE_PCT_HP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, ITEMEFFECT_NONE, TRUE); - break; - case HOLD_EFFECT_RESTORE_PP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemRestorePp(battler, gLastUsedItem, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_SPICY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_DRY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_SWEET: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_BITTER: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CONFUSE_SOUR: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_SPEED_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_SP_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move - effect = TrySetEnigmaBerry(battler); - break; - case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move - effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, DAMAGE_CATEGORY_PHYSICAL); - break; - case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move - effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, DAMAGE_CATEGORY_SPECIAL); - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = RandomStatRaiseBerry(battler, gLastUsedItem, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; - BattleScriptCall(BattleScript_BerryCureParRet); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptCall(BattleScript_BerryCurePsnRet); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[battler].status1 & STATUS1_BURN && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_BURN; - BattleScriptCall(BattleScript_BerryCureBrnRet); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battler].status1 & STATUS1_FREEZE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FREEZE; - BattleScriptCall(BattleScript_BerryCureFrzRet); - effect = ITEM_STATUS_CHANGE; - } - if (gBattleMons[battler].status1 & STATUS1_FROSTBITE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; - BattleScriptCall(BattleScript_BerryCureFrbRet); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battler].status1 & STATUS1_SLEEP && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].volatiles.nightmare = FALSE; - BattleScriptCall(BattleScript_BerryCureSlpRet); - effect = ITEM_STATUS_CHANGE; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battler].volatiles.confusionTurns > 0 && !UnnerveOn(battler, gLastUsedItem)) - { - RemoveConfusionStatus(battler); - BattleScriptCall(BattleScript_BerryCureConfusionRet); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_MENTAL_HERB: - if (GetMentalHerbEffect(battler)) - { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - BattleScriptCall(BattleScript_MentalHerbCureRet); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_STATUS: - if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].volatiles.confusionTurns > 0) && !UnnerveOn(battler, gLastUsedItem)) - { - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - { - gBattleMons[battler].volatiles.nightmare = FALSE; - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - - if (gBattleMons[battler].status1 & STATUS1_BURN) - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - - if (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE) - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - - if (gBattleMons[battler].volatiles.confusionTurns > 0) - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - - gBattleMons[battler].status1 = 0; - RemoveConfusionStatus(battler); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; - BattleScriptCall(BattleScript_BerryCureChosenStatusRet); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CRITICAL_UP: // lansat berry - if (B_BERRIES_INSTANT >= GEN_4 - && !(gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) - && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) - { - gBattleMons[battler].volatiles.focusEnergy = TRUE; - gBattleScripting.battler = battler; - gPotentialItemEffectBattler = battler; - BattleScriptCall(BattleScript_BerryFocusEnergyRet); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_BERSERK_GENE: - effect = ConsumeBerserkGene(battler, ITEMEFFECT_NONE); - break; - case HOLD_EFFECT_THROAT_SPRAY: - if (IsSoundMove(gCurrentMove) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsBattlerAlive(gBattlerAttacker) - && IsAnyTargetAffected(gBattlerAttacker) - && CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN) - && !NoAliveMonsForEitherParty()) // Don't activate if battle will end - { - gLastUsedItem = gBattleMons[gBattlerAttacker].item; - gBattleScripting.battler = gBattlerAttacker; - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - effect = ITEM_STATS_CHANGE; - BattleScriptCall(BattleScript_AttackerItemStatRaise); - } - break; - case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(battler, ITEMEFFECT_NONE); - break; - default: - break; - } - - return effect; -} - -static inline bool32 TryCureStatus(u32 battler, enum ItemCaseId caseId) -{ - u32 effect = ITEM_NO_EFFECT; - u32 string = 0; - - if ((gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].volatiles.confusionTurns > 0) && !UnnerveOn(battler, gLastUsedItem)) - { - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - string++; - } - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - { - gBattleMons[battler].volatiles.nightmare = FALSE; - StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - string++; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - string++; - } - if (gBattleMons[battler].status1 & STATUS1_BURN) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - string++; - } - if (gBattleMons[battler].status1 & STATUS1_FREEZE || gBattleMons[battler].status1 & STATUS1_FROSTBITE) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - string++; - } - if (gBattleMons[battler].volatiles.confusionTurns > 0) - { - StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - string++; - } - if (string <= 1) - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; - else - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; - gBattleMons[battler].status1 = 0; - RemoveConfusionStatus(battler); - if (caseId == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseId == ITEMEFFECT_NORMAL) - BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); - else - BattleScriptCall(BattleScript_BerryCureChosenStatusRet); - effect = ITEM_STATUS_CHANGE; - } - - return effect; -} - -// This is hacky and could potentially be improved because ideally this function wouldn't exist but there is some inconsitency with timings. -static bool32 ShouldWaitWithActivation(u32 battler, enum ItemHoldEffect holdEffect) -{ - if (holdEffect != HOLD_EFFECT_RESTORE_HP - && holdEffect != HOLD_EFFECT_RESTORE_PCT_HP - && holdEffect != HOLD_EFFECT_RESTORE_PP - && holdEffect != HOLD_EFFECT_CONFUSE_SPICY - && holdEffect != HOLD_EFFECT_CONFUSE_DRY - && holdEffect != HOLD_EFFECT_CONFUSE_SWEET - && holdEffect != HOLD_EFFECT_CONFUSE_BITTER - && holdEffect != HOLD_EFFECT_CONFUSE_SOUR) - return FALSE; - - // Restore HP berries can be knocked off - if (gBattleStruct->battlerState[battler].itemCanBeKnockedOff) - return TRUE; - - if (IsBattlerTurnDamaged(battler) - && gMultiHitCounter == 0 // Non multi hit moves don't wait for Berserk / Anger Shell activation - && IsBattlerAlive(battler) - && !TestIfSheerForceAffected(battler, gCurrentMove) - && HadMoreThanHalfHpNowDoesnt(battler)) - { - switch (GetBattlerAbility(battler)) - { - case ABILITY_BERSERK: - return CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN); - case ABILITY_ANGER_SHELL: - return TRUE; - default: - return FALSE; - } - } - - return FALSE; -} - -u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) -{ - u32 moveType = 0; - enum ItemEffect effect = ITEM_NO_EFFECT; - enum ItemHoldEffect battlerHoldEffect = 0, atkHoldEffect = 0; - u32 atkHoldEffectParam = 0; - u32 atkItem = 0; - - if (caseID != ITEMEFFECT_USE_LAST_ITEM) - { - gLastUsedItem = gBattleMons[battler].item; - battlerHoldEffect = GetBattlerHoldEffect(battler); - } - - atkItem = gBattleMons[gBattlerAttacker].item; - atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker); - atkHoldEffectParam = GetBattlerHoldEffectParam(gBattlerAttacker); - - switch (caseID) - { - case ITEMEFFECT_NONE: - break; - case ITEMEFFECT_ON_SWITCH_IN: - case ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN: - if (!gSpecialStatuses[battler].switchInItemDone) - { - switch (battlerHoldEffect) - { - case HOLD_EFFECT_DOUBLE_PRIZE: - if (IsOnPlayerSide(battler) && !gBattleStruct->moneyMultiplierItem) - { - gBattleStruct->moneyMultiplier *= 2; - gBattleStruct->moneyMultiplierItem = 1; - } - break; - case HOLD_EFFECT_CONFUSE_SPICY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); - break; - case HOLD_EFFECT_CONFUSE_DRY: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, caseID); - break; - case HOLD_EFFECT_CONFUSE_SWEET: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, caseID); - break; - case HOLD_EFFECT_CONFUSE_BITTER: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, caseID); - break; - case HOLD_EFFECT_CONFUSE_SOUR: - if (B_BERRIES_INSTANT >= GEN_4) - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, caseID); - break; - case HOLD_EFFECT_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, caseID); - break; - case HOLD_EFFECT_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, caseID); - break; - case HOLD_EFFECT_SPEED_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, caseID); - break; - case HOLD_EFFECT_SP_ATTACK_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, caseID); - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, caseID); - break; - case HOLD_EFFECT_CRITICAL_UP: - if (B_BERRIES_INSTANT >= GEN_4 - && !(gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) - && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) - { - gBattleMons[battler].volatiles.focusEnergy = TRUE; - gBattleScripting.battler = battler; - BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = RandomStatRaiseBerry(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_CURE_PAR: - if (B_BERRIES_INSTANT >= GEN_4 - && gBattleMons[battler].status1 & STATUS1_PARALYSIS - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; - BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_PSN_ANY) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptExecute(BattleScript_BerryCurePsnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_BURN) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_BURN; - BattleScriptExecute(BattleScript_BerryCureBrnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_FREEZE) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FREEZE; - BattleScriptExecute(BattleScript_BerryCureFrzEnd2); - effect = ITEM_STATUS_CHANGE; - } - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_FROSTBITE) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; - BattleScriptExecute(BattleScript_BerryCureFrbEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (B_BERRIES_INSTANT >= GEN_4 - && (gBattleMons[battler].status1 & STATUS1_SLEEP) - && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].volatiles.nightmare = FALSE; - BattleScriptExecute(BattleScript_BerryCureSlpEnd2); - effect = ITEM_STATUS_CHANGE; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - break; - case HOLD_EFFECT_CURE_STATUS: - if (B_BERRIES_INSTANT >= GEN_4) - effect = TryCureStatus(battler, caseID); - break; - case HOLD_EFFECT_RESTORE_HP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, caseID, FALSE); - break; - case HOLD_EFFECT_RESTORE_PCT_HP: - if (B_BERRIES_INSTANT >= GEN_4) - effect = ItemHealHp(battler, gLastUsedItem, caseID, TRUE); - break; - case HOLD_EFFECT_RESTORE_PP: - effect = ItemRestorePp(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_AIR_BALLOON: - effect = ITEM_EFFECT_OTHER; - gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_AirBaloonMsgIn); - RecordItemEffectBattle(battler, HOLD_EFFECT_AIR_BALLOON); - break; - case HOLD_EFFECT_ROOM_SERVICE: - if (TryRoomService(battler)) - { - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - effect = ITEM_STATS_CHANGE; - } - break; - case HOLD_EFFECT_SEEDS: - switch (GetBattlerHoldEffectParam(battler)) - { - case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_PARAM_MISTY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, gLastUsedItem, caseID); - break; - } - break; - case HOLD_EFFECT_BERSERK_GENE: - effect = ConsumeBerserkGene(battler, caseID); - break; - case HOLD_EFFECT_BOOSTER_ENERGY: - effect = TryBoosterEnergy(battler, GetBattlerAbility(battler), caseID); - break; - default: - break; - } - if (effect != 0) - { - gSpecialStatuses[battler].switchInItemDone = TRUE; - gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - } - } - break; - case ITEMEFFECT_LEFTOVERS: - switch (battlerHoldEffect) - { - case HOLD_EFFECT_BLACK_SLUDGE: - if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) - { - goto LEFTOVERS; - } - else if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_ItemHurtEnd2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - } - break; - case HOLD_EFFECT_LEFTOVERS: - LEFTOVERS: - if (gBattleMons[battler].hp < gBattleMons[battler].maxHP - && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) - { - gBattleScripting.battler = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - BattleScriptExecute(BattleScript_ItemHealHP_End2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - } - break; - default: - break; - } - break; - case ITEMEFFECT_NORMAL: - case ITEMEFFECT_TRY_HEALING: - if (IsBattlerAlive(battler)) - { - switch (battlerHoldEffect) - { - case HOLD_EFFECT_RESTORE_HP: - effect = ItemHealHp(battler, gLastUsedItem, caseID, FALSE); - break; - case HOLD_EFFECT_RESTORE_PCT_HP: - effect = ItemHealHp(battler, gLastUsedItem, caseID, TRUE); - break; - case HOLD_EFFECT_RESTORE_PP: - effect = ItemRestorePp(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_CONFUSE_SPICY: - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SPICY, caseID); - break; - case HOLD_EFFECT_CONFUSE_DRY: - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_DRY, caseID); - break; - case HOLD_EFFECT_CONFUSE_SWEET: - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SWEET, caseID); - break; - case HOLD_EFFECT_CONFUSE_BITTER: - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_BITTER, caseID); - break; - case HOLD_EFFECT_CONFUSE_SOUR: - effect = HealConfuseBerry(battler, gLastUsedItem, FLAVOR_SOUR, caseID); - break; - case HOLD_EFFECT_ATTACK_UP: - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_ATK, caseID); - break; - case HOLD_EFFECT_DEFENSE_UP: - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_DEF, caseID); - break; - case HOLD_EFFECT_SPEED_UP: - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPEED, caseID); - break; - case HOLD_EFFECT_SP_ATTACK_UP: - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPATK, caseID); - break; - case HOLD_EFFECT_SP_DEFENSE_UP: - effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, caseID); - break; - case HOLD_EFFECT_CRITICAL_UP: - if (!(gBattleMons[battler].volatiles.dragonCheer || gBattleMons[battler].volatiles.focusEnergy) - && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, gLastUsedItem), gLastUsedItem)) - { - gBattleMons[battler].volatiles.focusEnergy = TRUE; - gBattleScripting.battler = battler; - BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_RANDOM_STAT_UP: - effect = RandomStatRaiseBerry(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; - BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptExecute(BattleScript_BerryCurePsnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_BRN: - if (gBattleMons[battler].status1 & STATUS1_BURN && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_BURN; - BattleScriptExecute(BattleScript_BerryCureBrnEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battler].status1 & STATUS1_FREEZE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FREEZE; - BattleScriptExecute(BattleScript_BerryCureFrzEnd2); - effect = ITEM_STATUS_CHANGE; - } - if (gBattleMons[battler].status1 & STATUS1_FROSTBITE && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_FROSTBITE; - BattleScriptExecute(BattleScript_BerryCureFrbEnd2); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battler].status1 & STATUS1_SLEEP && !UnnerveOn(battler, gLastUsedItem)) - { - gBattleMons[battler].status1 &= ~STATUS1_SLEEP; - gBattleMons[battler].volatiles.nightmare = FALSE; - BattleScriptExecute(BattleScript_BerryCureSlpEnd2); - effect = ITEM_STATUS_CHANGE; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - } - break; - case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battler].volatiles.confusionTurns > 0 && !UnnerveOn(battler, gLastUsedItem)) - { - RemoveConfusionStatus(battler); - BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_CURE_STATUS: - effect = TryCureStatus(battler, caseID); - break; - case HOLD_EFFECT_MENTAL_HERB: - if (GetMentalHerbEffect(battler)) - { - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - BattleScriptExecute(BattleScript_MentalHerbCureEnd2); - effect = ITEM_EFFECT_OTHER; - } - break; - case HOLD_EFFECT_MICLE_BERRY: - effect = TrySetMicleBerry(battler, gLastUsedItem, caseID); - break; - case HOLD_EFFECT_BERSERK_GENE: - effect = ConsumeBerserkGene(battler, caseID); - break; - default: - break; - } - - if (effect != 0) - { - gBattlerAttacker = gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - } - } - break; - case ITEMEFFECT_USE_LAST_ITEM: - effect = ItemEffectMoveEnd(battler, GetItemHoldEffect(gLastUsedItem)); - gBattleScripting.overrideBerryRequirements = 2; // to exit VARIOUS_CONSUME_BERRIES - if (effect) - { - gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - break; - } - break; - case ITEMEFFECT_MOVE_END: - for (battler = 0; battler < gBattlersCount; battler++) - { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); - if (ShouldWaitWithActivation(battler, holdEffect)) - continue; - - gLastUsedItem = gBattleMons[battler].item; - effect = ItemEffectMoveEnd(battler, holdEffect); - if (effect) - { - gPotentialItemEffectBattler = gBattleScripting.battler = battler; - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - break; - } - } - break; - case ITEMEFFECT_KINGSROCK: - // Occur on each hit of a multi-strike move - switch (atkHoldEffect) - { - case HOLD_EFFECT_FLINCH: - { - enum Ability ability = GetBattlerAbility(gBattlerAttacker); - if (B_SERENE_GRACE_BOOST >= GEN_5 && ability == ABILITY_SERENE_GRACE) - atkHoldEffectParam *= 2; - if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) - atkHoldEffectParam *= 2; - if (IsBattlerTurnDamaged(gBattlerTarget) - && !MoveIgnoresKingsRock(gCurrentMove) - && gBattleMons[gBattlerTarget].hp - && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, atkHoldEffectParam) - && ability != ABILITY_STENCH) - { - gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; - BattleScriptPushCursor(); - SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); - BattleScriptPop(); - } - } - break; - case HOLD_EFFECT_BLUNDER_POLICY: - if (gBattleStruct->blunderPolicy - && IsBattlerAlive(gBattlerAttacker) - && CompareStat(gBattlerAttacker, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN)) - { - gBattleStruct->blunderPolicy = FALSE; - gLastUsedItem = atkItem; - SET_STATCHANGER(STAT_SPEED, 2, FALSE); - effect = ITEM_STATS_CHANGE; - BattleScriptCall(BattleScript_AttackerItemStatRaise); - } - break; - default: - break; - } - break; - case ITEMEFFECT_LIFEORB_SHELLBELL: - // Occur after the final hit of a multi-strike move - switch (atkHoldEffect) - { - case HOLD_EFFECT_SHELL_BELL: - if (gBattleScripting.savedDmg > 0 - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && gBattlerAttacker != gBattlerTarget - && !IsBattlerAtMaxHp(gBattlerAttacker) - && IsBattlerAlive(gBattlerAttacker) - && GetMoveEffect(gCurrentMove) != EFFECT_FUTURE_SIGHT - && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT - && (B_HEAL_BLOCKING < GEN_5 || !gBattleMons[battler].volatiles.healBlock)) - { - gLastUsedItem = atkItem; - gPotentialItemEffectBattler = gBattlerAttacker; - gBattleScripting.battler = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerAttacker] = (gBattleScripting.savedDmg / atkHoldEffectParam) * -1; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = -1; - BattleScriptCall(BattleScript_ItemHealHP_Ret); - effect = ITEM_HP_CHANGE; - } - break; - case HOLD_EFFECT_LIFE_ORB: - if (IsBattlerAlive(gBattlerAttacker) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleScripting.savedDmg > 0) - && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD) - && !IsFutureSightAttackerInParty(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 10; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - effect = ITEM_HP_CHANGE; - BattleScriptCall(BattleScript_ItemHurtRet); - gLastUsedItem = atkItem; - } - break; - default: - break; - } - break; - case ITEMEFFECT_TARGET: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - moveType = GetBattleMoveType(gCurrentMove); - switch (battlerHoldEffect) - { - case HOLD_EFFECT_AIR_BALLOON: - if (IsBattlerTurnDamaged(gBattlerTarget)) - { - effect = ITEM_EFFECT_OTHER; - BattleScriptCall(BattleScript_AirBaloonMsgPop); - } - break; - case HOLD_EFFECT_ROCKY_HELMET: - if (IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) - && IsBattlerAlive(gBattlerAttacker) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 6; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - effect = ITEM_HP_CHANGE; - BattleScriptCall(BattleScript_RockyHelmetActivates); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - RecordItemEffectBattle(battler, HOLD_EFFECT_ROCKY_HELMET); - } - break; - case HOLD_EFFECT_WEAKNESS_POLICY: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_SUPER_EFFECTIVE) - { - effect = ITEM_STATS_CHANGE; - BattleScriptCall(BattleScript_WeaknessPolicy); - } - break; - case HOLD_EFFECT_SNOWBALL: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_ICE) - { - effect = ITEM_STATS_CHANGE; - BattleScriptCall(BattleScript_TargetItemStatRaise); - SET_STATCHANGER(STAT_ATK, 1, FALSE); - } - break; - case HOLD_EFFECT_LUMINOUS_MOSS: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_WATER) - { - effect = ITEM_STATS_CHANGE; - BattleScriptCall(BattleScript_TargetItemStatRaise); - SET_STATCHANGER(STAT_SPDEF, 1, FALSE); - } - break; - case HOLD_EFFECT_CELL_BATTERY: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_ELECTRIC) - { - effect = ITEM_STATS_CHANGE; - BattleScriptCall(BattleScript_TargetItemStatRaise); - SET_STATCHANGER(STAT_ATK, 1, FALSE); - } - break; - case HOLD_EFFECT_ABSORB_BULB: - if (IsBattlerAlive(battler) - && IsBattlerTurnDamaged(gBattlerTarget) - && moveType == TYPE_WATER) - { - effect = ITEM_STATS_CHANGE; - BattleScriptCall(BattleScript_TargetItemStatRaise); - SET_STATCHANGER(STAT_SPATK, 1, FALSE); - } - break; - case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move - effect = TrySetEnigmaBerry(battler); - break; - case HOLD_EFFECT_JABOCA_BERRY: // consume and damage attacker if used physical move - if (IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattleMovePhysical(gCurrentMove) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[gBattlerAttacker] *= 2; - - effect = ITEM_HP_CHANGE; - BattleScriptCall(BattleScript_JabocaRowapBerryActivates); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - RecordItemEffectBattle(battler, HOLD_EFFECT_JABOCA_BERRY); - } - break; - case HOLD_EFFECT_ROWAP_BERRY: // consume and damage attacker if used special move - if (IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattleMoveSpecial(gCurrentMove) - && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - if (GetBattlerAbility(battler) == ABILITY_RIPEN) - gBattleStruct->moveDamage[gBattlerAttacker] *= 2; - - effect = ITEM_HP_CHANGE; - BattleScriptCall(BattleScript_JabocaRowapBerryActivates); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - RecordItemEffectBattle(battler, HOLD_EFFECT_ROWAP_BERRY); - } - break; - case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move - effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, DAMAGE_CATEGORY_PHYSICAL); - break; - case HOLD_EFFECT_MARANGA_BERRY: // consume and boost sp. defense if used special move - effect = DamagedStatBoostBerryEffect(battler, STAT_SPDEF, DAMAGE_CATEGORY_SPECIAL); - break; - case HOLD_EFFECT_CURE_STATUS: // only Toxic Chain's interaction with Knock Off - case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battler].status1 & STATUS1_PSN_ANY && !UnnerveOn(battler, gLastUsedItem) && GetBattlerAbility(gBattlerAttacker) == ABILITY_TOXIC_CHAIN && GetMoveEffect(gCurrentMove) == EFFECT_KNOCK_OFF) - { - gBattleScripting.battler = battler; - gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); - BattleScriptExecute(BattleScript_BerryCurePsnEnd2); - BtlController_EmitSetMonData(battler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - effect = ITEM_STATUS_CHANGE; - } - break; - case HOLD_EFFECT_STICKY_BARB: - if (IsBattlerTurnDamaged(gBattlerTarget) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattlerAlive(gBattlerAttacker) - && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - && gBattleMons[gBattlerAttacker].item == ITEM_NONE) - { - // No sticky hold checks. - gEffectBattler = battler; // gEffectBattler = target - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker takes target's barb - BattleScriptCall(BattleScript_StickyBarbTransfer); - effect = ITEM_EFFECT_OTHER; - } - break; - default: - break; - } - } - break; - case ITEMEFFECT_ORBS: - { - enum Ability battlerAbility = GetBattlerAbility(battler); - switch (battlerHoldEffect) - { - case HOLD_EFFECT_TOXIC_ORB: - if (CanBePoisoned(battler, battler, battlerAbility, battlerAbility)) // Can corrosion trigger toxic orb on itself? - { - effect = ITEM_STATUS_CHANGE; - gBattleMons[battler].status1 = STATUS1_TOXIC_POISON; - BattleScriptExecute(BattleScript_ToxicOrb); - RecordItemEffectBattle(battler, battlerHoldEffect); - } - break; - case HOLD_EFFECT_FLAME_ORB: - if (CanBeBurned(battler, battler, battlerAbility)) - { - effect = ITEM_STATUS_CHANGE; - gBattleMons[battler].status1 = STATUS1_BURN; - BattleScriptExecute(BattleScript_FlameOrb); - RecordItemEffectBattle(battler, battlerHoldEffect); - } - break; - case HOLD_EFFECT_STICKY_BARB: // Not an orb per se, but similar effect, and needs to NOT activate with pickpocket - if (battlerAbility != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - BattleScriptExecute(BattleScript_ItemHurtEnd2); - effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battler, battlerHoldEffect); - PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - } - break; - default: - break; - } - - if (effect == ITEM_STATUS_CHANGE) - { - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - } - break; - case ITEMEFFECT_WHITE_HERB: - case ITEMEFFECT_WHITE_HERB_ENDTURN: - case ITEMEFFECT_WHITE_HERB_FIRST_TURN: - if (battlerHoldEffect == HOLD_EFFECT_WHITE_HERB) - effect = RestoreWhiteHerbStats(battler, caseID); - break; - case ITEMEFFECT_MIRROR_HERB: - case ITEMEFFECT_MIRROR_HERB_FIRST_TURN: - if (battlerHoldEffect == HOLD_EFFECT_MIRROR_HERB) - effect = TryConsumeMirrorHerb(battler, caseID); - break; - } - - // Berry was successfully used on a Pokemon. - if (effect && (gLastUsedItem >= FIRST_BERRY_INDEX && gLastUsedItem <= LAST_BERRY_INDEX)) - GetBattlerPartyState(battler)->ateBerry = TRUE; - - return effect; -} - void ClearVariousBattlerFlags(u32 battler) { gDisableStructs[battler].furyCutterCounter = 0; @@ -7793,17 +6369,17 @@ u8 GetAttackerObedienceForAction() } } -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler) +enum HoldEffect GetBattlerHoldEffect(u32 battler) { return GetBattlerHoldEffectInternal(battler, GetBattlerAbility(battler)); } -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler) +enum HoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler) { return GetBattlerHoldEffectInternal(battler, ABILITY_NONE); } -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability) +enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability) { if (gBattleMons[battler].volatiles.embargo) return HOLD_EFFECT_NONE; @@ -7820,7 +6396,7 @@ enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability) return GetItemHoldEffect(gBattleMons[battler].item); } -enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler) +enum HoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler) { gPotentialItemEffectBattler = battler; if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) @@ -7829,14 +6405,6 @@ enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler) return GetItemHoldEffect(gBattleMons[battler].item); } -static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item) -{ - if (item == ITEM_ENIGMA_BERRY_E_READER) - return gEnigmaBerries[battler].holdEffectParam; - else - return GetItemHoldEffectParam(item); -} - u32 GetBattlerHoldEffectParam(u32 battler) { if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) @@ -7845,7 +6413,7 @@ u32 GetBattlerHoldEffectParam(u32 battler) return GetItemHoldEffectParam(gBattleMons[battler].item); } -bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move) +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move) { if (holdEffectAtk == HOLD_EFFECT_PROTECTIVE_PADS) { @@ -7856,7 +6424,7 @@ bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Abilit return !IsMoveMakingContact(battlerAtk, battlerDef, abilityAtk, holdEffectAtk, move); } -bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move) +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move) { if (!(MoveMakesContact(move) || (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM && gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL))) @@ -7974,7 +6542,7 @@ enum IronBallCheck }; // Only called directly when calculating damage type effectiveness, and Iron Ball's type effectiveness mechanics -bool32 IsBattlerGroundedInverseCheck(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, enum InverseBattleCheck checkInverse) +bool32 IsBattlerGroundedInverseCheck(u32 battler, enum Ability ability, enum HoldEffect holdEffect, enum InverseBattleCheck checkInverse) { if (holdEffect == HOLD_EFFECT_IRON_BALL) return TRUE; @@ -7997,7 +6565,7 @@ bool32 IsBattlerGroundedInverseCheck(u32 battler, enum Ability ability, enum Ite return TRUE; } -bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect) +bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum HoldEffect holdEffect) { return IsBattlerGroundedInverseCheck(battler, ability, holdEffect, NOT_INVERSE_BATTLE); } @@ -8019,7 +6587,7 @@ u32 GetBattlerWeight(u32 battler) u32 i; u32 weight = GetSpeciesWeight(gBattleMons[battler].species); enum Ability ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); if (ability == ABILITY_HEAVY_METAL) weight *= 2; @@ -9560,7 +8128,7 @@ static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef return UQ_4_12(1.0); } -static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, enum ItemHoldEffect holdEffectAtk) +static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, enum HoldEffect holdEffectAtk) { u32 metronomeTurns; uq4_12_t metronomeBoostBase; @@ -9591,7 +8159,7 @@ static inline uq4_12_t GetDefenderItemsModifier(struct DamageContext *ctx) switch (ctx->holdEffectDef) { case HOLD_EFFECT_RESIST_BERRY: - if (UnnerveOn(ctx->battlerDef, gBattleMons[ctx->battlerDef].item)) + if (IsUnnerveBlocked(ctx->battlerDef, gBattleMons[ctx->battlerDef].item)) return UQ_4_12(1.0); if (ctx->moveType == GetBattlerHoldEffectParam(ctx->battlerDef) && (ctx->moveType == TYPE_NORMAL || ctx->typeEffectivenessModifier >= UQ_4_12(2.0))) { @@ -10233,7 +8801,7 @@ bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) bool32 CanMegaEvolve(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has a Mega Ring. if (!TESTING @@ -10271,7 +8839,7 @@ bool32 CanMegaEvolve(u32 battler) bool32 CanUltraBurst(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has a Z-Ring if (!TESTING && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT @@ -10559,7 +9127,7 @@ bool32 DoBattlersShareType(u32 battler1, u32 battler2) bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) { u16 species = gBattleMons[battler].species; - enum ItemHoldEffect holdEffect = GetItemHoldEffect(itemId); + enum HoldEffect holdEffect = GetItemHoldEffect(itemId); if (ItemIsMail(itemId)) return FALSE; @@ -10887,31 +9455,6 @@ static bool32 TryRemoveScreens(u32 battler) return removed; } -static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler) -{ - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) - { - if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) - continue; - - if (!IsBattlerAlive(battlerDef)) - continue; - - enum Ability ability = GetBattlerAbility(battlerDef); - switch (ability) - { - case ABILITY_UNNERVE: - case ABILITY_AS_ONE_ICE_RIDER: - case ABILITY_AS_ONE_SHADOW_RIDER: - return TRUE; - default: - break; - } - } - - return FALSE; -} - // Photon Geyser, Light That Burns the Sky, Tera Blast enum DamageCategory GetCategoryBasedOnStats(u32 battler) { @@ -11080,7 +9623,7 @@ void TrySaveExchangedItem(u32 battler, u16 stolenItem) bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) { bool32 ret = TRUE; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { ret = FALSE; @@ -11151,23 +9694,6 @@ bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind) return ret; } -bool32 TryRoomService(u32 battler) -{ - if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && CompareStat(battler, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN)) - { - gEffectBattler = gBattleScripting.battler = battler; - SET_STATCHANGER(STAT_SPEED, 1, TRUE); - gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_SPEED; - gBattleScripting.animArg2 = 0; - gLastUsedItem = gBattleMons[battler].item; - return TRUE; - } - else - { - return FALSE; - } -} - bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget) { if (GetGenConfig(GEN_CONFIG_PRANKSTER_DARK_TYPES) < GEN_7) @@ -11315,16 +9841,6 @@ void RemoveConfusionStatus(u32 battler) gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } -static bool32 CanBeInfinitelyConfused(u32 battler) -{ - enum Ability ability = GetBattlerAbility(battler); - if (ability == ABILITY_OWN_TEMPO - || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) - || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) - return FALSE; - return TRUE; -} - u8 GetBattlerGender(u32 battler) { return GetGenderFromSpeciesAndPersonality(gBattleMons[battler].species, @@ -11760,19 +10276,6 @@ bool32 HasWeatherEffect(void) return TRUE; } -bool32 IsAnyTargetAffected(u32 battlerAtk) -{ - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) - { - if (battlerAtk == battlerDef) - continue; - - if (!(gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT)) - return TRUE; - } - return FALSE; -} - void UpdateStallMons(void) { if (IsBattlerTurnDamaged(gBattlerTarget) || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) || gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) @@ -11798,18 +10301,7 @@ void UpdateStallMons(void) // Handling for moves that target multiple opponents in doubles not handled currently } -bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) -{ - if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES - || GetBattlerHoldEffect(battler) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice - { - if (ItemBattleEffects(caseId, battler)) - return TRUE; - } - return FALSE; -} - -bool32 TrySwitchInEjectPack(enum ItemCaseId caseID) +bool32 TrySwitchInEjectPack(enum EjectPackTiming timing) { // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. u32 ejectPackBattlers = 0; @@ -11846,9 +10338,9 @@ bool32 TrySwitchInEjectPack(enum ItemCaseId caseID) gBattleScripting.battler = battler; gLastUsedItem = gBattleMons[battler].item; - if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) + if (timing == FIRST_TURN) BattleScriptPushCursorAndCallback(BattleScript_EjectPackActivate_End3); - else if (caseID == ITEMEFFECT_NORMAL) + else if (timing == END_TURN) BattleScriptExecute(BattleScript_EjectPackActivate_End2); else BattleScriptCall(BattleScript_EjectPackActivate_Ret); @@ -12189,6 +10681,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkA if (gBattleStruct->battlerState[battlerAtk].usedMicleBerry) { + // TODO: Is this true? if (atkAbility == ABILITY_RIPEN) calc = (calc * 140) / 100; // ripen gives 40% acc boost else @@ -12437,6 +10930,18 @@ void RemoveAbilityFlags(u32 battler) } } +bool32 IsAnyTargetTurnDamaged(u32 battlerAtk) +{ + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (battlerDef == battlerAtk) + continue; + if (IsBattlerTurnDamaged(battlerDef)) + return TRUE; + } + return FALSE; +} + bool32 IsAllowedToUseBag(void) { switch(VarGet(B_VAR_NO_BAG_USE)) diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 78d4ddc60f..196d462d62 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -36,7 +36,6 @@ #include "constants/songs.h" #include "constants/items.h" #include "constants/species.h" -#include "constants/hold_effects.h" #include "constants/battle_string_ids.h" #include "constants/battle_move_effects.h" #include "constants/abilities.h" @@ -113,7 +112,7 @@ bool32 IsZMove(u32 move) bool32 CanUseZMove(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has Z-Power Ring. if (!TESTING && (battler == B_POSITION_PLAYER_LEFT @@ -144,7 +143,7 @@ bool32 CanUseZMove(u32 battler) u32 GetUsableZMove(u32 battler, u32 move) { u32 item = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) { @@ -167,7 +166,7 @@ void ActivateZMove(u32 battler) bool32 IsViableZMove(u32 battler, u32 move) { u32 item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); + enum HoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); int moveSlotIndex; item = gBattleMons[battler].item; diff --git a/src/data/hold_effects.h b/src/data/hold_effects.h new file mode 100644 index 0000000000..f56b6811f9 --- /dev/null +++ b/src/data/hold_effects.h @@ -0,0 +1,647 @@ +const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = +{ + [HOLD_EFFECT_NONE] = + { + }, + + [HOLD_EFFECT_RESTORE_HP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CURE_PAR] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_SLP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_PSN] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_BRN] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_FRZ] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_RESTORE_PP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_CURE_CONFUSION] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CURE_STATUS] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onStatusChange = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_SPICY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_DRY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_SWEET] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_BITTER] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CONFUSE_SOUR] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_ATTACK_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_DEFENSE_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_SPEED_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_SP_ATTACK_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_SP_DEFENSE_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CRITICAL_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_RANDOM_STAT_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_EVASION_UP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_WHITE_HERB] = + { + .whiteHerb = TRUE, + .whiteHerbFirstTurn = TRUE, + .whiteHerbEndTurn = TRUE, + }, + + [HOLD_EFFECT_MACHO_BRACE] = + { + }, + + [HOLD_EFFECT_EXP_SHARE] = + { + }, + + [HOLD_EFFECT_QUICK_CLAW] = + { + }, + + [HOLD_EFFECT_FRIENDSHIP_UP] = + { + }, + + [HOLD_EFFECT_MENTAL_HERB] = + { + .onTargetAfterHit = TRUE, + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_CHOICE_BAND] = + { + }, + + [HOLD_EFFECT_FLINCH] = + { + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_DOUBLE_PRIZE] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + }, + + [HOLD_EFFECT_REPEL] = + { + }, + + [HOLD_EFFECT_SOUL_DEW] = + { + }, + + [HOLD_EFFECT_DEEP_SEA_TOOTH] = + { + }, + + [HOLD_EFFECT_DEEP_SEA_SCALE] = + { + }, + + [HOLD_EFFECT_CAN_ALWAYS_RUN] = + { + }, + + [HOLD_EFFECT_PREVENT_EVOLVE] = + { + }, + + [HOLD_EFFECT_FOCUS_BAND] = + { + }, + + [HOLD_EFFECT_LUCKY_EGG] = + { + }, + + [HOLD_EFFECT_SCOPE_LENS] = + { + }, + + [HOLD_EFFECT_LEFTOVERS] = + { + .leftovers = TRUE, + }, + + [HOLD_EFFECT_DRAGON_SCALE] = + { + }, + + [HOLD_EFFECT_LIGHT_BALL] = + { + }, + + [HOLD_EFFECT_TYPE_POWER] = + { + }, + + [HOLD_EFFECT_UPGRADE] = + { + }, + + [HOLD_EFFECT_SHELL_BELL] = + { + .lifeOrbShellBell = TRUE, + }, + + [HOLD_EFFECT_LUCKY_PUNCH] = + { + }, + + [HOLD_EFFECT_METAL_POWDER] = + { + }, + + [HOLD_EFFECT_THICK_CLUB] = + { + }, + + [HOLD_EFFECT_LEEK] = + { + }, + + [HOLD_EFFECT_CHOICE_SCARF] = + { + }, + + [HOLD_EFFECT_CHOICE_SPECS] = + { + }, + + [HOLD_EFFECT_DAMP_ROCK] = + { + }, + + [HOLD_EFFECT_GRIP_CLAW] = + { + }, + + [HOLD_EFFECT_HEAT_ROCK] = + { + }, + + [HOLD_EFFECT_ICY_ROCK] = + { + }, + + [HOLD_EFFECT_LIGHT_CLAY] = + { + }, + + [HOLD_EFFECT_SMOOTH_ROCK] = + { + }, + + [HOLD_EFFECT_POWER_HERB] = + { + }, + + [HOLD_EFFECT_BIG_ROOT] = + { + }, + + [HOLD_EFFECT_EXPERT_BELT] = + { + }, + + [HOLD_EFFECT_LIFE_ORB] = + { + .lifeOrbShellBell = TRUE, + }, + + [HOLD_EFFECT_METRONOME] = + { + }, + + [HOLD_EFFECT_MUSCLE_BAND] = + { + }, + + [HOLD_EFFECT_WIDE_LENS] = + { + }, + + [HOLD_EFFECT_WISE_GLASSES] = + { + }, + + [HOLD_EFFECT_ZOOM_LENS] = + { + }, + + [HOLD_EFFECT_LAGGING_TAIL] = + { + }, + + [HOLD_EFFECT_FOCUS_SASH] = + { + }, + + [HOLD_EFFECT_FLAME_ORB] = + { + .orbs = TRUE, + }, + + [HOLD_EFFECT_TOXIC_ORB] = + { + .orbs = TRUE, + }, + + [HOLD_EFFECT_STICKY_BARB] = + { + .onTargetAfterHit = TRUE, + .orbs = TRUE, + }, + + [HOLD_EFFECT_IRON_BALL] = + { + }, + + [HOLD_EFFECT_BLACK_SLUDGE] = + { + .leftovers = TRUE, + }, + + [HOLD_EFFECT_DESTINY_KNOT] = + { + }, + + [HOLD_EFFECT_SHED_SHELL] = + { + }, + + [HOLD_EFFECT_QUICK_POWDER] = + { + }, + + [HOLD_EFFECT_ADAMANT_ORB] = + { + }, + + [HOLD_EFFECT_LUSTROUS_ORB] = + { + }, + + [HOLD_EFFECT_GRISEOUS_ORB] = + { + }, + + [HOLD_EFFECT_ENIGMA_BERRY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_RESIST_BERRY] = + { + }, + + [HOLD_EFFECT_POWER_ITEM] = + { + }, + + [HOLD_EFFECT_RESTORE_PCT_HP] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_MICLE_BERRY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onHpThreshold = TRUE, + }, + + [HOLD_EFFECT_CUSTAP_BERRY] = + { + }, + + [HOLD_EFFECT_JABOCA_BERRY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_ROWAP_BERRY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_KEE_BERRY] = + { + .keeMarangaBerry = TRUE, + }, + + [HOLD_EFFECT_MARANGA_BERRY] = + { + .keeMarangaBerry = TRUE, + }, + + [HOLD_EFFECT_PLATE] = + { + }, + + [HOLD_EFFECT_FLOAT_STONE] = + { + }, + + [HOLD_EFFECT_EVIOLITE] = + { + }, + + [HOLD_EFFECT_ASSAULT_VEST] = + { + }, + + [HOLD_EFFECT_DRIVE] = + { + }, + + [HOLD_EFFECT_GEMS] = + { + }, + + [HOLD_EFFECT_ROCKY_HELMET] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_AIR_BALLOON] = + { + .onTargetAfterHit = TRUE, + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + }, + + [HOLD_EFFECT_RED_CARD] = + { + }, + + [HOLD_EFFECT_RING_TARGET] = + { + }, + + [HOLD_EFFECT_BINDING_BAND] = + { + }, + + [HOLD_EFFECT_EJECT_BUTTON] = + { + }, + + [HOLD_EFFECT_ABSORB_BULB] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_CELL_BATTERY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_MEGA_STONE] = + { + }, + + [HOLD_EFFECT_SAFETY_GOGGLES] = + { + }, + + [HOLD_EFFECT_LUMINOUS_MOSS] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_SNOWBALL] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_WEAKNESS_POLICY] = + { + .onTargetAfterHit = TRUE, + }, + + [HOLD_EFFECT_PRIMAL_ORB] = + { + }, + + [HOLD_EFFECT_PROTECTIVE_PADS] = + { + }, + + [HOLD_EFFECT_TERRAIN_EXTENDER] = + { + }, + + [HOLD_EFFECT_TERRAIN_SEED] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onEffect = TRUE, + }, + + [HOLD_EFFECT_ADRENALINE_ORB] = + { + }, + + [HOLD_EFFECT_MEMORY] = + { + }, + + [HOLD_EFFECT_Z_CRYSTAL] = + { + }, + + [HOLD_EFFECT_UTILITY_UMBRELLA] = + { + }, + + [HOLD_EFFECT_EJECT_PACK] = + { + }, + + [HOLD_EFFECT_ROOM_SERVICE] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onEffect = TRUE, + }, + + [HOLD_EFFECT_BLUNDER_POLICY] = + { + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_HEAVY_DUTY_BOOTS] = + { + }, + + [HOLD_EFFECT_THROAT_SPRAY] = + { + .onAttackerAfterHit = TRUE, + }, + + [HOLD_EFFECT_ABILITY_SHIELD] = + { + }, + + [HOLD_EFFECT_CLEAR_AMULET] = + { + }, + + [HOLD_EFFECT_MIRROR_HERB] = + { + .mirrorHerb = TRUE, + .mirrorHerbFirstTurn = TRUE, + }, + + [HOLD_EFFECT_PUNCHING_GLOVE] = + { + }, + + [HOLD_EFFECT_COVERT_CLOAK] = + { + }, + + [HOLD_EFFECT_LOADED_DICE] = + { + }, + + [HOLD_EFFECT_BOOSTER_ENERGY] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + .onEffect = TRUE, + }, + + [HOLD_EFFECT_OGERPON_MASK] = + { + }, + + [HOLD_EFFECT_BERSERK_GENE] = + { + .onSwitchIn = TRUE, + .onSwitchInFirstTurn = TRUE, + }, +}; diff --git a/src/data/items.h b/src/data/items.h index 9927191d64..937e2b0d79 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -8489,7 +8489,7 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Electric Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN, .description = COMPOUND_STRING( "Boosts Defense on\n" @@ -8508,7 +8508,7 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Psychic Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN, .description = COMPOUND_STRING( "Boosts Sp. Def. on\n" @@ -8527,7 +8527,7 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Misty Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_MISTY_TERRAIN, .description = COMPOUND_STRING( "Boosts Sp. Def. on\n" @@ -8546,7 +8546,7 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Grassy Seed"), .price = (I_PRICE >= GEN_9) ? 20000 : 4000, - .holdEffect = HOLD_EFFECT_SEEDS, + .holdEffect = HOLD_EFFECT_TERRAIN_SEED, .holdEffectParam = HOLD_EFFECT_PARAM_GRASSY_TERRAIN, .description = COMPOUND_STRING( "Boosts Defense on\n" diff --git a/src/daycare.c b/src/daycare.c index f645f3e5ab..d123331d4e 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -24,7 +24,6 @@ #include "regions.h" #include "constants/form_change_types.h" #include "constants/items.h" -#include "constants/hold_effects.h" #include "constants/moves.h" #include "constants/region_map_sections.h" diff --git a/src/item.c b/src/item.c index 162798acde..a9522a723c 100644 --- a/src/item.c +++ b/src/item.c @@ -935,7 +935,7 @@ u32 GetItemSellPrice(u32 itemId) return GetItemPrice(itemId) / ITEM_SELL_FACTOR; } -bool32 IsHoldEffectChoice(enum ItemHoldEffect holdEffect) +bool32 IsHoldEffectChoice(enum HoldEffect holdEffect) { return holdEffect == HOLD_EFFECT_CHOICE_BAND || holdEffect == HOLD_EFFECT_CHOICE_SCARF diff --git a/src/pokemon.c b/src/pokemon.c index 635624ba0e..08ca51ee65 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -57,7 +57,6 @@ #include "constants/cries.h" #include "constants/event_objects.h" #include "constants/form_change_types.h" -#include "constants/hold_effects.h" #include "constants/item_effects.h" #include "constants/items.h" #include "constants/layouts.h" @@ -4444,7 +4443,7 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti u32 removeBagItemCount = 0; u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); u32 partnerSpecies, partnerHeldItem; - enum ItemHoldEffect partnerHoldEffect; + enum HoldEffect partnerHoldEffect; if (tradePartner != NULL) { diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index a9aa85efc1..a0a00894ce 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -44,7 +44,6 @@ #include "tv.h" #include "window.h" #include "constants/battle_move_effects.h" -#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/party_menu.h" diff --git a/test/battle/ability/unburden.c b/test/battle/ability/unburden.c index 0ddce0f227..4498bb4922 100644 --- a/test/battle/ability/unburden.c +++ b/test/battle/ability/unburden.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Unburden doubles speed once user uses item") { GIVEN { - ASSUME(GetItemHoldEffect(ITEM_GRASSY_SEED) == HOLD_EFFECT_SEEDS); + ASSUME(GetItemHoldEffect(ITEM_GRASSY_SEED) == HOLD_EFFECT_TERRAIN_SEED); ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_GRASSY_SEED); Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } diff --git a/test/battle/hold_effect/kee_berry.c b/test/battle/hold_effect/kee_berry.c index c63da86841..d37a132be4 100644 --- a/test/battle/hold_effect/kee_berry.c +++ b/test/battle/hold_effect/kee_berry.c @@ -89,3 +89,19 @@ DOUBLE_BATTLE_TEST("Kee Berry doesn't trigger if partner was hit") EXPECT(opponentRight->item == ITEM_KEE_BERRY); } } + +SINGLE_BATTLE_TEST("Kee Berry doesn't trigger if the move was boosted by Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_KEE_BERRY); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); + HP_BAR(player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + } +} \ No newline at end of file diff --git a/test/battle/hold_effect/maranga_berry.c b/test/battle/hold_effect/maranga_berry.c index 22b72ba201..785e040ca4 100644 --- a/test/battle/hold_effect/maranga_berry.c +++ b/test/battle/hold_effect/maranga_berry.c @@ -89,3 +89,19 @@ DOUBLE_BATTLE_TEST("Maranga Berry doesn't trigger if partner was hit") EXPECT(opponentRight->item == ITEM_MARANGA_BERRY); } } + +SINGLE_BATTLE_TEST("Maranga Berry doesn't trigger if the move was boosted by Sheer Force") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MARANGA_BERRY); } + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_FIRE_PUNCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIRE_PUNCH, opponent); + HP_BAR(player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index 9db149c023..ef96ead7e4 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -63,20 +63,3 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); } } - -#if B_HP_BERRIES <= GEN_3 -SINGLE_BATTLE_TEST("Restore HP Berry triggers only during the end turn") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(ITEM_ORAN_BERRY); } - } WHEN { - TURN { MOVE(player, MOVE_TACKLE); } - TURN {} - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); - } -} -#endif diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c index eecb3846f7..b54dd54f5b 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/seeds.c @@ -3,13 +3,13 @@ ASSUMPTIONS { - ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); ASSUME(gItemsInfo[ITEM_ELECTRIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN); - ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); ASSUME(gItemsInfo[ITEM_GRASSY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_GRASSY_TERRAIN); - ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_MISTY_TERRAIN); - ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); + ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_TERRAIN_SEED); ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN); } diff --git a/test/battle/move_effect/magic_room.c b/test/battle/move_effect/magic_room.c index cffd6034d7..02953f533d 100644 --- a/test/battle/move_effect/magic_room.c +++ b/test/battle/move_effect/magic_room.c @@ -36,4 +36,43 @@ DOUBLE_BATTLE_TEST("Magic Room prevents item hold effects") } } +SINGLE_BATTLE_TEST("Magic Room: An item that can activate will activate once Magic Room is over") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MAGIC_ROOM); MOVE(opponent, MOVE_GROWL); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_ROOM, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + // Turn 4 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + // Turn 5 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } + + MESSAGE("Magic Room wore off, and held items' effects returned to normal!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } +} + TO_DO_BATTLE_TEST("TODO: Write Magic Room (Move Effect) test titles") diff --git a/test/battle/move_effect_secondary/steal_item.c b/test/battle/move_effect_secondary/steal_item.c index 79c293757f..e83d5c5cb5 100644 --- a/test/battle/move_effect_secondary/steal_item.c +++ b/test/battle/move_effect_secondary/steal_item.c @@ -148,11 +148,12 @@ SINGLE_BATTLE_TEST("Thief and Covet can't steal target's held item if user faint } } -SINGLE_BATTLE_TEST("Thief and Covet: Berry activation happens before the item can be stolen") +SINGLE_BATTLE_TEST("Thief and Covet: Berries that activate on HP thresholds are stolen before they can activate") { u32 move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } + GIVEN { PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { MaxHP(200); HP(101); Item(ITEM_ORAN_BERRY); } @@ -161,6 +162,25 @@ SINGLE_BATTLE_TEST("Thief and Covet: Berry activation happens before the item ca } SCENE { ANIMATION(ANIM_TYPE_MOVE, move, player); HP_BAR(opponent); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); + } +} + +SINGLE_BATTLE_TEST("Thief and Covet: Berries that activate on a Status activate before the item can be stolen") +{ + u32 move; + PARAMETRIZE { move = MOVE_THIEF; } + PARAMETRIZE { move = MOVE_COVET; } + + GIVEN { + PLAYER(SPECIES_TOXICROAK) { Ability(ABILITY_POISON_TOUCH); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + ABILITY_POPUP(player, ABILITY_POISON_TOUCH); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_STEAL, opponent); } diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index f57a15b2a5..9eba3e1901 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2181,7 +2181,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * if (ctx->explicitGimmick && ctx->gimmick != GIMMICK_NONE) { u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); - enum ItemHoldEffect holdEffect = GetItemHoldEffect(item); + enum HoldEffect holdEffect = GetItemHoldEffect(item); u32 species = GetMonData(mon, MON_DATA_SPECIES); u32 side = battlerId & BIT_SIDE; From a5f0686261bdb56b8bb9c478581c365244cae54b Mon Sep 17 00:00:00 2001 From: surskitty Date: Sun, 12 Oct 2025 13:23:48 -0400 Subject: [PATCH 077/183] Weather/Terrain AI touch-ups. (#7933) --- src/battle_ai_field_statuses.c | 2 +- src/battle_ai_util.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index 81d80d29c5..030d99a94e 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -398,7 +398,7 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_PSYCHIC_TERRAIN)) return FIELD_EFFECT_POSITIVE; - if (HasMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) + if (HasBattlerSideMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) return FIELD_EFFECT_POSITIVE; bool32 grounded = AI_IsBattlerGrounded(battler); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 07c98fba3a..f6a524459d 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2027,6 +2027,9 @@ bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef) bool32 ShouldSetWeather(u32 battler, u32 weather) { + if (AI_GetWeather() & weather) + return FALSE; + return WeatherChecker(battler, weather, FIELD_EFFECT_POSITIVE); } @@ -2037,6 +2040,15 @@ bool32 ShouldClearWeather(u32 battler, u32 weather) bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus) { + if (gFieldStatuses & fieldStatus) + { + if (!(fieldStatus & STATUS_FIELD_TRICK_ROOM)) + return FALSE; + // DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE + else if (gFieldTimers.trickRoomTimer != (gBattleTurnCounter + 1)) + return FALSE; + } + return FieldStatusChecker(battler, fieldStatus, FIELD_EFFECT_POSITIVE); } From 5090432ff14f521283d1db5eca89df086387a86b Mon Sep 17 00:00:00 2001 From: surskitty Date: Sun, 12 Oct 2025 13:24:24 -0400 Subject: [PATCH 078/183] Improving the checks for the AI to avoid Encore; adding RISK_ENCORE_CHANCE config. (#7929) --- src/battle_ai_main.c | 13 +++++++++++++ src/battle_ai_util.c | 8 -------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 3bd1e3a164..e7a85e211e 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4066,6 +4066,19 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(10); + // don't get baited into encore + if (gBattleMoveEffects[moveEffect].encourageEncore + && HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE) + && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerAtk] != HOLD_EFFECT_MENTAL_HERB)) + { + if (!AI_IsAbilityOnSide(battlerAtk, ABILITY_AROMA_VEIL) + || IsMoldBreakerTypeAbility(battlerDef, aiData->abilities[battlerDef]) + || aiData->abilities[battlerDef] == ABILITY_MYCELIUM_MIGHT + || IsMoldBreakerTypeAbility(BATTLE_PARTNER(battlerDef), aiData->abilities[BATTLE_PARTNER(battlerDef)]) + || aiData->abilities[BATTLE_PARTNER(battlerDef)] == ABILITY_MYCELIUM_MIGHT) + return score; + } + // check thawing moves if (gBattleMons[battlerAtk].status1 & STATUS1_ICY_ANY && MoveThawsUser(move)) ADJUST_SCORE(10); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index f6a524459d..7ab9fb1195 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2005,10 +2005,6 @@ bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef) if (AI_IsAbilityOnSide(battlerDef, ABILITY_OPPORTUNIST)) return FALSE; - // Don't increase stats if opposing battler has Encore - if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) - return FALSE; - // Don't increase stats if opposing battler has used Haze effect or AI effect if (!RandomPercentage(RNG_AI_BOOST_INTO_HAZE, BOOST_INTO_HAZE_CHANCE) && HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE)) @@ -2186,10 +2182,6 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) if (GetBattlerSecondaryDamage(battlerDef) >= gBattleMons[battlerDef].hp) return NO_INCREASE; - // Don't decrease stat if opposing battler has Encore - if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) - return NO_INCREASE; - if (DoesAbilityRaiseStatsWhenLowered(gAiLogicData->abilities[battlerDef])) return NO_INCREASE; From 2daa8f3c883eec097d45531cc1335cebca04378d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 13 Oct 2025 15:39:10 +0200 Subject: [PATCH 079/183] Remove EffectHitSetTerrain script to use moveeffect (#7938) --- data/battle_scripts_1.s | 25 ------------------------- include/battle_scripts.h | 1 - include/constants/battle_move_effects.h | 1 - src/battle_script_commands.c | 4 ---- src/data/battle_move_effects.h | 6 ------ src/data/moves_info.h | 7 +++++-- test/battle/gimmick/zmove.c | 2 +- 7 files changed, 6 insertions(+), 40 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 760d421696..c79f91a87c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8330,31 +8330,6 @@ BattleScript_ExtremeEvoboostSpDef:: BattleScript_ExtremeEvoboostEnd:: goto BattleScript_MoveEnd -BattleScript_EffectHitSetTerrain:: - attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - setterrain BattleScript_TryFaint - playanimation BS_ATTACKER, B_ANIM_RESTORE_BG - printfromtable gTerrainStringIds - waitmessage B_WAIT_TIME_LONG -BattleScript_TryFaint: - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd - BattleScript_RemoveTerrain:: removeterrain playanimation BS_ATTACKER, B_ANIM_RESTORE_BG diff --git a/include/battle_scripts.h b/include/battle_scripts.h index d179ad880c..a0d99d9de3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -815,7 +815,6 @@ extern const u8 BattleScript_EffectSkyDrop[]; extern const u8 BattleScript_EffectMeteorBeam[]; extern const u8 BattleScript_EffectCourtChange[]; extern const u8 BattleScript_EffectExtremeEvoboost[]; -extern const u8 BattleScript_EffectHitSetTerrain[]; extern const u8 BattleScript_EffectDarkVoid[]; extern const u8 BattleScript_EffectVictoryDance[]; extern const u8 BattleScript_EffectTeatime[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 2ddb75adf6..5727187a3f 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -311,7 +311,6 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_MAX_HP_50_RECOIL, EFFECT_CHLOROBLAST, // Same effect as EFFECT_MAX_HP_50_RECOIL but follows the same rules as EFFECT_RECOIL EFFECT_EXTREME_EVOBOOST, - EFFECT_HIT_SET_TERRAIN, EFFECT_DARK_VOID, EFFECT_VICTORY_DANCE, EFFECT_TEATIME, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fedc5cfe73..2f05de63d0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15052,10 +15052,6 @@ void BS_SetTerrain(void) statusFlag = STATUS_FIELD_PSYCHIC_TERRAIN; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; break; - case EFFECT_HIT_SET_TERRAIN: - statusFlag = GetMoveTerrainFlag(gCurrentMove); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC; - break; default: break; } diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 094f2c7dfe..425da7ba6d 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1984,12 +1984,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_HIT_SET_TERRAIN] = - { - .battleScript = BattleScript_EffectHitSetTerrain, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_DARK_VOID] = { .battleScript = BattleScript_EffectDarkVoid, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index fb5dbeb3e9..ed4097ab81 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -21508,7 +21508,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Mew attacks with full force.\n" "Psychically charges terrain."), - .effect = EFFECT_HIT_SET_TERRAIN, + .effect = EFFECT_HIT, .power = 185, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -21516,8 +21516,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument = { .moveProperty = STATUS_FIELD_PSYCHIC_TERRAIN }, .battleAnimScript = gBattleAnimMove_GenesisSupernova, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PSYCHIC_TERRAIN, + .chance = 100, + }), }, [MOVE_SINISTER_ARROW_RAID] = { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 2495ec0b60..29538891ef 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -579,7 +579,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Extreme Evoboost boosts all the user's stats by two SINGLE_BATTLE_TEST("(Z-MOVE) Genesis Supernova sets up psychic terrain") { GIVEN { - ASSUME(GetMoveEffect(MOVE_GENESIS_SUPERNOVA) == EFFECT_HIT_SET_TERRAIN); + ASSUME(MoveHasAdditionalEffect(MOVE_GENESIS_SUPERNOVA, MOVE_EFFECT_PSYCHIC_TERRAIN)); PLAYER(SPECIES_MEW) { Item(ITEM_MEWNIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { From 3ad78d0079b52c7ccbf2076e8b70bff9e7fbbe98 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 14 Oct 2025 19:07:56 +0200 Subject: [PATCH 080/183] Clean up follow up for AtkCanceller refactor (#7951) --- include/battle_util.h | 5 ++-- src/battle_script_commands.c | 39 ++++++++++++++------------- src/battle_util.c | 52 +++++++++++++++++++----------------- 3 files changed, 50 insertions(+), 46 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 819b4a5b65..aed03afae1 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -173,8 +173,9 @@ struct BattleContext u32 battlerAtk:3; u32 battlerDef:3; u32 currentMove:16; - enum BattleMoveEffects moveEffect:10; - enum Ability ability[MAX_BATTLERS_COUNT]; + u32 padding:10; + enum Ability abilities[MAX_BATTLERS_COUNT]; + enum HoldEffect holdEffects[MAX_BATTLERS_COUNT]; }; enum SleepClauseBlock diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2f05de63d0..f99fafcf3f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1065,7 +1065,7 @@ bool32 IsMovePowderBlocked(struct BattleContext *ctx) if (IsPowderMove(ctx->currentMove) && (ctx->battlerAtk != ctx->battlerDef)) { if (GetGenConfig(GEN_CONFIG_POWDER_GRASS) >= GEN_6 - && (IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_GRASS) || ctx->ability[ctx->battlerDef] == ABILITY_OVERCOAT)) + && (IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_GRASS) || ctx->abilities[ctx->battlerDef] == ABILITY_OVERCOAT)) { gBattlerAbility = ctx->battlerDef; RecordAbilityBattle(ctx->battlerDef, ABILITY_OVERCOAT); @@ -1125,11 +1125,12 @@ static void Cmd_attackcanceler(void) ctx.battlerAtk = gBattlerAttacker; ctx.battlerDef = gBattlerTarget; ctx.currentMove = gCurrentMove; - ctx.moveEffect = GetMoveEffect(ctx.currentMove); + + enum BattleMoveEffects moveEffect = GetMoveEffect(ctx.currentMove); if (!IsBattlerAlive(gBattlerAttacker) - && ctx.moveEffect != EFFECT_EXPLOSION - && ctx.moveEffect != EFFECT_MISTY_EXPLOSION) + && moveEffect != EFFECT_EXPLOSION + && moveEffect != EFFECT_MISTY_EXPLOSION) { gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; @@ -1137,14 +1138,14 @@ static void Cmd_attackcanceler(void) } // With how attackcanceller works right now we only need attacker and target abilities. Might change in the future - ctx.ability[ctx.battlerAtk] = GetBattlerAbility(ctx.battlerAtk); - ctx.ability[ctx.battlerDef] = GetBattlerAbility(ctx.battlerDef); + ctx.abilities[ctx.battlerAtk] = GetBattlerAbility(ctx.battlerAtk); + ctx.abilities[ctx.battlerDef] = GetBattlerAbility(ctx.battlerDef); if (AtkCanceller_MoveSuccessOrder(&ctx) != MOVE_STEP_SUCCESS) return; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF - && ctx.ability[ctx.battlerAtk] == ABILITY_PARENTAL_BOND + && ctx.abilities[ctx.battlerAtk] == ABILITY_PARENTAL_BOND && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) && !(gAbsentBattlerFlags & (1u << gBattlerTarget)) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE) @@ -1158,8 +1159,8 @@ static void Cmd_attackcanceler(void) if (CanAbilityBlockMove( ctx.battlerAtk, ctx.battlerDef, - ctx.ability[ctx.battlerAtk], - ctx.ability[ctx.battlerDef], + ctx.abilities[ctx.battlerAtk], + ctx.abilities[ctx.battlerDef], ctx.currentMove, RUN_SCRIPT)) return; @@ -1169,7 +1170,7 @@ static void Cmd_attackcanceler(void) if (CanAbilityAbsorbMove( ctx.battlerAtk, ctx.battlerDef, - ctx.ability[ctx.battlerDef], + ctx.abilities[ctx.battlerDef], ctx.currentMove, GetBattleMoveType(ctx.currentMove), RUN_SCRIPT)) @@ -1181,17 +1182,17 @@ static void Cmd_attackcanceler(void) // Check if no available target present on the field or if Sky Battles ban the move if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) - && (!gBattleMoveEffects[ctx.moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) + && (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) || (IsMoveNotAllowedInSkyBattles(gCurrentMove))) { gBattleStruct->noTargetPresent = TRUE; - if (ctx.moveEffect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. + if (moveEffect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. gBattlescriptCurrInstr = BattleScript_FlingFailConsumeItem; else gBattlescriptCurrInstr = BattleScript_ButItFailed; - if (!gBattleMoveEffects[ctx.moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) + if (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); return; } @@ -1222,7 +1223,7 @@ static void Cmd_attackcanceler(void) { u32 battler = gBattlerTarget; - if (ctx.ability[ctx.battlerDef] == ABILITY_MAGIC_BOUNCE) + if (ctx.abilities[ctx.battlerDef] == ABILITY_MAGIC_BOUNCE) { battler = gBattlerTarget; gBattleStruct->bouncedMoveIsUsed = TRUE; @@ -1273,11 +1274,11 @@ static void Cmd_attackcanceler(void) BattleScriptCall(BattleScript_TookAttack); } else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && (ctx.moveEffect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - && (!gBattleMoveEffects[ctx.moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) - && ctx.moveEffect != EFFECT_SUCKER_PUNCH - && ctx.moveEffect != EFFECT_COUNTER - && ctx.moveEffect != EFFECT_UPPER_HAND) + && (moveEffect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) + && (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) + && moveEffect != EFFECT_SUCKER_PUNCH + && moveEffect != EFFECT_COUNTER + && moveEffect != EFFECT_UPPER_HAND) { if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; diff --git a/src/battle_util.c b/src/battle_util.c index b95fdd3a28..3c83a80cab 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2010,7 +2010,7 @@ static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) else { u8 toSub; - if (IsAbilityAndRecord(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ABILITY_EARLY_BIRD)) + if (IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_EARLY_BIRD)) toSub = 2; else toSub = 1; @@ -2018,9 +2018,11 @@ static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_SLEEP; else gBattleMons[ctx->battlerAtk].status1 -= toSub; + + enum BattleMoveEffects moveEffect = GetMoveEffect(ctx->currentMove); if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { - if (ctx->moveEffect != EFFECT_SNORE && ctx->moveEffect != EFFECT_SLEEP_TALK) + if (moveEffect != EFFECT_SNORE && moveEffect != EFFECT_SLEEP_TALK) { gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; @@ -2273,7 +2275,7 @@ static enum MoveCanceller CancellerConfused(struct BattleContext *ctx) static enum MoveCanceller CancellerParalysed(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_PARALYSIS - && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) + && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) && !RandomPercentage(RNG_PARALYSIS, 75)) { gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; @@ -2366,7 +2368,7 @@ static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) if (gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) - && (IsHoldEffectChoice(holdEffect) || ctx->ability[ctx->battlerAtk] == ABILITY_GORILLA_TACTICS)) + && (IsHoldEffectChoice(holdEffect) || ctx->abilities[ctx->battlerAtk] == ABILITY_GORILLA_TACTICS)) *choicedMoveAtk = gChosenMove; u32 moveIndex; @@ -2389,7 +2391,7 @@ static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) const u8 *battleScript = NULL; battleScript = BattleScript_SubmoveAttackstring; - switch(ctx->moveEffect) + switch(GetMoveEffect(ctx->currentMove)) { case EFFECT_MIRROR_MOVE: calledMove = GetMirrorMoveMove(); @@ -2430,7 +2432,7 @@ static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(calledMove)) calledMove = GetTypeBasedZMove(calledMove); - if (ctx->moveEffect == EFFECT_COPYCAT && IsMaxMove(calledMove)) + if (GetMoveEffect(ctx->currentMove) == EFFECT_COPYCAT && IsMaxMove(calledMove)) calledMove = gBattleStruct->dynamax.lastUsedBaseMove; gBattleStruct->submoveAnnouncement = SUBMOVE_SUCCESS; @@ -2509,7 +2511,7 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) } else if (moveTarget != MOVE_TARGET_OPPONENTS_FIELD) { - if (ctx->battlerAtk != ctx->battlerDef && ctx->ability[ctx->battlerDef] == ABILITY_PRESSURE) + if (ctx->battlerAtk != ctx->battlerDef && ctx->abilities[ctx->battlerDef] == ABILITY_PRESSURE) ppToDeduct++; } @@ -2597,7 +2599,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) { const u8 *battleScript = NULL; - switch (ctx->moveEffect) + switch (GetMoveEffect(ctx->currentMove)) { case EFFECT_FAIL_IF_NOT_ARG_TYPE: if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, GetMoveArgType(ctx->currentMove))) @@ -2656,7 +2658,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) case EFFECT_POLTERGEIST: if (gBattleMons[ctx->battlerDef].item == ITEM_NONE || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || ctx->ability[ctx->battlerDef] == ABILITY_KLUTZ) + || ctx->abilities[ctx->battlerDef] == ABILITY_KLUTZ) battleScript = BattleScript_ButItFailed; break; case EFFECT_PROTECT: @@ -2664,13 +2666,13 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) break; case EFFECT_REST: if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP - || ctx->ability[ctx->battlerAtk] == ABILITY_COMATOSE) + || ctx->abilities[ctx->battlerAtk] == ABILITY_COMATOSE) battleScript = BattleScript_RestIsAlreadyAsleep; else if (gBattleMons[ctx->battlerAtk].hp == gBattleMons[ctx->battlerAtk].maxHP) battleScript = BattleScript_AlreadyAtFullHp; - else if (ctx->ability[ctx->battlerAtk] == ABILITY_INSOMNIA - || ctx->ability[ctx->battlerAtk] == ABILITY_VITAL_SPIRIT - || ctx->ability[ctx->battlerAtk] == ABILITY_PURIFYING_SALT) + else if (ctx->abilities[ctx->battlerAtk] == ABILITY_INSOMNIA + || ctx->abilities[ctx->battlerAtk] == ABILITY_VITAL_SPIRIT + || ctx->abilities[ctx->battlerAtk] == ABILITY_PURIFYING_SALT) battleScript = BattleScript_InsomniaProtects; break; case EFFECT_SUCKER_PUNCH: @@ -2680,7 +2682,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) break; case EFFECT_SNORE: if (!(gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) - && ctx->ability[ctx->battlerAtk] != ABILITY_COMATOSE) + && ctx->abilities[ctx->battlerAtk] != ABILITY_COMATOSE) battleScript = BattleScript_ButItFailed; break; case EFFECT_STEEL_ROLLER: @@ -2726,7 +2728,7 @@ static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx) { if (TryActivatePowderStatus(ctx->currentMove)) { - if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) + if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) gBattleStruct->moveDamage[ctx->battlerAtk] = GetNonDynamaxMaxHP(ctx->battlerAtk) / 4; // This might be incorrect @@ -2754,16 +2756,16 @@ bool32 IsDazzlingAbility(enum Ability ability) static enum MoveCanceller CancellerPriorityBlock(struct BattleContext *ctx) { bool32 effect = FALSE; - s32 priority = GetChosenMovePriority(ctx->battlerAtk, ctx->ability[ctx->battlerAtk]); + s32 priority = GetChosenMovePriority(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk]); u32 blockAbility = ABILITY_NONE; // ability of battler who is blocking u32 blockedByBattler = ctx->battlerDef; if (priority <= 0 || IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef)) return MOVE_STEP_SUCCESS; - if (IsDazzlingAbility(ctx->ability[ctx->battlerDef])) + if (IsDazzlingAbility(ctx->abilities[ctx->battlerDef])) { - blockAbility = ctx->ability[ctx->battlerDef]; + blockAbility = ctx->abilities[ctx->battlerDef]; effect = TRUE; } else if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(ctx->battlerDef))) @@ -2793,7 +2795,7 @@ static enum MoveCanceller CancellerPriorityBlock(struct BattleContext *ctx) static enum MoveCanceller CancellerProtean(struct BattleContext *ctx) { u32 moveType = GetBattleMoveType(ctx->currentMove); - if (ProteanTryChangeType(ctx->battlerAtk, ctx->ability[ctx->battlerAtk], ctx->currentMove, moveType)) + if (ProteanTryChangeType(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->currentMove, moveType)) { if (GetGenConfig(GEN_PROTEAN_LIBERO) >= GEN_9) gDisableStructs[ctx->battlerAtk].usedProteanLibero = TRUE; @@ -2824,7 +2826,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) { if (GetMoveEffect(ctx->currentMove) == EFFECT_MULTI_HIT) { - enum Ability ability = ctx->ability[ctx->battlerAtk]; + enum Ability ability = ctx->abilities[ctx->battlerAtk]; if (ability == ABILITY_SKILL_LINK) { @@ -2845,7 +2847,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) } else if (GetMoveStrikeCount(ctx->currentMove) > 1) { - if (ctx->moveEffect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk) == HOLD_EFFECT_LOADED_DICE) + if (GetMoveEffect(ctx->currentMove) == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk) == HOLD_EFFECT_LOADED_DICE) { gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); } @@ -2853,7 +2855,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) { gMultiHitCounter = GetMoveStrikeCount(ctx->currentMove); - if (ctx->moveEffect == EFFECT_DRAGON_DARTS + if (GetMoveEffect(ctx->currentMove) == EFFECT_DRAGON_DARTS && !IsAffectedByFollowMe(ctx->battlerAtk, GetBattlerSide(ctx->battlerDef), ctx->currentMove) && CanTargetPartner(ctx->battlerAtk, ctx->battlerDef) && TargetFullyImmuneToCurrMove(ctx->battlerAtk, ctx->battlerDef)) @@ -2862,7 +2864,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } - else if (B_BEAT_UP >= GEN_5 && ctx->moveEffect == EFFECT_BEAT_UP) + else if (B_BEAT_UP >= GEN_5 && GetMoveEffect(ctx->currentMove) == EFFECT_BEAT_UP) { struct Pokemon* party = GetBattlerParty(ctx->battlerAtk); int i; @@ -2895,7 +2897,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) { u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); - enum Ability abilityAtk = ctx->ability[ctx->battlerAtk]; + enum Ability abilityAtk = ctx->abilities[ctx->battlerAtk]; if (IsSpreadMove(moveTarget)) { @@ -2908,7 +2910,7 @@ static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) if (ctx->battlerAtk == battlerDef || !IsBattlerAlive(battlerDef) - || (ctx->moveEffect == EFFECT_SYNCHRONOISE && !DoBattlersShareType(ctx->battlerAtk, battlerDef)) + || (GetMoveEffect(ctx->currentMove) == EFFECT_SYNCHRONOISE && !DoBattlersShareType(ctx->battlerAtk, battlerDef)) || (moveTarget == MOVE_TARGET_BOTH && ctx->battlerAtk == BATTLE_PARTNER(battlerDef)) || IsBattlerProtected(ctx->battlerAtk, battlerDef, ctx->currentMove)) // Missing Invulnerable check { From a77f8d97a1410cdfe67f6cf5461a66799c28a45f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:08:16 +0200 Subject: [PATCH 081/183] Optimize GetWhichBattlerFasterOrTies (#7953) --- include/battle_main.h | 11 ++-- src/battle_ai_main.c | 19 +++++- src/battle_ai_util.c | 4 +- src/battle_end_turn.c | 8 ++- src/battle_main.c | 113 +++++++++++++++++++---------------- src/battle_script_commands.c | 11 +++- src/battle_util.c | 30 ++++++---- 7 files changed, 121 insertions(+), 75 deletions(-) diff --git a/include/battle_main.h b/include/battle_main.h index 844da53033..400d793b20 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -1,6 +1,7 @@ #ifndef GUARD_BATTLE_MAIN_H #define GUARD_BATTLE_MAIN_H +#include "battle_util.h" #include "pokemon.h" #include "data.h" #include "constants/hold_effects.h" @@ -97,14 +98,12 @@ u8 IsRunningFromBattleImpossible(u32 battler); void SwitchTwoBattlersInParty(u32 battler, u32 battler2); void SwitchPartyOrder(u32 battler); void SwapTurnOrder(u8 id1, u8 id2); -u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum HoldEffect holdEffect); -u32 GetBattlerTotalSpeedStat(u32 battler); +u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect holdEffect); s32 GetChosenMovePriority(u32 battler, enum Ability ability); s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move); -s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2, - enum HoldEffect holdEffectBattler1, enum HoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); -s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); -s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); +s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); +s32 GetWhichBattlerFasterOrTies(struct BattleContext *ctx, bool32 ignoreChosenMoves); +s32 GetWhichBattlerFaster(struct BattleContext *ctx, bool32 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState monInBattle); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index e7a85e211e..034ca30fc9 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -558,7 +558,7 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) aiData->lastUsedMove[battler] = gLastMoves[battler]; aiData->hpPercents[battler] = GetHealthPercentage(battler); aiData->moveLimitations[battler] = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); - aiData->speedStats[battler] = GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); + aiData->speedStats[battler] = GetBattlerTotalSpeedStat(battler, ability, holdEffect); if (IsAiBattlerAssumingStab()) RecordMovesBasedOnStab(battler); @@ -3004,6 +3004,19 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } +static s32 AI_GetWhichBattlerFasterOrTies(u32 battlerAtk, u32 battlerDef, bool32 ignoreChosenMoves) +{ + struct BattleContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.abilities[battlerAtk] = gAiLogicData->abilities[battlerAtk]; + ctx.abilities[battlerDef] = gAiLogicData->abilities[battlerDef]; + ctx.holdEffects[battlerAtk] = gAiLogicData->holdEffects[battlerAtk]; + ctx.holdEffects[battlerDef] = gAiLogicData->holdEffects[battlerDef]; + + return GetWhichBattlerFasterOrTies(&ctx, ignoreChosenMoves); +} + static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u32 movesetIndex = gAiThinkingStruct->movesetIndex; @@ -3025,7 +3038,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(SLOW_KILL); } else if (CanTargetFaintAi(battlerDef, battlerAtk) - && GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER + && AI_GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) > 0) { if (RandomPercentage(RNG_AI_PRIORITIZE_LAST_CHANCE, PRIORITIZE_LAST_CHANCE_CHANCE)) @@ -5059,7 +5072,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (IsStatBoostingBerry(item) && aiData->hpPercents[battlerAtk] > 60) ADJUST_SCORE(WEAK_EFFECT); else if (ShouldRestoreHpBerry(battlerAtk, item) && !CanAIFaintTarget(battlerAtk, battlerDef, 0) - && ((GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) == 1 && CanTargetFaintAiWithMod(battlerDef, battlerAtk, 0, 0)) + && ((AI_GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) == 1 && CanTargetFaintAiWithMod(battlerDef, battlerAtk, 0, 0)) || !CanTargetFaintAiWithMod(battlerDef, battlerAtk, toHeal, 0))) ADJUST_SCORE(WEAK_EFFECT); // Recycle healing berry if we can't otherwise faint the target and the target wont kill us after we activate the berry } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 7ab9fb1195..20b15d6cfe 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1374,8 +1374,8 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 pla return AI_IS_SLOWER; } - speedBattlerAI = GetBattlerTotalSpeedStatArgs(battlerAI, abilityAI, holdEffectAI); - speedBattler = GetBattlerTotalSpeedStatArgs(battler, abilityPlayer, holdEffectPlayer); + speedBattlerAI = GetBattlerTotalSpeedStat(battlerAI, abilityAI, holdEffectAI); + speedBattler = GetBattlerTotalSpeedStat(battler, abilityPlayer, holdEffectPlayer); if (holdEffectAI == HOLD_EFFECT_LAGGING_TAIL && holdEffectPlayer != HOLD_EFFECT_LAGGING_TAIL) return AI_IS_SLOWER; diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 4b42d05efd..6dc762e5c7 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -121,15 +121,21 @@ static bool32 HandleEndTurnOrder(u32 battler) gBattleStruct->endTurnEventsCounter++; u32 i, j; + struct BattleContext ctx = {0}; for (i = 0; i < gBattlersCount; i++) { gBattlerByTurnOrder[i] = i; + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - if (GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; + + if (GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); } } diff --git a/src/battle_main.c b/src/battle_main.c index 81a5205250..1685a4d606 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -14,7 +14,6 @@ #include "battle_scripts.h" #include "battle_setup.h" #include "battle_tower.h" -#include "battle_util.h" #include "battle_z_move.h" #include "battle_gimmick.h" #include "berry.h" @@ -112,7 +111,7 @@ static void SetActionsAndBattlersTurnOrder(void); static void UpdateBattlerPartyOrdersOnSwitch(u32 battler); static bool8 AllAtActionConfirmed(void); static void TryChangeTurnOrder(void); -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom); +static void TryChangingTurnOrderEffects(struct BattleContext *ctx, u32 *quickClawRandom, u32 *quickDrawRandom); static void CheckChangingTurnOrderEffects(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); @@ -3801,13 +3800,21 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->speedTieBreaks = RandomUniform(RNG_SPEED_TIE, 0, Factorial(MAX_BATTLERS_COUNT) - 1); gBattleTurnCounter = 0; + struct BattleContext ctx = {0}; for (i = 0; i < gBattlersCount; i++) + { gBattlerByTurnOrder[i] = i; + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - if (GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) == -1) + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; + + if (GetWhichBattlerFaster(&ctx, TRUE) == -1) SwapTurnOrder(i, j); } } @@ -4759,7 +4766,7 @@ void SwapTurnOrder(u8 id1, u8 id2) } // For AI, so it doesn't 'cheat' by knowing player's ability -u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum HoldEffect holdEffect) +u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect holdEffect) { u32 speed = gBattleMons[battler].speed; @@ -4826,13 +4833,6 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum HoldEff return speed; } -u32 GetBattlerTotalSpeedStat(u32 battler) -{ - enum Ability ability = GetBattlerAbility(battler); - enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); - return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); -} - s32 GetChosenMovePriority(u32 battler, enum Ability ability) { u16 move; @@ -4886,8 +4886,7 @@ s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) return priority; } -s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2, - enum HoldEffect holdEffectBattler1, enum HoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) +s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) { u32 strikesFirst = 0; @@ -4896,18 +4895,18 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov // Quick Claw / Quick Draw / Custap Berry - always first // Stall / Mycelium Might - last but before Lagging Tail // Lagging Tail - always last - bool32 battler1HasQuickEffect = gProtectStructs[battler1].quickDraw || gProtectStructs[battler1].usedCustapBerry; - bool32 battler2HasQuickEffect = gProtectStructs[battler2].quickDraw || gProtectStructs[battler2].usedCustapBerry; - bool32 battler1HasStallingAbility = ability1 == ABILITY_STALL || gProtectStructs[battler1].myceliumMight; - bool32 battler2HasStallingAbility = ability2 == ABILITY_STALL || gProtectStructs[battler2].myceliumMight; + bool32 battler1HasQuickEffect = gProtectStructs[ctx->battlerAtk].quickDraw || gProtectStructs[ctx->battlerAtk].usedCustapBerry; + bool32 battler2HasQuickEffect = gProtectStructs[ctx->battlerDef].quickDraw || gProtectStructs[ctx->battlerDef].usedCustapBerry; + bool32 battler1HasStallingAbility = ctx->abilities[ctx->battlerAtk] == ABILITY_STALL || gProtectStructs[ctx->battlerAtk].myceliumMight; + bool32 battler2HasStallingAbility = ctx->abilities[ctx->battlerDef] == ABILITY_STALL || gProtectStructs[ctx->battlerDef].myceliumMight; if (battler1HasQuickEffect && !battler2HasQuickEffect) strikesFirst = 1; else if (battler2HasQuickEffect && !battler1HasQuickEffect) strikesFirst = -1; - else if (gProtectStructs[battler1].laggingTail && !gProtectStructs[battler2].laggingTail) + else if (gProtectStructs[ctx->battlerAtk].laggingTail && !gProtectStructs[ctx->battlerDef].laggingTail) strikesFirst = -1; - else if (gProtectStructs[battler2].laggingTail && !gProtectStructs[battler1].laggingTail) + else if (gProtectStructs[ctx->battlerDef].laggingTail && !gProtectStructs[ctx->battlerAtk].laggingTail) strikesFirst = 1; else if (battler1HasStallingAbility && !battler2HasStallingAbility) strikesFirst = -1; @@ -4949,32 +4948,27 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov return strikesFirst; } -s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves) +s32 GetWhichBattlerFasterOrTies(struct BattleContext *ctx, bool32 ignoreChosenMoves) { s32 priority1 = 0, priority2 = 0; - enum Ability ability1 = GetBattlerAbility(battler1); - u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1); - enum HoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); - u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2); - enum HoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); - enum Ability ability2 = GetBattlerAbility(battler2); + u32 speedBattler1 = GetBattlerTotalSpeedStat(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->holdEffects[ctx->battlerAtk]); + u32 speedBattler2 = GetBattlerTotalSpeedStat(ctx->battlerDef, ctx->abilities[ctx->battlerDef], ctx->holdEffects[ctx->battlerDef]); if (!ignoreChosenMoves) { - if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE) - priority1 = GetChosenMovePriority(battler1, ability1); - if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE) - priority2 = GetChosenMovePriority(battler2, ability2); + if (gChosenActionByBattler[ctx->battlerAtk] == B_ACTION_USE_MOVE) + priority1 = GetChosenMovePriority(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk]); + if (gChosenActionByBattler[ctx->battlerDef] == B_ACTION_USE_MOVE) + priority2 = GetChosenMovePriority(ctx->battlerDef, ctx->abilities[ctx->battlerDef]); } return GetWhichBattlerFasterArgs( - battler1, battler2, + ctx, ignoreChosenMoves, - ability1, ability2, - holdEffectBattler1, holdEffectBattler2, - speedBattler1, speedBattler2, - priority1, priority2 - ); + speedBattler1, + speedBattler2, + priority1, + priority2); } // 24 == MAX_BATTLERS_COUNT!. @@ -5008,13 +5002,13 @@ static const u8 sBattlerOrders[24][4] = { 3, 2, 1, 0 }, }; -s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves) +s32 GetWhichBattlerFaster(struct BattleContext *ctx, bool32 ignoreChosenMoves) { - s32 strikesFirst = GetWhichBattlerFasterOrTies(battler1, battler2, ignoreChosenMoves); + s32 strikesFirst = GetWhichBattlerFasterOrTies(ctx, ignoreChosenMoves); if (strikesFirst == 0) { - s32 order1 = sBattlerOrders[gBattleStruct->speedTieBreaks][battler1]; - s32 order2 = sBattlerOrders[gBattleStruct->speedTieBreaks][battler2]; + s32 order1 = sBattlerOrders[gBattleStruct->speedTieBreaks][ctx->battlerAtk]; + s32 order2 = sBattlerOrders[gBattleStruct->speedTieBreaks][ctx->battlerDef]; if (order1 < order2) strikesFirst = 1; else @@ -5108,13 +5102,19 @@ static void SetActionsAndBattlersTurnOrder(void) turnOrderId++; } } + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) + { + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - u8 battler1 = gBattlerByTurnOrder[i]; - u8 battler2 = gBattlerByTurnOrder[j]; - TryChangingTurnOrderEffects(battler1, battler2, quickClawRandom, quickDrawRandom); + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; + TryChangingTurnOrderEffects(&ctx, quickClawRandom, quickDrawRandom); if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH @@ -5122,7 +5122,7 @@ static void SetActionsAndBattlersTurnOrder(void) && gActionsByTurnOrder[i] != B_ACTION_THROW_BALL && gActionsByTurnOrder[j] != B_ACTION_THROW_BALL) { - if (GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) + if (GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); } } @@ -5270,29 +5270,38 @@ static bool32 TryDoMoveEffectsBeforeMoves(void) static void TryChangeTurnOrder(void) { u32 i, j; + + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) + { + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - u32 battler1 = gBattlerByTurnOrder[i]; - u32 battler2 = gBattlerByTurnOrder[j]; + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; if (gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE) { - if (GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) + if (GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); } } } } -static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) +static void TryChangingTurnOrderEffects(struct BattleContext *ctx, u32 *quickClawRandom, u32 *quickDrawRandom) { - enum Ability ability1 = GetBattlerAbility(battler1); - enum HoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); - enum HoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); - enum Ability ability2 = GetBattlerAbility(battler2); + u32 battler1 = ctx->battlerAtk; + u32 battler2 = ctx->battlerDef; + enum Ability ability1 = ctx->abilities[ctx->battlerAtk]; + enum Ability ability2 = ctx->abilities[ctx->battlerDef]; + enum HoldEffect holdEffectBattler1 = ctx->holdEffects[ctx->battlerAtk]; + enum HoldEffect holdEffectBattler2 = ctx->holdEffects[ctx->battlerDef]; // Battler 1 // Quick Draw diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f99fafcf3f..8b6e331424 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15563,13 +15563,22 @@ void BS_TryQuash(void) // If the above condition is not true, it means we are faster than the foe, so we can set the quash bit gProtectStructs[gBattlerTarget].quash = TRUE; + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) + { + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } // this implementation assumes turn order is correct when using Quash i = GetBattlerTurnOrderNum(gBattlerTarget); for (j = i + 1; j < gBattlersCount; j++) { + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; + // Gen 7- config makes target go last so that the order of quash targets is kept for the correct turn order // Gen 8+ config alters Turn Order of the target according to speed, dynamic speed should handle the rest - if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], FALSE) == -1) + if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); else break; diff --git a/src/battle_util.c b/src/battle_util.c index 3c83a80cab..2bb0c032e9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -953,27 +953,34 @@ void HandleAction_ActionFinished(void) { // i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already // taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action + + struct BattleContext ctx = {0}; + for (i = 0; i < gBattlersCount; i++) + { + ctx.abilities[i] = GetBattlerAbility(i); + ctx.holdEffects[i] = GetBattlerHoldEffect(i); + } for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - u32 battler1 = gBattlerByTurnOrder[i]; - u32 battler2 = gBattlerByTurnOrder[j]; + ctx.battlerAtk = gBattlerByTurnOrder[i]; + ctx.battlerDef = gBattlerByTurnOrder[j]; - if (gProtectStructs[battler1].quash || gProtectStructs[battler2].quash - || gProtectStructs[battler1].shellTrap || gProtectStructs[battler2].shellTrap) + if (gProtectStructs[ctx.battlerAtk].quash || gProtectStructs[ctx.battlerDef].quash + || gProtectStructs[ctx.battlerAtk].shellTrap || gProtectStructs[ctx.battlerDef].shellTrap) continue; // We recalculate order only for action of the same priority. If any action other than switch/move has been taken, they should // have been executed before. The only recalculation needed is for moves/switch. Mega evolution is handled in src/battle_main.c/TryChangeOrder if ((gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE)) { - if (GetWhichBattlerFaster(battler1, battler2, FALSE) == -1) + if (GetWhichBattlerFaster(&ctx, FALSE) == -1) SwapTurnOrder(i, j); } else if ((gActionsByTurnOrder[i] == B_ACTION_SWITCH && gActionsByTurnOrder[j] == B_ACTION_SWITCH)) { - if (GetWhichBattlerFaster(battler1, battler2, TRUE) == -1) // If the actions chosen are switching, we recalc order but ignoring the moves + if (GetWhichBattlerFaster(&ctx, TRUE) == -1) // If the actions chosen are switching, we recalc order but ignoring the moves SwapTurnOrder(i, j); } } @@ -6948,21 +6955,21 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower += (CountBattlerStatIncreases(battlerAtk, TRUE) * 20); break; case EFFECT_ELECTRO_BALL: - speed = GetBattlerTotalSpeedStat(battlerAtk) / GetBattlerTotalSpeedStat(battlerDef); + speed = GetBattlerTotalSpeedStat(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk) / GetBattlerTotalSpeedStat(battlerDef, ctx->abilityDef, ctx->holdEffectDef); if (speed >= ARRAY_COUNT(sSpeedDiffPowerTable)) speed = ARRAY_COUNT(sSpeedDiffPowerTable) - 1; basePower = sSpeedDiffPowerTable[speed]; break; case EFFECT_GYRO_BALL: { - u32 attackerSpeed = GetBattlerTotalSpeedStat(battlerAtk); + u32 attackerSpeed = GetBattlerTotalSpeedStat(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk); if (attackerSpeed == 0) { basePower = 1; } else { - basePower = ((25 * GetBattlerTotalSpeedStat(battlerDef)) / attackerSpeed) + 1; + basePower = ((25 * GetBattlerTotalSpeedStat(battlerDef, ctx->abilityDef, ctx->holdEffectDef)) / attackerSpeed) + 1; if (basePower > 150) basePower = 150; } @@ -9511,7 +9518,10 @@ void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast) u16 speeds[MAX_BATTLERS_COUNT] = {0}; for (i = 0; i < gBattlersCount; i++) - speeds[i] = GetBattlerTotalSpeedStat(battlers[i]); + { + u32 battler = battlers[i]; + speeds[i] = GetBattlerTotalSpeedStat(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)); + } for (i = 1; i < gBattlersCount; i++) { From a5b69a4daf68b5fb96aa7466198f276cc182461f Mon Sep 17 00:00:00 2001 From: Estellar <137097857+estellarc@users.noreply.github.com> Date: Sat, 18 Oct 2025 13:57:33 -0300 Subject: [PATCH 082/183] Give the Coin Case when coins are maxed (#7973) --- src/debug.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/debug.c b/src/debug.c index 5779401735..a093bedcf9 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3041,6 +3041,9 @@ static void DebugAction_Give_MaxMoney(u8 taskId) static void DebugAction_Give_MaxCoins(u8 taskId) { SetCoins(MAX_COINS); + + if (!CheckBagHasItem(ITEM_COIN_CASE, 1)) + AddBagItem(ITEM_COIN_CASE, 1); } static void DebugAction_Give_MaxBattlePoints(u8 taskId) From cb0d503f66b2d53fb7e173b0ba291af3caa3544d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 19 Oct 2025 16:40:13 +0200 Subject: [PATCH 083/183] Decouple passive hp updates from move damage updates (#7942) --- asm/macros/battle_script.inc | 13 +- data/battle_scripts_1.s | 337 +++++------ data/battle_scripts_2.s | 5 +- include/battle.h | 22 +- include/battle_util.h | 1 + include/constants/battle.h | 5 +- include/constants/battle_script_commands.h | 6 + src/battle_ai_util.c | 4 +- src/battle_end_turn.c | 100 ++-- src/battle_hold_effects.c | 74 +-- src/battle_main.c | 2 - src/battle_script_commands.c | 615 ++++++++++----------- src/battle_util.c | 60 +- src/battle_z_move.c | 2 +- 14 files changed, 550 insertions(+), 696 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c0f5bd4db5..9170ffc85d 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -45,14 +45,16 @@ .byte 0xa .endm - .macro healthbarupdate battler:req + .macro healthbarupdate battler:req updateState:req .byte 0xb .byte \battler + .byte \updateState .endm - .macro datahpupdate battler:req + .macro datahpupdate battler:req updateState:req .byte 0xc .byte \battler + .byte \updateState .endm .macro critmessage @@ -358,9 +360,8 @@ .byte 0x3a .endm - .macro absorbhealthbarupdate battler:req + .macro isdmgblockedbydisguise .byte 0x3b - .byte \battler .endm .macro return @@ -759,7 +760,7 @@ callnative BS_RemoveStockpileCounters .endm - .macro setdrainedhp + .macro unused_0x88 .byte 0x88 .endm @@ -1293,7 +1294,7 @@ .byte 0xf3 .endm - .macro subattackerhpbydmg + .macro unused_0xf4 .byte 0xf4 .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b5dadafa0a..94ad23d029 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -136,11 +136,10 @@ BattleScript_EffectShedTail:: jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed setsubstitute jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString - orword gHitMarker, HITMARKER_PASSIVE_HP_UPDATE attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_SHEDITSTAIL waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_ATTACKER_VISIBLE @@ -159,7 +158,6 @@ BattleScript_EffectFilletAway:: jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_ButItFailed BattleScript_FilletAwayTryAttack:: halvehp BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE attackanimation waitanimation setstatchanger STAT_ATK, 2, FALSE @@ -178,8 +176,8 @@ BattleScript_FilletAwayTrySpeed:: waitmessage B_WAIT_TIME_LONG BattleScript_FilletAwayEnd:: clearmoveresultflags MOVE_RESULT_NO_EFFECT - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE goto BattleScript_MoveEnd BattleScript_EffectDoodle:: @@ -381,20 +379,13 @@ BattleScript_MoveEffectSaltCure:: BattleScript_SaltCureExtraDamage:: playanimation BS_ATTACKER, B_ANIM_SALT_CURE_DAMAGE, NULL waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_TARGETISHURTBYSALTCURE waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER end2 -BattleScript_HurtTarget_NoString: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - return - BattleScript_EffectCorrosiveGas:: attackcanceler accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE @@ -508,10 +499,8 @@ BattleScript_TeatimeLoop: jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_Teatimesorb jumpifelectricabilityaffected BS_TARGET, ABILITY_MOTOR_DRIVE, BattleScript_Teatimemotor jumpifteainvulnerable BS_TARGET, BattleScript_Teatimevul @ in semi-invulnerable state OR held item is not a Berry - orword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems - bicword gHitMarker, HITMARKER_DISABLE_ANIMATION | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE setbyte sBERRY_OVERRIDE, FALSE removeitem BS_TARGET moveendto MOVEEND_NEXT_TARGET @@ -526,8 +515,8 @@ BattleScript_Teatimevul: BattleScript_Teatimesorb: call BattleScript_AbilityPopUpTarget tryhealquarterhealth BS_TARGET, BattleScript_Teatimesorb_end - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_Teatimesorb_end: @@ -701,8 +690,8 @@ BattleScript_EffectFling:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_MED resultmessage @@ -780,11 +769,10 @@ BattleScript_FlingMissed: BattleScript_EffectClangorousSoul:: attackcanceler cutonethirdhpandraisestats BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_BIDE | HITMARKER_PASSIVE_HP_UPDATE attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE call BattleScript_AllStatsUp goto BattleScript_MoveEnd @@ -972,9 +960,8 @@ BattleScript_EffectJungleHealing:: JungleHealing_RestoreTargetHealth: copybyte gBattlerAttacker, gBattlerTarget tryhealquarterhealth BS_TARGET, BattleScript_JungleHealing_TryCureStatus - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_JungleHealing_TryCureStatus: @@ -1015,10 +1002,9 @@ BattleScript_EffectLifeDewCheckPartner: setallytonexttarget BattleScript_EffectLifeDewNextTarget BattleScript_EffectLifeDewHealing: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE tryhealquarterhealth BS_TARGET, BattleScript_EffectLifeDewEnd - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG return @@ -1108,10 +1094,9 @@ BattleScript_StrengthSapHp: jumpiffullhp BS_ATTACKER, BattleScript_MoveEnd BattleScript_StrengthSapManipulateDmg: manipulatedamage DMG_BIG_ROOT - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_StrengthSapLiquidOoze - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNENERGYDRAINED waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -1119,8 +1104,8 @@ BattleScript_StrengthSapLiquidOoze: call BattleScript_AbilityPopUpTarget manipulatedamage DMG_CHANGE_SIGN setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB_OOZE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -1477,9 +1462,8 @@ BattleScript_EffectAfterYou:: BattleScript_MoveEffectFlameBurst:: printstring STRINGID_BURSTINGFLAMESHIT waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE tryfaintmon BS_SCRIPTING return @@ -1612,8 +1596,8 @@ BattleScript_AutotomizeWeightLoss:: BattleScript_FinalGambit:: setatkhptozero - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return @@ -2024,8 +2008,8 @@ BattleScript_EffectHealPulse:: tryhealpulse BattleScript_AlreadyAtFullHp attackanimation waitanimation - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -2125,8 +2109,8 @@ BattleScript_EffectHealingWishRestore: waitanimation dmgtomaxattackerhp manipulatedamage DMG_CHANGE_SIGN - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE clearstatus waitstate updatestatusicon BS_ATTACKER @@ -2479,8 +2463,8 @@ BattleScript_Hit_RetFromAtkAnimation:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_LONG resultmessage @@ -2610,12 +2594,11 @@ BattleScript_EffectAbsorbLiquidOoze:: goto BattleScript_EffectAbsorb BattleScript_EffectAbsorb:: - absorbhealthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER - bicword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_PASSIVE_HP_UPDATE return BattleScript_EffectExplosion:: @@ -2632,9 +2615,8 @@ BattleScript_FaintAttackerForExplosion:: return BattleScript_MaxHp50Recoil:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return @@ -2841,9 +2823,8 @@ BattleScript_EffectRestoreHp:: attackanimation waitanimation BattleScript_RestoreHp: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -2918,9 +2899,8 @@ BattleScript_RecoilIfMiss:: printstring STRINGID_PKMNCRASHED waitmessage B_WAIT_TIME_LONG jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return @@ -3158,11 +3138,10 @@ BattleScript_EffectSubstitute:: jumpifvolatile BS_ATTACKER, VOLATILE_SUBSTITUTE, BattleScript_AlreadyHasSubstitute setsubstitute jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString - orword gHitMarker, HITMARKER_PASSIVE_HP_UPDATE attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE BattleScript_SubstituteString:: pause B_WAIT_TIME_SHORT printfromtable gSubstituteUsedStringIds @@ -3282,11 +3261,10 @@ BattleScript_EffectPainSplit:: painsplitdmgcalc BattleScript_ButItFailed attackanimation waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_SHAREDPAIN waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -3462,12 +3440,11 @@ BattleScript_DoGhostCurse:: attackcanceler accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON cursetarget BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE setbyte sB_ANIM_TURN, 0 attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNLAIDCURSE waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -3758,11 +3735,10 @@ BattleScript_EffectBellyDrum:: attackcanceler jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed halvehp BattleScript_ButItFailed - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE attackanimation waitanimation - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE setstatchanger STAT_ATK, MAX_STAT_STAGE, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd printstring STRINGID_PKMNCUTHPMAXEDATTACK @@ -3834,8 +3810,8 @@ BattleScript_BeatUpAttack:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_LONG resultmessage @@ -3863,9 +3839,8 @@ BattleScript_EffectSoftboiled:: BattleScript_PresentHealTarget:: attackanimation waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -3974,9 +3949,8 @@ BattleScript_EffectSwallow:: stockpiletohpheal BattleScript_ButItFailed attackanimation waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG removestockpilecounters @@ -4216,8 +4190,8 @@ BattleScript_BrickBreakDoHit:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_LONG resultmessage @@ -4903,8 +4877,8 @@ BattleScript_FogEnded_Ret:: BattleScript_IceBodyHeal:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_SIMPLE_HEAL - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_ICEBODYHPGAIN waitmessage B_WAIT_TIME_LONG end2 @@ -5031,9 +5005,8 @@ BattleScript_LeechSeedTurnDrainHealBlock:: BattleScript_LeechSeedTurnDrainRecovery:: call BattleScript_LeechSeedTurnDrain BattleScript_LeechSeedTurnDrainGainHp: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printfromtable gLeechSeedStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET @@ -5041,8 +5014,8 @@ BattleScript_LeechSeedTurnDrainGainHp: BattleScript_LeechSeedTurnDrain: playanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1 - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return @@ -5067,8 +5040,8 @@ BattleScript_BideAttack:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_TARGET @@ -5216,16 +5189,14 @@ BattleScript_EncoredNoMore:: BattleScript_DestinyBondTakesLife:: printstring STRINGID_PKMNTOOKFOE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER return BattleScript_DmgHazardsOnAttacker:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_ATTACKER tryfaintmon_spikes BS_ATTACKER, BattleScript_DmgHazardsOnAttackerFainted @@ -5238,9 +5209,8 @@ BattleScript_DmgHazardsOnAttackerFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnTarget:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_TARGET tryfaintmon_spikes BS_TARGET, BattleScript_DmgHazardsOnTargetFainted @@ -5253,9 +5223,8 @@ BattleScript_DmgHazardsOnTargetFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnBattlerScripting:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_SCRIPTING tryfaintmon_spikes BS_SCRIPTING, BattleScript_DmgHazardsOnBattlerScriptingFainted @@ -5268,9 +5237,8 @@ BattleScript_DmgHazardsOnBattlerScriptingFainted:: goto BattleScript_HandleFaintedMon BattleScript_DmgHazardsOnFaintedBattler:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_FAINTED - datahpupdate BS_FAINTED + healthbarupdate BS_FAINTED, PASSIVE_HP_UPDATE + datahpupdate BS_FAINTED, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_FAINTED tryfaintmon_spikes BS_FAINTED, BattleScript_DmgHazardsOnFaintedBattlerFainted @@ -5329,9 +5297,8 @@ BattleScript_StickyWebOnSwitchInEnd: BattleScript_PerishSongTakesLife:: printstring STRINGID_PKMNPERISHCOUNTFELL waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER end2 @@ -5339,20 +5306,18 @@ BattleScript_PerishBodyActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSWILLPERISHIN3TURNS waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE return BattleScript_GulpMissileGorging:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE effectivenesssound hitanimation BS_ATTACKER waitstate jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_GulpMissileNoDmgGorging - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER jumpiffainted BS_ATTACKER, TRUE, BattleScript_GulpMissileNoSecondEffectGorging BattleScript_GulpMissileNoDmgGorging: @@ -5373,13 +5338,12 @@ BattleScript_GulpMissileGulping:: call BattleScript_AbilityPopUp playanimation BS_ATTACKER, B_ANIM_GULP_MISSILE waitanimation - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE effectivenesssound hitanimation BS_ATTACKER waitstate jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_GulpMissileNoDmgGulping - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER jumpiffainted BS_ATTACKER, TRUE, BattleScript_GulpMissileNoSecondEffectGulping BattleScript_GulpMissileNoDmgGulping: @@ -5462,9 +5426,8 @@ BattleScript_EarthEaterActivates:: call BattleScript_AbilityPopUp pause B_WAIT_TIME_LONG tryhealquarterhealth BS_TARGET, BattleScript_EarthEaterRet - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_EarthEaterRet: @@ -5559,8 +5522,8 @@ BattleScript_DoFutureAttackHit:: effectivenesssound hitanimation BS_TARGET waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE + datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE critmessage waitmessage B_WAIT_TIME_LONG BattleScript_DoFutureAttackResult: @@ -5707,9 +5670,8 @@ BattleScript_WishComesTrue:: playanimation BS_TARGET, B_ANIM_WISH_HEAL printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG end2 @@ -5735,9 +5697,8 @@ BattleScript_IngrainTurnHeal:: printstring STRINGID_PKMNABSORBEDNUTRIENTS BattleScript_TurnHeal: waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE end2 BattleScript_AquaRingHeal:: @@ -6019,9 +5980,8 @@ BattleScript_CudChewActivates:: BattleScript_ApplyDisguiseFormChangeHPLoss:: jumpifgenconfiglowerthan GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn - orword gHitMarker, HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE BattleScript_ApplyDisguiseFormChangeHPLossReturn: return @@ -6110,9 +6070,8 @@ BattleScript_AftermathDmg:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpScripting jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_AftermathDmgRet - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_AFTERMATHDMG waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -6153,9 +6112,8 @@ BattleScript_PoisonTurnDmg:: BattleScript_DoStatusTurnDmg:: statusanimation BS_ATTACKER BattleScript_DoTurnDmg: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd tryactivateitem BS_ATTACKER, ON_ITEM_HP_THRESHOLD @@ -6168,9 +6126,8 @@ BattleScript_PoisonHealActivates:: printstring STRINGID_POISONHEALHPUP waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE end2 BattleScript_BurnTurnDmg:: @@ -6279,9 +6236,9 @@ BattleScript_DoSelfConfusionDmg:: effectivenesssound hitanimation BS_ATTACKER waitstate - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + isdmgblockedbydisguise + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE resultmessage waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -6297,9 +6254,8 @@ BattleScript_MoveUsedPowder:: effectivenesssound hitanimation BS_ATTACKER waitstate - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_POWDEREXPLODES waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -6487,9 +6443,8 @@ BattleScript_MoveEffectRecoil:: jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd BattleScript_DoRecoil:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNHITWITHRECOIL waitmessage B_WAIT_TIME_LONG tryupdaterecoiltracker @@ -6668,9 +6623,8 @@ BattleScript_AbilityHpHeal: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXRESTOREDHPALITTLE2 waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE return BattleScript_RainDishActivates:: @@ -6705,10 +6659,9 @@ BattleScript_HarvestActivatesEnd: end2 BattleScript_SolarPowerActivates:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE call BattleScript_AbilityPopUp - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_SOLARPOWERHPDROP waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -6992,10 +6945,9 @@ BattleScript_HospitalityActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HOSPITALITYRESTORATION waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE playanimation BS_EFFECT_BATTLER, B_ANIM_SIMPLE_HEAL - healthbarupdate BS_EFFECT_BATTLER - datahpupdate BS_EFFECT_BATTLER + healthbarupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE + datahpupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE end3 BattleScript_AttackWeakenedByStrongWinds:: @@ -7097,9 +7049,8 @@ BattleScript_BadDreams_DmgAfterPopUp: printstring STRINGID_BADDREAMSDMG waitmessage B_WAIT_TIME_LONG dmg_1_8_targethp - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE jumpifhasnohp BS_TARGET, BattleScript_BadDreams_HidePopUp BattleScript_BadDreamsIncrement: addbyte gBattlerTarget, 1 @@ -7144,9 +7095,8 @@ BattleScript_DampStopsExplosion:: BattleScript_MoveHPDrain:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNRESTOREDHPUSING waitmessage B_WAIT_TIME_LONG setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE @@ -7257,10 +7207,8 @@ BattleScript_MoveUsedPsychicTerrainPrevents:: BattleScript_GrassyTerrainHeals:: printstring STRINGID_GRASSYTERRAINHEALS waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE end2 BattleScript_AbilityNoSpecificStatLoss:: @@ -7505,9 +7453,8 @@ BattleScript_ImposterActivates:: end3 BattleScript_HurtAttacker: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNHURTSWITH waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -7529,10 +7476,9 @@ BattleScript_RockyHelmetActivatesDmg: BattleScript_SpikyShieldEffect:: jumpifabsent BS_ATTACKER, BattleScript_SpikyShieldRet - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE clearmoveresultflags MOVE_RESULT_NO_EFFECT - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_PKMNHURTSWITH waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -7541,7 +7487,6 @@ BattleScript_SpikyShieldRet:: return BattleScript_KingsShieldEffect:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE clearmoveresultflags MOVE_RESULT_NO_EFFECT seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_NONE copybyte sBATTLER, gBattlerTarget @@ -7551,7 +7496,6 @@ BattleScript_KingsShieldEffect:: return BattleScript_BanefulBunkerEffect:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE clearmoveresultflags MOVE_RESULT_NO_EFFECT setnonvolatilestatus TRIGGER_ON_PROTECT setmoveresultflags MOVE_RESULT_MISSED @@ -7775,9 +7719,8 @@ BattleScript_ItemHealHP_RemoveItemRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE removeitem BS_SCRIPTING return @@ -7790,9 +7733,8 @@ BattleScript_ItemHealHP_RemoveItemEnd2_Anim: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE removeitem BS_ATTACKER end2 @@ -7833,9 +7775,8 @@ BattleScript_AirBaloonMsgPop:: return BattleScript_ItemHurtRet:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE printstring STRINGID_HURTBYITEM waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER @@ -7851,9 +7792,8 @@ BattleScript_ItemHealHP_Ret:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHPALITTLE waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER + healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE + datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE return BattleScript_SelectingNotAllowedMoveChoiceItem:: @@ -7906,9 +7846,8 @@ BattleScript_BerryConfuseHealEnd2_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION removeitem BS_SCRIPTING end2 @@ -7922,9 +7861,8 @@ BattleScript_BerryConfuseHealRet_Anim: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMRESTOREDHEALTH waitmessage B_WAIT_TIME_LONG - orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION removeitem BS_SCRIPTING return @@ -8268,8 +8206,8 @@ BattleScript_ZEffectPrintString:: return BattleScript_RecoverHPZMove:: - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG return @@ -8288,8 +8226,8 @@ BattleScript_HealReplacementZMove:: playanimation BS_SCRIPTING, B_ANIM_WISH_HEAL, 0x0 printfromtable gZEffectStringIds waitmessage B_WAIT_TIME_LONG - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE return BattleScript_EffectExtremeEvoboost:: @@ -8759,9 +8697,8 @@ BattleScript_EffectHealOneSixthAllies:: BattleScript_HealOneSixthAlliesLoop: jumpifabsent BS_TARGET, BattleScript_HealOneSixthAlliesIncrement tryhealsixthhealth BattleScript_HealOneSixthAlliesIncrement - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_TARGET - datahpupdate BS_TARGET + healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE + datahpupdate BS_TARGET, PASSIVE_HP_UPDATE printstring STRINGID_PKMNREGAINEDHEALTH waitmessage B_WAIT_TIME_LONG BattleScript_HealOneSixthAlliesIncrement: diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index 586a79c5ef..57c5e752e4 100755 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -49,9 +49,8 @@ BattleScript_UseItemMessage: BattleScript_ItemRestoreHPRet: clearmoveresultflags MOVE_RESULT_NO_EFFECT - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE - healthbarupdate BS_SCRIPTING - datahpupdate BS_SCRIPTING + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE printstring STRINGID_ITEMRESTOREDSPECIESHEALTH waitmessage B_WAIT_TIME_LONG return diff --git a/include/battle.h b/include/battle.h index 74e9f1c611..1888c249de 100644 --- a/include/battle.h +++ b/include/battle.h @@ -761,6 +761,7 @@ struct BattleStruct u8 pursuitStoredSwitch; // Stored id for the Pursuit target's switch s32 battlerExpReward; u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn + s16 passiveHpUpdate[MAX_BATTLERS_COUNT]; // non-move damage and healing s16 moveDamage[MAX_BATTLERS_COUNT]; s16 critChance[MAX_BATTLERS_COUNT]; u16 moveResultFlags[MAX_BATTLERS_COUNT]; @@ -772,15 +773,14 @@ struct BattleStruct u8 printedStrongWindsWeakenedAttack:1; u8 numSpreadTargets:2; u8 noTargetPresent:1; - u8 cheekPouchActivated:1; - s16 savedcheekPouchDamage; // Cheek Pouch can happen in the middle of an attack execution so we need to store the current dmg + u8 padding1:1; struct MessageStatus slideMessageStatus; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; u8 hazardsQueue[NUM_BATTLE_SIDES][HAZARDS_MAX_COUNT]; u8 numHazards[NUM_BATTLE_SIDES]; u8 hazardsCounter:4; // Counter for applying hazard on switch in enum SubmoveState submoveAnnouncement:2; - u8 padding1:2; + u8 padding2:2; }; struct AiBattleData @@ -1234,7 +1234,7 @@ static inline bool32 IsSpreadMove(u32 moveTarget) static inline bool32 IsDoubleSpreadMove(void) { return gBattleStruct->numSpreadTargets > 1 - && !(gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_UNABLE_TO_USE_MOVE)) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove)); } @@ -1250,4 +1250,18 @@ static inline u32 GetChosenMoveFromPosition(u32 battler) return gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; } +static inline void SetPassiveDamageAmount(u32 battler, s32 value) +{ + if (value == 0) + value = 1; + gBattleStruct->passiveHpUpdate[battler] = value; +} + +static inline void SetHealAmount(u32 battler, s32 value) +{ + if (value == 0) + value = 1; + gBattleStruct->passiveHpUpdate[battler] = -1 * value; +} + #endif // GUARD_BATTLE_H diff --git a/include/battle_util.h b/include/battle_util.h index aed03afae1..7dc639c300 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -421,5 +421,6 @@ void RemoveAbilityFlags(u32 battler); bool32 IsDazzlingAbility(enum Ability ability); bool32 IsAllowedToUseBag(void); bool32 IsAnyTargetTurnDamaged(u32 battlerAtk); +bool32 IsMimikyuDisguised(u32 battler); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 775546c5c6..b47b1a99da 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -237,10 +237,9 @@ enum SemiInvulnerableExclusion EXCLUDE_COMMANDER, }; -#define HITMARKER_IGNORE_BIDE (1 << 5) #define HITMARKER_DESTINYBOND (1 << 6) #define HITMARKER_NO_ANIMATIONS (1 << 7) // set from battleSceneOff. Never changed during battle -#define HITMARKER_IGNORE_SUBSTITUTE (1 << 8) +#define HITMARKER_UNUSED_8 (1 << 8) #define HITMARKER_ATTACKSTRING_PRINTED (1 << 9) #define HITMARKER_UNUSED_10 (1 << 10) #define HITMARKER_UNUSED_11 (1 << 11) @@ -252,7 +251,7 @@ enum SemiInvulnerableExclusion #define HITMARKER_DISABLE_ANIMATION (1 << 17) // disable animations during battle scripts, e.g. for Bug Bite #define HITMARKER_UNUSED_18 (1 << 18) #define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) -#define HITMARKER_PASSIVE_HP_UPDATE (1 << 20) +#define HITMARKER_UNUSED_20 (1 << 20) #define HITMARKER_UNUSED_21 (1 << 21) #define HITMARKER_PLAYER_FAINTED (1 << 22) #define HITMARKER_UNUSED_23 (1 << 23) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 8d8517df7f..0c53134ce9 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -200,4 +200,10 @@ enum TriggerOnFieldStatus ON_WEATHER, }; +enum HealthUpdate +{ + PASSIVE_HP_UPDATE, + MOVE_DAMAGE_HP_UPDATE, +}; + #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c735913af3..d34040ffc8 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1423,7 +1423,7 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) { if (B_STURDY >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) return TRUE; - if (gBattleMons[battlerTarget].species == SPECIES_MIMIKYU_DISGUISED) + if (IsMimikyuDisguised(battlerTarget)) return TRUE; } @@ -5184,7 +5184,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) if (gBattleMons[battlerDef].ability == ABILITY_DISGUISE && !MoveIgnoresTargetAbility(zMove) - && (gBattleMons[battlerDef].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battlerDef].species == SPECIES_MIMIKYU_TOTEM_DISGUISED)) + && IsMimikyuDisguised(battlerDef)) return FALSE; // Don't waste a Z-Move busting disguise if (gBattleMons[battlerDef].ability == ABILITY_ICE_FACE && !MoveIgnoresTargetAbility(zMove) diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 6dc762e5c7..842a69078c 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -236,9 +236,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; BattleScriptExecute(BattleScript_DamagingWeather); effect = TRUE; @@ -261,9 +259,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; BattleScriptExecute(BattleScript_DamagingWeather); effect = TRUE; @@ -378,21 +374,22 @@ static bool32 HandleEndTurnWish(u32 battler) if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler)) { + s32 wishHeal = 0; gBattlerTarget = battler; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gWishFutureKnock.wishPartyId[battler]) if (B_WISH_HP_SOURCE >= GEN_5) { if (IsOnPlayerSide(battler)) - gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2); + wishHeal = GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2; else - gBattleStruct->moveDamage[battler] = max(1, GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2); + wishHeal = GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2; } else { - gBattleStruct->moveDamage[battler] = max(1, GetNonDynamaxMaxHP(battler) / 2); + wishHeal = GetNonDynamaxMaxHP(battler) / 2; } - gBattleStruct->moveDamage[battler] *= -1; + SetHealAmount(battler, wishHeal); if (gBattleMons[battler].volatiles.healBlock) BattleScriptExecute(BattleScript_WishButHealBlocked); else if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) @@ -427,8 +424,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) if (!IS_BATTLER_OF_TYPE(battler, gSideTimers[side].damageNonTypesType) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattlerAttacker = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 6; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 6); ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType); BattleScriptExecute(BattleScript_DamageNonTypesContinues); effect = TRUE; @@ -440,7 +436,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) { gBattlerAttacker = battler; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, FALSE, STATUS1_BURN); MarkBattlerForControllerExec(battler); BattleScriptExecute(BattleScript_HurtByTheSeaOfFire); @@ -478,10 +474,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) && !IsSemiInvulnerable(battler, CHECK_ALL) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) { - gBattlerAttacker = battler; - gBattleStruct->moveDamage[battler] = -(GetNonDynamaxMaxHP(battler) / 16); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = -1; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16); BattleScriptExecute(BattleScript_GrassyTerrainHeals); effect = TRUE; } @@ -526,7 +519,7 @@ static bool32 HandleEndTurnAquaRing(u32 battler) && !IsBattlerAtMaxHp(battler) && IsBattlerAlive(battler)) { - gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + SetHealAmount(battler, GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16)); BattleScriptExecute(BattleScript_AquaRingHeal); effect = TRUE; } @@ -545,7 +538,7 @@ static bool32 HandleEndTurnIngrain(u32 battler) && !IsBattlerAtMaxHp(battler) && IsBattlerAlive(battler)) { - gBattleStruct->moveDamage[battler] = GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16); + SetHealAmount(battler, GetDrainedBigRootHp(battler, GetNonDynamaxMaxHP(battler) / 16)); BattleScriptExecute(BattleScript_IngrainTurnHeal); effect = TRUE; } @@ -567,12 +560,12 @@ static bool32 HandleEndTurnLeechSeed(u32 battler) gBattlerTarget = gBattleMons[battler].volatiles.leechSeed - 1; // leech seed receiver gBattleScripting.animArg1 = gBattlerTarget; gBattleScripting.animArg2 = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(battler) / 8); - gBattleStruct->moveDamage[gBattlerTarget] = GetDrainedBigRootHp(gBattlerTarget, gBattleStruct->moveDamage[gBattlerAttacker]); - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE; + s32 drainAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; + s32 healAmount = GetDrainedBigRootHp(gBattlerTarget, drainAmount); if (GetBattlerAbility(battler) == ABILITY_LIQUID_OOZE) { - gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * -1; + SetPassiveDamageAmount(gBattlerAttacker, drainAmount); + SetPassiveDamageAmount(gBattlerTarget, healAmount); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE; BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze); } @@ -582,6 +575,8 @@ static bool32 HandleEndTurnLeechSeed(u32 battler) } else { + SetPassiveDamageAmount(gBattlerAttacker, drainAmount); + SetHealAmount(gBattlerTarget, healAmount); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_DRAIN; BattleScriptExecute(BattleScript_LeechSeedTurnDrainRecovery); } @@ -607,30 +602,23 @@ static bool32 HandleEndTurnPoison(u32 battler) { if (!IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BattleScriptExecute(BattleScript_PoisonHealActivates); effect = TRUE; } } else if (gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 16); if ((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1); - gBattleStruct->moveDamage[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; + gBattleStruct->passiveHpUpdate[battler] *= (gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >> 8; BattleScriptExecute(BattleScript_PoisonTurnDmg); effect = TRUE; } else { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BattleScriptExecute(BattleScript_PoisonTurnDmg); effect = TRUE; } @@ -651,15 +639,14 @@ static bool32 HandleEndTurnBurn(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + s32 burnDamage = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); if (ability == ABILITY_HEATPROOF) { - if (gBattleStruct->moveDamage[battler] > (gBattleStruct->moveDamage[battler] / 2) + 1) // Record ability if the burn takes less damage than it normally would. + if (burnDamage > (burnDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. RecordAbilityBattle(battler, ABILITY_HEATPROOF); - gBattleStruct->moveDamage[battler] /= 2; + burnDamage /= 2; } - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, burnDamage); BattleScriptExecute(BattleScript_BurnTurnDmg); effect = TRUE; } @@ -677,9 +664,7 @@ static bool32 HandleEndTurnFrostbite(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8)); BattleScriptExecute(BattleScript_FrostbiteTurnDmg); effect = TRUE; } @@ -699,9 +684,7 @@ static bool32 HandleEndTurnNightmare(u32 battler) { if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 4); BattleScriptExecute(BattleScript_NightmareTurnDmg); effect = TRUE; } @@ -724,9 +707,7 @@ static bool32 HandleEndTurnCurse(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 4); BattleScriptExecute(BattleScript_CurseTurnDmg); effect = TRUE; } @@ -752,13 +733,12 @@ static bool32 HandleEndTurnWrap(u32 battler) gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); BattleScriptExecute(BattleScript_WrapTurnDmg); + s32 bindDamage = 0; if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler]) == HOLD_EFFECT_BINDING_BAND) - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); + bindDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); - - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + bindDamage = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); + SetPassiveDamageAmount(battler, bindDamage); } else // broke free { @@ -782,12 +762,12 @@ static bool32 HandleEndTurnSaltCure(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { + s32 saltCureDamage = 0; if (IS_BATTLER_ANY_TYPE(battler, TYPE_STEEL, TYPE_WATER)) - gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 4; + saltCureDamage = gBattleMons[battler].maxHP / 4; else - gBattleStruct->moveDamage[battler] = gBattleMons[battler].maxHP / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + saltCureDamage = gBattleMons[battler].maxHP / 8; + SetPassiveDamageAmount(battler, saltCureDamage); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SALT_CURE); BattleScriptExecute(BattleScript_SaltCureExtraDamage); effect = TRUE; @@ -1065,7 +1045,7 @@ static bool32 HandleEndTurnPerishSong(u32 battler) if (gDisableStructs[battler].perishSongTimer == 0) { gBattleMons[battler].volatiles.perishSong = FALSE; - gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; + SetPassiveDamageAmount(battler, gBattleMons[battler].hp); BattleScriptExecute(BattleScript_PerishSongTakesLife); } else @@ -1560,7 +1540,7 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = u32 DoEndTurnEffects(void) { u32 battler = MAX_BATTLERS_COUNT; - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + gHitMarker |= HITMARKER_GRUDGE; for (;;) { @@ -1576,7 +1556,7 @@ u32 DoEndTurnEffects(void) // Jump out if possible after endTurnEventsCounter was increased in the above code block if (gBattleStruct->endTurnEventsCounter == ENDTURN_COUNT) { - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + gHitMarker &= ~HITMARKER_GRUDGE; return FALSE; } diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c index fc8678a613..907350cff5 100644 --- a/src/battle_hold_effects.c +++ b/src/battle_hold_effects.c @@ -266,9 +266,7 @@ static enum ItemEffect TryRockyHelmet(u32 battlerDef, u32 battlerAtk) && !CanBattlerAvoidContactEffects(battlerAtk, battlerDef, ability, GetBattlerHoldEffect(battlerAtk), gCurrentMove) && !IsAbilityAndRecord(battlerAtk, ability, ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 6; - if (gBattleStruct->moveDamage[battlerAtk] == 0) - gBattleStruct->moveDamage[battlerAtk] = 1; + SetPassiveDamageAmount(battlerAtk, GetNonDynamaxMaxHP(battlerAtk) / 6); PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item); BattleScriptCall(BattleScript_RockyHelmetActivates); effect = ITEM_HP_CHANGE; @@ -366,12 +364,10 @@ static enum ItemEffect TryJabocaBerry(u32 battlerDef, u32 battlerAtk) && IsBattleMovePhysical(gCurrentMove) && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 8; - if (gBattleStruct->moveDamage[battlerAtk] == 0) - gBattleStruct->moveDamage[battlerAtk] = 1; + s32 jabocaDamage = GetNonDynamaxMaxHP(battlerAtk) / 8; if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) - gBattleStruct->moveDamage[gBattlerAttacker] *= 2; - + jabocaDamage *= 2; + SetPassiveDamageAmount(battlerAtk, jabocaDamage); BattleScriptCall(BattleScript_JabocaRowapBerryActivates); PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item); effect = ITEM_HP_CHANGE; @@ -390,12 +386,10 @@ static enum ItemEffect TryRowapBerry(u32 battlerDef, u32 battlerAtk) && IsBattleMoveSpecial(gCurrentMove) && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 8; - if (gBattleStruct->moveDamage[battlerAtk] == 0) - gBattleStruct->moveDamage[battlerAtk] = 1; + s32 rowapDamage = GetNonDynamaxMaxHP(battlerAtk) / 8; if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) - gBattleStruct->moveDamage[battlerAtk] *= 2; - + rowapDamage *= 2; + SetPassiveDamageAmount(battlerAtk, rowapDamage); BattleScriptCall(BattleScript_JabocaRowapBerryActivates); PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battlerDef].item); effect = ITEM_HP_CHANGE; @@ -414,10 +408,10 @@ static enum ItemEffect TrySetEnigmaBerry(u32 battlerDef, u32 battlerAtk) && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battlerDef].hp == gBattleMons[battlerDef].maxHP) && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) { - gBattleStruct->moveDamage[battlerDef] = (gBattleMons[battlerDef].maxHP * 25 / 100) * -1; + s32 healAmount = gBattleMons[battlerDef].maxHP * 25 / 100; if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) - gBattleStruct->moveDamage[battlerDef] *= 2; - + healAmount *= 2; + SetHealAmount(battlerDef, healAmount); BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); effect = ITEM_HP_CHANGE; } @@ -560,9 +554,7 @@ static enum ItemEffect TryShellBell(u32 battlerAtk) && !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove) && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerAtk].volatiles.healBlock)) { - gBattleStruct->moveDamage[battlerAtk] = (gBattleScripting.savedDmg / GetBattlerHoldEffectParam(battlerAtk)) * -1; - if (gBattleStruct->moveDamage[battlerAtk] == 0) - gBattleStruct->moveDamage[battlerAtk] = -1; + SetHealAmount(battlerAtk, gBattleScripting.savedDmg / GetBattlerHoldEffectParam(battlerAtk)); BattleScriptCall(BattleScript_ItemHealHP_Ret); effect = ITEM_HP_CHANGE; } @@ -581,10 +573,7 @@ static enum ItemEffect TryLifeOrb(u32 battlerAtk) && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT && !IsFutureSightAttackerInParty(battlerAtk, gBattlerTarget, gCurrentMove)) { - DebugPrintf("move %d", gCurrentMove); - gBattleStruct->moveDamage[battlerAtk] = GetNonDynamaxMaxHP(battlerAtk) / 10; - if (gBattleStruct->moveDamage[battlerAtk] == 0) - gBattleStruct->moveDamage[battlerAtk] = 1; + SetPassiveDamageAmount(battlerAtk, GetNonDynamaxMaxHP(battlerAtk) / 10); BattleScriptCall(BattleScript_ItemHurtRet); effect = ITEM_HP_CHANGE; } @@ -619,9 +608,7 @@ static enum ItemEffect TryStickyBarbOnEndTurn(u32 battler) if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); PREPARE_ITEM_BUFFER(gBattleTextBuff1, gBattleMons[battler].item); BattleScriptExecute(BattleScript_ItemHurtEnd2); effect = ITEM_HP_CHANGE; @@ -667,10 +654,7 @@ static enum ItemEffect TryLeftovers(u32 battler, enum HoldEffect holdEffect) if (gBattleMons[battler].hp < gBattleMons[battler].maxHP && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16); RecordItemEffectBattle(battler, holdEffect); BattleScriptExecute(BattleScript_ItemHealHP_End2); effect = ITEM_HP_CHANGE; @@ -679,15 +663,13 @@ static enum ItemEffect TryLeftovers(u32 battler, enum HoldEffect holdEffect) return effect; } -static enum ItemEffect TryBlackSludge(u32 battler, enum HoldEffect holdEffect) +static enum ItemEffect TryBlackSludgeDamage(u32 battler, enum HoldEffect holdEffect) { enum ItemEffect effect = ITEM_NO_EFFECT; if (!IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); RecordItemEffectBattle(battler, holdEffect); BattleScriptExecute(BattleScript_ItemHurtEnd2); effect = ITEM_HP_CHANGE; @@ -885,14 +867,16 @@ static u32 ItemHealHp(u32 battler, u32 itemId, enum HealAmount percentHeal, Acti && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock) && HasEnoughHpToEatBerry(battler, ability, 2, itemId)) { + s32 healAmount = 0; if (percentHeal == PERCENT_HEAL_AMOUNT) - gBattleStruct->moveDamage[battler] = (GetNonDynamaxMaxHP(battler) * GetItemHoldEffectParam(itemId) / 100) * -1; + healAmount = (GetNonDynamaxMaxHP(battler) * GetItemHoldEffectParam(itemId) / 100); else - gBattleStruct->moveDamage[battler] = GetItemHoldEffectParam(itemId) * -1; + healAmount = GetItemHoldEffectParam(itemId); if (ability == ABILITY_RIPEN && GetItemPocket(itemId) == POCKET_BERRIES) - gBattleStruct->moveDamage[battler] *= 2; + healAmount *= 2; + SetHealAmount(battler, healAmount); if (timing == IsOnSwitchInFirstTurnActivation) BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); else @@ -958,16 +942,10 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, A if (HasEnoughHpToEatBerry(battler, ability, hpFraction, itemId) && !(B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battler].volatiles.healBlock)) { - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); - - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / GetItemHoldEffectParam(itemId); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - + s32 healAmount = GetNonDynamaxMaxHP(battler) / GetItemHoldEffectParam(itemId); if (ability == ABILITY_RIPEN) - gBattleStruct->moveDamage[battler] *= 2; - + healAmount *= 2; + SetHealAmount(battler, healAmount); if (timing == IsOnSwitchInFirstTurnActivation) { if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) @@ -982,7 +960,7 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, A else BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); } - + PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); effect = ITEM_HP_CHANGE; } @@ -1200,7 +1178,7 @@ enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect if (IS_BATTLER_OF_TYPE(itemBattler, TYPE_POISON)) effect = TryLeftovers(itemBattler, holdEffect); else - effect = TryBlackSludge(itemBattler, holdEffect); + effect = TryBlackSludgeDamage(itemBattler, holdEffect); break; case HOLD_EFFECT_CURE_PAR: // Cheri Berry effect = TryCureParalysis(itemBattler, timing); diff --git a/src/battle_main.c b/src/battle_main.c index 62f4b95ca9..cbe58051cb 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4023,7 +4023,6 @@ void BattleTurnPassed(void) gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED; gHitMarker &= ~HITMARKER_PLAYER_FAINTED; - gHitMarker &= ~HITMARKER_PASSIVE_HP_UPDATE; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleScripting.moveendState = 0; @@ -5416,7 +5415,6 @@ static void RunTurnActionsFunctions(void) if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished { - gHitMarker &= ~HITMARKER_PASSIVE_HP_UPDATE; gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; } else diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a690295833..e74265b649 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -333,7 +333,6 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove); static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move); static void ResetValuesForCalledMove(void); -static void TryRestoreDamageAfterCheekPouch(u32 battler); static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd); static bool32 CanAbilityShieldActivateForBattler(u32 battler); @@ -396,7 +395,7 @@ static void Cmd_bichalfword(void); static void Cmd_bicword(void); static void Cmd_pause(void); static void Cmd_waitstate(void); -static void Cmd_absorb(void); +static void Cmd_isdmgblockedbydisguise(void); static void Cmd_return(void); static void Cmd_end(void); static void Cmd_end2(void); @@ -473,7 +472,7 @@ static void Cmd_jumpifuproarwakes(void); static void Cmd_stockpile(void); static void Cmd_stockpiletobasedamage(void); static void Cmd_stockpiletohpheal(void); -static void Cmd_setdrainedhp(void); +static void Cmd_unused_0x88(void); static void Cmd_statbuffchange(void); static void Cmd_normalisebuffs(void); static void Cmd_setbide(void); @@ -581,7 +580,7 @@ static void Cmd_givecaughtmon(void); static void Cmd_trysetcaughtmondexflags(void); static void Cmd_displaydexinfo(void); static void Cmd_trygivecaughtmonnick(void); -static void Cmd_subattackerhpbydmg(void); +static void Cmd_unused_0xf4(void); static void Cmd_removeattackerstatus1(void); static void Cmd_finishaction(void); static void Cmd_finishturn(void); @@ -655,7 +654,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_bicword, //0x38 Cmd_pause, //0x39 Cmd_waitstate, //0x3A - Cmd_absorb, //0x3B + Cmd_isdmgblockedbydisguise, //0x3B Cmd_return, //0x3C Cmd_end, //0x3D Cmd_end2, //0x3E @@ -732,7 +731,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_stockpile, //0x85 Cmd_stockpiletobasedamage, //0x86 Cmd_stockpiletohpheal, //0x87 - Cmd_setdrainedhp, //0x88 + Cmd_unused_0x88, //0x88 Cmd_statbuffchange, //0x89 Cmd_normalisebuffs, //0x8A Cmd_setbide, //0x8B @@ -840,7 +839,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_trysetcaughtmondexflags, //0xF1 Cmd_displaydexinfo, //0xF2 Cmd_trygivecaughtmonnick, //0xF3 - Cmd_subattackerhpbydmg, //0xF4 + Cmd_unused_0xf4, //0xF4 Cmd_removeattackerstatus1, //0xF5 Cmd_finishaction, //0xF6 Cmd_finishturn, //0xF7 @@ -2196,8 +2195,7 @@ static void Cmd_waitanimation(void) static void DoublesHPBarReduction(void) { - if (gBattleStruct->doneDoublesSpreadHit - || gHitMarker & (HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE)) + if (gBattleStruct->doneDoublesSpreadHit) return; for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -2209,12 +2207,10 @@ static void DoublesHPBarReduction(void) || DoesDisguiseBlockMove(battlerDef, gCurrentMove)) continue; - s32 currDmg = gBattleStruct->moveDamage[battlerDef]; - s32 healthValue = min(currDmg, 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign - BtlController_EmitHealthBarUpdate(battlerDef, B_COMM_TO_CONTROLLER, healthValue); + s32 dmgUpdate = min(gBattleStruct->moveDamage[battlerDef], 10000); + BtlController_EmitHealthBarUpdate(battlerDef, B_COMM_TO_CONTROLLER, dmgUpdate); MarkBattlerForControllerExec(battlerDef); - - if (IsOnPlayerSide(battlerDef) && currDmg > 0) + if (IsOnPlayerSide(battlerDef) && dmgUpdate > 0) gBattleResults.playerMonWasDamaged = TRUE; } @@ -2223,176 +2219,199 @@ static void DoublesHPBarReduction(void) static void Cmd_healthbarupdate(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(u8 battler, u8 updateState); u32 battler = GetBattlerForBattleScript(cmd->battler); if (gBattleControllerExecFlags) return; - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_HP_UPDATE)) + switch (cmd->updateState) { - if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) + case PASSIVE_HP_UPDATE: + BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, min(gBattleStruct->passiveHpUpdate[battler], 10000)); + MarkBattlerForControllerExec(battler); + break; + case MOVE_DAMAGE_HP_UPDATE: + if (IsDoubleSpreadMove()) + { + DoublesHPBarReduction(); + if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) + PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, battler); + } + else if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) { PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, battler); - if (IsDoubleSpreadMove()) - DoublesHPBarReduction(); } - else if (!DoesDisguiseBlockMove(battler, gCurrentMove)) + else if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && !DoesDisguiseBlockMove(battler, gCurrentMove)) { - if (IsDoubleSpreadMove()) - { - DoublesHPBarReduction(); - } - else - { - s16 healthValue = min(gBattleStruct->moveDamage[battler], 10000); // Max damage (10000) not present in R/S, ensures that huge damage values don't change sign - - BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, healthValue); - MarkBattlerForControllerExec(battler); - - if (IsOnPlayerSide(battler) && gBattleStruct->moveDamage[battler] > 0) - gBattleResults.playerMonWasDamaged = TRUE; - } + s32 damage = min(gBattleStruct->moveDamage[battler], 10000); + BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, damage); + MarkBattlerForControllerExec(battler); + if (IsOnPlayerSide(battler) && damage > 0) + gBattleResults.playerMonWasDamaged = TRUE; } - } - else if (IsDoubleSpreadMove()) - { - DoublesHPBarReduction(); + break; } gBattlescriptCurrInstr = cmd->nextInstr; } -// Update the active battler's HP and various HP trackers (Substitute, Bide, etc.) +static void PassiveDataHpUpdate(u32 battler, const u8 *nextInstr) +{ + if (gBattleStruct->passiveHpUpdate[battler] < 0) + { + // Negative damage is HP gain + gBattleMons[battler].hp += -gBattleStruct->passiveHpUpdate[battler]; + if (gBattleMons[battler].hp > gBattleMons[battler].maxHP) + gBattleMons[battler].hp = gBattleMons[battler].maxHP; + } + else + { + if (gBattleMons[battler].hp > gBattleStruct->passiveHpUpdate[battler]) + gBattleMons[battler].hp -= gBattleStruct->passiveHpUpdate[battler]; + else + gBattleMons[battler].hp = 0; + } + + // Send updated HP + BtlController_EmitSetMonData( + battler, + B_COMM_TO_CONTROLLER, + REQUEST_HP_BATTLE, + 0, + sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); + MarkBattlerForControllerExec(battler); + + gBattleStruct->passiveHpUpdate[battler] = 0; + gBattlescriptCurrInstr = nextInstr; +} + +static void MoveDamageDataHpUpdate(u32 battler, u32 scriptBattler, const u8 *nextInstr) +{ + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + { + gBattlescriptCurrInstr = nextInstr; + } + else if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP) + { + if (gDisableStructs[battler].substituteHP >= gBattleStruct->moveDamage[battler]) + { + gDisableStructs[battler].substituteHP -= gBattleStruct->moveDamage[battler]; + } + else + { + gBattleStruct->moveDamage[battler] = gDisableStructs[battler].substituteHP; + gDisableStructs[battler].substituteHP = 0; + } + // check substitute fading + if (gDisableStructs[battler].substituteHP == 0) + { + gBattlescriptCurrInstr = nextInstr; + BattleScriptCall(BattleScript_SubstituteFade); + return; + } + else + { + gBattlescriptCurrInstr = nextInstr; + return; + } + } + else if (DoesDisguiseBlockMove(battler, gCurrentMove)) + { + // TODO: Convert this to a proper FORM_CHANGE type. + gBattleScripting.battler = battler; + if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; + if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) + gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; + else + gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; + if (GetGenConfig(GEN_CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); + BattleScriptPush(nextInstr); + gBattlescriptCurrInstr = BattleScript_TargetFormChange; + } + else + { + if (gBattleStruct->moveDamage[battler] < 0) + { + // Negative damage is HP gain + gBattleMons[battler].hp += -gBattleStruct->moveDamage[battler]; + if (gBattleMons[battler].hp > gBattleMons[battler].maxHP) + gBattleMons[battler].hp = gBattleMons[battler].maxHP; + } + else + { + gBideDmg[battler] += gBattleStruct->moveDamage[battler]; + if (scriptBattler == BS_TARGET) + gBideTarget[battler] = gBattlerAttacker; + else + gBideTarget[battler] = gBattlerTarget; + + // Deal damage to the battler + if (gBattleMons[battler].hp > gBattleStruct->moveDamage[battler]) + { + gBattleMons[battler].hp -= gBattleStruct->moveDamage[battler]; + } + else + { + gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; + gBattleMons[battler].hp = 0; + } + + // Note: While physicalDmg/specialDmg below are only distinguished between for Counter/Mirror Coat, they are + // used in combination as general damage trackers for other purposes. specialDmg is additionally used + // to help determine if a fire move should defrost the target. + if (IsBattleMovePhysical(gCurrentMove)) + { + gProtectStructs[battler].physicalDmg = gBattleStruct->moveDamage[battler]; + gSpecialStatuses[battler].physicalDmg = gBattleStruct->moveDamage[battler]; + if (scriptBattler == BS_TARGET) // What's the point of this??? It will be always target + gProtectStructs[battler].physicalBattlerId = gBattlerAttacker; + else + gProtectStructs[battler].physicalBattlerId = gBattlerTarget; + gProtectStructs[battler].assuranceDoubled = TRUE; + } + else // Physical move + { + gProtectStructs[battler].specialDmg = gBattleStruct->moveDamage[battler]; + gSpecialStatuses[battler].specialDmg = gBattleStruct->moveDamage[battler]; + if (scriptBattler == BS_TARGET) // What's the point of this??? It will be always target + gProtectStructs[battler].specialBattlerId = gBattlerAttacker; + else + gProtectStructs[battler].specialBattlerId = gBattlerTarget; + gProtectStructs[battler].assuranceDoubled = TRUE; + } + } + // Send updated HP + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); + MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = nextInstr; + } + + if (IsBattlerTurnDamaged(gBattlerTarget) && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS) + GetBattlerPartyState(battler)->timesGotHit++; +} + static void Cmd_datahpupdate(void) { - CMD_ARGS(u8 battler); - bool32 isPassiveHpUpdate = gHitMarker & HITMARKER_PASSIVE_HP_UPDATE; - bool32 disguiseActivates = FALSE; + CMD_ARGS(u8 battler, u8 updateState); + u32 battler = GetBattlerForBattleScript(cmd->battler); if (gBattleControllerExecFlags) return; - u32 battler = GetBattlerForBattleScript(cmd->battler); - - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT) || (gHitMarker & HITMARKER_PASSIVE_HP_UPDATE)) + switch (cmd->updateState) { - if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) - { - if (gDisableStructs[battler].substituteHP >= gBattleStruct->moveDamage[battler]) - { - gDisableStructs[battler].substituteHP -= gBattleStruct->moveDamage[battler]; - } - else - { - gBattleStruct->moveDamage[battler] = gDisableStructs[battler].substituteHP; - gDisableStructs[battler].substituteHP = 0; - } - // check substitute fading - if (gDisableStructs[battler].substituteHP == 0) - { - gBattlescriptCurrInstr = cmd->nextInstr; - BattleScriptCall(BattleScript_SubstituteFade); - return; - } - } - else if (DoesDisguiseBlockMove(battler, gCurrentMove)) - { - // TODO: Convert this to a proper FORM_CHANGE type. - gBattleScripting.battler = battler; - if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE) - GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; - if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) - gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; - else - gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; - if (GetGenConfig(GEN_CONFIG_DISGUISE_HP_LOSS) >= GEN_8) - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_TargetFormChange; - disguiseActivates = TRUE; - } - else - { - gHitMarker &= ~HITMARKER_IGNORE_SUBSTITUTE; - if (gBattleStruct->moveDamage[battler] < 0) - { - // Negative damage is HP gain - gBattleMons[battler].hp += -gBattleStruct->moveDamage[battler]; - if (gBattleMons[battler].hp > gBattleMons[battler].maxHP) - gBattleMons[battler].hp = gBattleMons[battler].maxHP; - } - else - { - if (gHitMarker & HITMARKER_IGNORE_BIDE) - { - gHitMarker &= ~HITMARKER_IGNORE_BIDE; - } - else - { - gBideDmg[battler] += gBattleStruct->moveDamage[battler]; - if (cmd->battler == BS_TARGET) - gBideTarget[battler] = gBattlerAttacker; - else - gBideTarget[battler] = gBattlerTarget; - } - - // Deal damage to the battler - if (gBattleMons[battler].hp > gBattleStruct->moveDamage[battler]) - { - gBattleMons[battler].hp -= gBattleStruct->moveDamage[battler]; - } - else - { - gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; - gBattleMons[battler].hp = 0; - } - - enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); - - // Note: While physicalDmg/specialDmg below are only distinguished between for Counter/Mirror Coat, they are - // used in combination as general damage trackers for other purposes. specialDmg is additionally used - // to help determine if a fire move should defrost the target. - if (IsBattleMovePhysical(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_HP_UPDATE) && effect != EFFECT_PAIN_SPLIT) - { - gProtectStructs[battler].physicalDmg = gBattleStruct->moveDamage[battler]; - gSpecialStatuses[battler].physicalDmg = gBattleStruct->moveDamage[battler]; - if (cmd->battler == BS_TARGET) - gProtectStructs[battler].physicalBattlerId = gBattlerAttacker; - else - gProtectStructs[battler].physicalBattlerId = gBattlerTarget; - gProtectStructs[battler].assuranceDoubled = TRUE; - } - else if (!IsBattleMovePhysical(gCurrentMove) && !(gHitMarker & HITMARKER_PASSIVE_HP_UPDATE) && effect != EFFECT_PAIN_SPLIT) - { - // Record special damage/attacker for Mirror Coat - gProtectStructs[battler].specialDmg = gBattleStruct->moveDamage[battler]; - gSpecialStatuses[battler].specialDmg = gBattleStruct->moveDamage[battler]; - if (cmd->battler == BS_TARGET) - gProtectStructs[battler].specialBattlerId = gBattlerAttacker; - else - gProtectStructs[battler].specialBattlerId = gBattlerTarget; - gProtectStructs[battler].assuranceDoubled = TRUE; - } - } - gHitMarker &= ~HITMARKER_PASSIVE_HP_UPDATE; - // Send updated HP - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); - MarkBattlerForControllerExec(battler); - } - - if (gBattlerAttacker != gBattlerTarget - && !isPassiveHpUpdate - && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS - && IsBattlerTurnDamaged(gBattlerTarget)) - GetBattlerPartyState(gBattlerTarget)->timesGotHit++; - - if (disguiseActivates) - return; + case PASSIVE_HP_UPDATE: + PassiveDataHpUpdate(battler, cmd->nextInstr); + break; + case MOVE_DAMAGE_HP_UPDATE: + MoveDamageDataHpUpdate(battler, cmd->battler, cmd->nextInstr); + break; } - TryRestoreDamageAfterCheekPouch(battler); - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_critmessage(void) @@ -3296,12 +3315,12 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_RECOIL_HP_25: // Struggle - gBattleStruct->moveDamage[gEffectBattler] = (gBattleMons[gEffectBattler].maxHP) / 4; - if (gBattleStruct->moveDamage[gEffectBattler] == 0) - gBattleStruct->moveDamage[gEffectBattler] = 1; + s32 recoil = (gBattleMons[gEffectBattler].maxHP) / 4; + if (recoil == 0) + recoil = 1; if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) - gBattleStruct->moveDamage[gEffectBattler] *= 2; - + recoil *= 2; + SetPassiveDamageAmount(gEffectBattler, recoil); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; break; @@ -3337,10 +3356,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai && !IsSemiInvulnerable(BATTLE_PARTNER(gBattlerTarget), CHECK_ALL) && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) != ABILITY_MAGIC_GUARD) { - gBattleScripting.battler = i = BATTLE_PARTNER(gBattlerTarget); - gBattleStruct->moveDamage[i] = gBattleMons[i].maxHP / 16; - if (gBattleStruct->moveDamage[i] == 0) - gBattleStruct->moveDamage[i] = 1; + u32 partnerTarget = BATTLE_PARTNER(gBattlerTarget); + gBattleScripting.battler = partnerTarget; + SetPassiveDamageAmount(partnerTarget, gBattleMons[partnerTarget].maxHP / 16); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_MoveEffectFlameBurst; } @@ -4218,7 +4236,7 @@ static void Cmd_tryfaintmon(void) { gHitMarker &= ~HITMARKER_DESTINYBOND; BattleScriptPush(gBattlescriptCurrInstr); - gBattleStruct->moveDamage[destinyBondBattler] = gBattleMons[destinyBondBattler].hp; + gBattleStruct->passiveHpUpdate[destinyBondBattler] = gBattleMons[destinyBondBattler].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; } if (gBattleMons[gBattlerTarget].volatiles.grudge @@ -5283,21 +5301,29 @@ static void Cmd_waitstate(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_absorb(void) +static void Cmd_isdmgblockedbydisguise(void) { - CMD_ARGS(u8 battler); + CMD_ARGS(); - if (gBattleControllerExecFlags) + if (!IsMimikyuDisguised(gBattlerAttacker) + || gBattleMons[gBattlerAttacker].volatiles.transformed + || !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_DISGUISE)) + { + gBattlescriptCurrInstr = cmd->nextInstr; return; + } - u32 battler = GetBattlerForBattleScript(cmd->battler); - BtlController_EmitHealthBarUpdate(battler, B_COMM_TO_CONTROLLER, gBattleStruct->moveDamage[battler]); - MarkBattlerForControllerExec(battler); - - if (IsOnPlayerSide(battler) && gBattleStruct->moveDamage[battler] > 0) - gBattleResults.playerMonWasDamaged = TRUE; - - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleScripting.battler = gBattlerAttacker; + if (GetBattlerPartyState(gBattlerAttacker)->changedSpecies == SPECIES_NONE) + GetBattlerPartyState(gBattlerAttacker)->changedSpecies = gBattleMons[gBattlerAttacker].species; + if (gBattleMons[gBattlerAttacker].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) + gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED_TOTEM; + else + gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED; + if (GetGenConfig(GEN_CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); + BattleScriptPush(BattleScript_MoveEnd); + gBattlescriptCurrInstr = BattleScript_TargetFormChange; } static void Cmd_return(void) @@ -5771,16 +5797,14 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) && (!IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gBattleStruct->noTargetPresent) { + s32 recoil = 0; if (B_RECOIL_IF_MISS_DMG >= GEN_5 || (B_CRASH_IF_TARGET_IMMUNE == GEN_4 && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_DOESNT_AFFECT_FOE)) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + recoil = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else if (B_RECOIL_IF_MISS_DMG == GEN_4 && (GetNonDynamaxMaxHP(gBattlerTarget) / 2) < gBattleStruct->moveDamage[gBattlerTarget]) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; else // Fallback if B_RECOIL_IF_MISS_DMG is set to gen3 or lower. - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - + recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + SetPassiveDamageAmount(gBattlerAttacker, recoil); BattleScriptCall(BattleScript_RecoilIfMiss); effect = TRUE; } @@ -5788,7 +5812,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) case EFFECT_RECOIL: if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) { - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, gBattleScripting.savedDmg * max(1, GetMoveRecoil(gCurrentMove)) / 100); + SetPassiveDamageAmount(gBattlerAttacker, gBattleScripting.savedDmg * max(1, GetMoveRecoil(gCurrentMove)) / 100); BattleScriptCall(BattleScript_MoveEffectRecoil); effect = TRUE; } @@ -5796,7 +5820,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) case EFFECT_EXPLOSION: if (!IsAbilityOnField(ABILITY_DAMP)) { - gBattleStruct->moveDamage[gBattlerAttacker] = 0; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = 0; BattleScriptCall(BattleScript_FaintAttackerForExplosion); effect = TRUE; } @@ -5806,7 +5830,8 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { - gBattleStruct->moveDamage[gBattlerAttacker] = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + SetPassiveDamageAmount(gBattlerAttacker, recoil); BattleScriptCall(BattleScript_MaxHp50Recoil); effect = TRUE; } @@ -5814,7 +5839,8 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) case EFFECT_CHLOROBLAST: if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) { - gBattleStruct->moveDamage[gBattlerAttacker] = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + SetPassiveDamageAmount(gBattlerAttacker, recoil); BattleScriptCall(BattleScript_MoveEffectRecoil); effect = TRUE; } @@ -5921,9 +5947,7 @@ static void Cmd_moveend(void) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 8; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); BattleScriptCall(BattleScript_SpikyShieldEffect); effect = 1; @@ -6027,20 +6051,19 @@ static void Cmd_moveend(void) && gBattleStruct->moveDamage[gBattlerTarget] > 0 && IsBattlerAlive(gBattlerAttacker)) { - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100)); - gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); - - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_HP_UPDATE; + s32 healAmount = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); + healAmount = GetDrainedBigRootHp(gBattlerAttacker, healAmount); effect = TRUE; if ((moveEffect == EFFECT_DREAM_EATER && GetGenConfig(GEN_DREAM_EATER_LIQUID_OOZE) < GEN_5) || GetBattlerAbility(gBattlerTarget) != ABILITY_LIQUID_OOZE) { + SetHealAmount(gBattlerAttacker, healAmount); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; BattleScriptCall(BattleScript_EffectAbsorb); } - else + else // Liquid Ooze damage { - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; + SetPassiveDamageAmount(gBattlerAttacker, healAmount); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); } @@ -7703,10 +7726,8 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) && IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler))) { - u8 spikesDmg = (5 - gSideTimers[side].spikesAmount) * 2; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; + s32 spikesDmg = GetNonDynamaxMaxHP(battler) / ((5 - gSideTimers[side].spikesAmount) * 2); + SetPassiveDamageAmount(battler, spikesDmg); SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); } break; @@ -7754,16 +7775,16 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) case HAZARDS_STEALTH_ROCK: if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) { - gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); - if (gBattleStruct->moveDamage[battler] != 0) + gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); + if (gBattleStruct->passiveHpUpdate[battler] != 0) SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); } break; case HAZARDS_STEELSURGE: if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) { - gBattleStruct->moveDamage[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); - if (gBattleStruct->moveDamage[battler] != 0) + gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); + if (gBattleStruct->passiveHpUpdate[battler] != 0) SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); } break; @@ -7814,7 +7835,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) else if (gBattleMons[battler].hp != gBattleMons[battler].maxHP && gBattleStruct->zmove.healReplacement) { gBattleStruct->zmove.healReplacement = FALSE; - gBattleStruct->moveDamage[battler] = -1 * (gBattleMons[battler].maxHP); + SetHealAmount(battler, gBattleMons[battler].maxHP); gBattleScripting.battler = battler; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_HP_TRAP; BattleScriptCall(BattleScript_HealReplacementZMove); @@ -8256,6 +8277,7 @@ static void Cmd_yesnoboxstoplearningmove(void) } } +// TODO: passive damage hit anim for sub static void Cmd_hitanimation(void) { CMD_ARGS(u8 battler); @@ -8266,7 +8288,7 @@ static void Cmd_hitanimation(void) if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) { - if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) + if (gBattleStruct->passiveHpUpdate[battler] > 0 || !(DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) || gDisableStructs[battler].substituteHP == 0) { @@ -8284,8 +8306,7 @@ static void Cmd_hitanimation(void) || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) continue; - if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) - || !(DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) + if (!(DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) || gDisableStructs[battlerDef].substituteHP == 0) { BtlController_EmitHitAnimation(battlerDef, B_COMM_TO_CONTROLLER); @@ -8602,13 +8623,8 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) && GetBattlerPartyState(battler)->ateBerry && !IsBattlerAtMaxHp(battler)) { - gBattleStruct->cheekPouchActivated = TRUE; - gBattleStruct->savedcheekPouchDamage = gBattleStruct->moveDamage[battler]; - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 3; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; gBattlerAbility = battler; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 3); BattleScriptPush(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BattleScript_CheekPouchActivates; return TRUE; @@ -8616,16 +8632,6 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) return FALSE; } -// When Cheek Pouch activates mid-battle it overwrites the current damage, so restore it -static void TryRestoreDamageAfterCheekPouch(u32 battler) -{ - if (gBattleStruct->cheekPouchActivated) - { - gBattleStruct->moveDamage[battler] = gBattleStruct->savedcheekPouchDamage; - gBattleStruct->cheekPouchActivated = FALSE; - } -} - // Used by Bestow and Symbiosis to take an item from one battler and give to another. static void BestowItem(u32 battlerAtk, u32 battlerDef) { @@ -9614,7 +9620,7 @@ static void Cmd_tryexplosion(void) if (gBattleControllerExecFlags) return; - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; @@ -9668,11 +9674,7 @@ static void Cmd_tryhealhalfhealth(void) if (cmd->battler == BS_ATTACKER) gBattlerTarget = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; - + SetHealAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 2); if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = failInstr; else @@ -9762,21 +9764,19 @@ static void Cmd_manipulatedamage(void) switch (cmd->mode) { case DMG_CHANGE_SIGN: - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] *= -1; break; case DMG_DOUBLED: gBattleStruct->moveDamage[gBattlerTarget] *= 2; break; case DMG_1_8_TARGET_HP: - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 8; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; + SetPassiveDamageAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 8); break; case DMG_FULL_ATTACKER_HP: - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker); + gBattleStruct->passiveHpUpdate[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker); break; case DMG_BIG_ROOT: - gBattleStruct->moveDamage[gBattlerAttacker] = GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerAttacker]); + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = -1 * GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->passiveHpUpdate[gBattlerAttacker]); break; } @@ -9788,7 +9788,7 @@ static void Cmd_trysetrest(void) CMD_ARGS(); gBattlerTarget = gBattlerAttacker; - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); + SetHealAmount(gBattlerTarget, gBattleMons[gBattlerTarget].maxHP); enum Ability ability = GetBattlerAbility(gBattlerTarget); enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); @@ -9910,19 +9910,15 @@ static void Cmd_stockpiletohpheal(void) { if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter)); + SetHealAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter))); gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; } else // Snatched move { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + SetHealAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); gBattleScripting.animTurn = 1; } - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - gBattlescriptCurrInstr = cmd->nextInstr; gBattlerTarget = gBattlerAttacker; } @@ -9946,17 +9942,8 @@ void BS_RemoveStockpileCounters(void) } } -// Sign change for drained HP handled in GetDrainedBigRootHp -static void Cmd_setdrainedhp(void) +static void Cmd_unused_0x88(void) { - CMD_ARGS(); - - gBattleStruct->moveDamage[gBattlerAttacker] = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); - - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - - gBattlescriptCurrInstr = cmd->nextInstr; } static u16 ReverseStatChangeMoveEffect(u16 moveEffect) @@ -11143,7 +11130,7 @@ static void Cmd_setsubstitute(void) CMD_ARGS(); u32 factor = GetMoveEffect(gCurrentMove) == EFFECT_SHED_TAIL ? 2 : 4; - u32 hp; + s32 hp = 0; if (factor == 2) hp = (GetNonDynamaxMaxHP(gBattlerAttacker)+1) / factor; // shed tail rounds up @@ -11155,25 +11142,22 @@ static void Cmd_setsubstitute(void) if (gBattleMons[gBattlerAttacker].hp <= hp) { - gBattleStruct->moveDamage[gBattlerAttacker] = 0; + hp = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED; } else { - gBattleStruct->moveDamage[gBattlerAttacker] = hp; // one bit value will only work for Pokémon which max hp can go to 1020(which is more than possible in games) - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - gBattleMons[gBattlerAttacker].volatiles.substitute = TRUE; gBattleMons[gBattlerAttacker].volatiles.wrapped = FALSE; + // gDisableStructs[gBattlerAttacker].substituteHP = (factor == 2) ? (hp / 2) : hp; if (factor == 2) - gDisableStructs[gBattlerAttacker].substituteHP = gBattleStruct->moveDamage[gBattlerAttacker] / 2; + gDisableStructs[gBattlerAttacker].substituteHP = hp / 2; else - gDisableStructs[gBattlerAttacker].substituteHP = gBattleStruct->moveDamage[gBattlerAttacker]; + gDisableStructs[gBattlerAttacker].substituteHP = hp; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; - gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; } + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = hp; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -11374,8 +11358,8 @@ static void Cmd_painsplitdmgcalc(void) { s32 hpDiff = (gBattleMons[gBattlerAttacker].hp + GetNonDynamaxHP(gBattlerTarget)) / 2; - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - hpDiff; - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp - hpDiff; + gBattleStruct->passiveHpUpdate[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - hpDiff; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp - hpDiff; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -11806,10 +11790,7 @@ static void Cmd_cursetarget(void) else { gBattleMons[gBattlerTarget].volatiles.cursed = TRUE; - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -11980,11 +11961,7 @@ static void Cmd_presentdamagecalculation(void) } else { - // TODO: Check if this is correct - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerTarget) / 4; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; + SetHealAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 4); gBattleStruct->presentBasePower = 0; } } @@ -12159,10 +12136,7 @@ static void Cmd_halvehp(void) if (gBattleMons[gBattlerAttacker].hp > halfHp) { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -12236,21 +12210,22 @@ static void Cmd_recoverbasedonsunlight(void) gBattlerTarget = gBattlerAttacker; if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { + s32 recoverAmount = 0; if (GetMoveEffect(gCurrentMove) == EFFECT_SHORE_UP) { if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) - gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; + recoverAmount = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; else - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } else if (GetGenConfig(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) { if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else if (gBattleWeather & B_WEATHER_SUN) - gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; + recoverAmount = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; else // not sunny weather - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; } else // B_TIME_OF_DAY_HEALING_MOVES == GEN_2 { @@ -12278,18 +12253,15 @@ static void Cmd_recoverbasedonsunlight(void) } if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) - gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 4; + recoverAmount = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 4; else if (gBattleWeather & B_WEATHER_SUN) - gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + recoverAmount = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else // not sunny weather - gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 8; + recoverAmount = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 8; } - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - gBattleStruct->moveDamage[gBattlerAttacker] *= -1; - + SetHealAmount(gBattlerAttacker, recoverAmount); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -12480,9 +12452,10 @@ static void Cmd_trymemento(void) else { // Success, drop user's HP bar to 0 - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; BtlController_EmitHealthBarUpdate(gBattlerAttacker, B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -13305,10 +13278,10 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) bool32 DoesDisguiseBlockMove(u32 battler, u32 move) { - if (!(gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) - || gBattleMons[battler].volatiles.transformed - || (!gProtectStructs[battler].confusionSelfDmg && (IsBattleMoveStatus(move) || gHitMarker & HITMARKER_PASSIVE_HP_UPDATE)) - || !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_DISGUISE)) + if (!IsMimikyuDisguised(battler) + || gBattleMons[battler].volatiles.transformed + || (!gProtectStructs[battler].confusionSelfDmg && IsBattleMoveStatus(move)) + || !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_DISGUISE)) return FALSE; else return TRUE; @@ -14178,12 +14151,8 @@ static void Cmd_trygivecaughtmonnick(void) } } -static void Cmd_subattackerhpbydmg(void) +static void Cmd_unused_0xf4(void) { - CMD_ARGS(); - - gBattleMons[gBattlerAttacker].hp -= gBattleStruct->moveDamage[gBattlerTarget]; - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_removeattackerstatus1(void) @@ -14853,7 +14822,7 @@ void BS_ItemRestoreHP(void) // Heal is applied as move damage if battler is active. if (battler != MAX_BATTLERS_COUNT && hp != 0) { - gBattleStruct->moveDamage[battler] = -healAmount; + gBattleStruct->passiveHpUpdate[battler] = -healAmount; gBattlescriptCurrInstr = cmd->restoreBattlerInstr; } else @@ -15328,15 +15297,15 @@ void BS_TryHealPulse(void) } else { + s32 healAmount = 0; if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MEGA_LAUNCHER && IsPulseMove(gCurrentMove)) - gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) * 75 / 100); + healAmount = GetNonDynamaxMaxHP(gBattlerTarget) * 75 / 100; else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_FLORAL_HEALING) - gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) * 2 / 3); + healAmount = GetNonDynamaxMaxHP(gBattlerTarget) * 2 / 3; else - gBattleStruct->moveDamage[gBattlerTarget] = -(GetNonDynamaxMaxHP(gBattlerTarget) / 2); + healAmount = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = -1; + SetHealAmount(gBattlerTarget, healAmount); gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -15548,12 +15517,8 @@ void BS_TryActivateGulpMissile(void) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT && GetBattlerAbility(gBattlerTarget) == ABILITY_GULP_MISSILE) { - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - } + if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + SetPassiveDamageAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); switch(gBattleMons[gBattlerTarget].species) { @@ -16268,11 +16233,7 @@ void BS_TrySetTorment(void) void BS_HealOneSixth(void) { NATIVE_ARGS(const u8* failInstr); - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP / 6; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - gBattleStruct->moveDamage[gBattlerTarget] *= -1; - + SetHealAmount(gBattlerTarget, gBattleMons[gBattlerTarget].maxHP / 6); if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = cmd->failInstr; // fail else @@ -16568,9 +16529,9 @@ void BS_GetStatValue(void) { NATIVE_ARGS(u8 stat); u32 stat = cmd->stat; - gBattleStruct->moveDamage[gBattlerAttacker] = *(u16 *)(&gBattleMons[gBattlerTarget].attack) + (stat - 1); - gBattleStruct->moveDamage[gBattlerAttacker] *= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][0]; - gBattleStruct->moveDamage[gBattlerAttacker] /= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][1]; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = *(u16 *)(&gBattleMons[gBattlerTarget].attack) + (stat - 1); + gBattleStruct->passiveHpUpdate[gBattlerAttacker] *= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][0]; + gBattleStruct->passiveHpUpdate[gBattlerAttacker] /= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][1]; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17672,11 +17633,7 @@ void BS_TryHealQuarterHealth(void) { NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 4; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; - + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 4); if (gBattleMons[battler].hp == gBattleMons[battler].maxHP) gBattlescriptCurrInstr = cmd->failInstr; // fail else @@ -17950,7 +17907,7 @@ void BS_CutOneThirdHpAndRaiseStats(void) } if (atLeastOneStatBoosted) { - gBattleStruct->moveDamage[gBattlerAttacker] = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 3); gBattlescriptCurrInstr = cmd->nextInstr; } else diff --git a/src/battle_util.c b/src/battle_util.c index 53ec033938..22b26e11e4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -914,9 +914,7 @@ void HandleAction_NothingIsFainted(void) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_ATTACKSTRING_PRINTED - | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT - | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_OBEYS); } @@ -929,10 +927,8 @@ void HandleAction_ActionFinished(void) gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); gHitMarker &= ~(HITMARKER_DESTINYBOND - | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED | HITMARKER_STATUS_ABILITY_EFFECT - | HITMARKER_PASSIVE_HP_UPDATE | HITMARKER_OBEYS); ClearDamageCalcResults(); @@ -1790,7 +1786,7 @@ void TryToRevertMimicryAndFlags(void) bool32 BattleArenaTurnEnd(void) { - gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + gHitMarker |= HITMARKER_GRUDGE; if ((gBattleTypeFlags & BATTLE_TYPE_ARENA) && gBattleStruct->arenaTurnCounter == 2 @@ -1804,7 +1800,7 @@ bool32 BattleArenaTurnEnd(void) return TRUE; } - gHitMarker &= ~(HITMARKER_GRUDGE | HITMARKER_IGNORE_BIDE); + gHitMarker &= ~HITMARKER_GRUDGE; return FALSE; } @@ -1817,7 +1813,7 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp) if (hp == 0) hp = 1; - return hp * -1; + return hp; } // Should always be the last check. Otherwise the ability might be wrongly recorded. @@ -2258,7 +2254,7 @@ static enum MoveCanceller CancellerConfused(struct BattleContext *ctx) dmgCtx.randomFactor = FALSE; dmgCtx.updateFlags = TRUE; dmgCtx.fixedBasePower = 40; - gBattleStruct->moveDamage[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); + gBattleStruct->passiveHpUpdate[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); gProtectStructs[ctx->battlerAtk].confusionSelfDmg = TRUE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; @@ -2735,7 +2731,7 @@ static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx) if (TryActivatePowderStatus(ctx->currentMove)) { if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) - gBattleStruct->moveDamage[ctx->battlerAtk] = GetNonDynamaxMaxHP(ctx->battlerAtk) / 4; + SetPassiveDamageAmount(ctx->battlerAtk, GetNonDynamaxMaxHP(ctx->battlerAtk) / 4); // This might be incorrect if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE @@ -3543,10 +3539,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability ability else { battleScript = BattleScript_MoveHPDrain; - gBattleStruct->moveDamage[battlerDef] = GetNonDynamaxMaxHP(battlerDef) / 4; - if (gBattleStruct->moveDamage[battlerDef] == 0) - gBattleStruct->moveDamage[battlerDef] = 1; - gBattleStruct->moveDamage[battlerDef] *= -1; + SetHealAmount(battlerDef, GetNonDynamaxMaxHP(battlerDef) / 4); } break; case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: @@ -4459,7 +4452,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec { gEffectBattler = partner; gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattleStruct->moveDamage[partner] = (GetNonDynamaxMaxHP(partner) / 4) * -1; + SetHealAmount(partner, GetNonDynamaxMaxHP(partner) / 4); BattleScriptPushCursorAndCallback(BattleScript_HospitalityActivates); effect++; } @@ -4575,10 +4568,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec && !gBattleMons[battler].volatiles.healBlock) { BattleScriptExecute(BattleScript_IceBodyHeal); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 16); effect++; } break; @@ -4591,11 +4581,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec && !IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock) { + s32 healAmount = gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / healAmount); BattleScriptExecute(BattleScript_RainDishActivates); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (gLastUsedAbility == ABILITY_RAIN_DISH ? 16 : 8); - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; - gBattleStruct->moveDamage[battler] *= -1; effect++; } break; @@ -4694,10 +4682,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) { SOLAR_POWER_HP_DROP: + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BattleScriptExecute(BattleScript_SolarPowerActivates); - gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleStruct->moveDamage[battler] == 0) - gBattleStruct->moveDamage[battler] = 1; effect++; } break; @@ -4985,9 +4971,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec && IsBattlerTurnDamaged(gBattlerTarget) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16)); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); BattleScriptCall(BattleScript_RoughSkinActivates); effect++; @@ -5007,9 +4991,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec else { gBattleScripting.battler = gBattlerTarget; - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); BattleScriptCall(BattleScript_AftermathDmg); } effect++; @@ -5025,7 +5007,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec break; gBattleScripting.battler = gBattlerTarget; - gBattleStruct->moveDamage[gBattlerAttacker] = gBattleStruct->moveDamage[gBattlerTarget]; + SetPassiveDamageAmount(gBattlerAttacker, gBattleStruct->moveDamage[gBattlerTarget]); BattleScriptCall(BattleScript_AftermathDmg); effect++; } @@ -5225,12 +5207,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 spec && IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT) { - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; - if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) - gBattleStruct->moveDamage[gBattlerAttacker] = 1; - } + if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); switch(gBattleMons[gBattlerTarget].species) { @@ -10966,3 +10944,9 @@ bool32 IsAllowedToUseBag(void) return TRUE; // Undefined Behavior } } + +bool32 IsMimikyuDisguised(u32 battler) +{ + return gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED + || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED; +} diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 196d462d62..be3ae07265 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -506,7 +506,7 @@ void SetZEffect(void) case Z_EFFECT_RECOVER_HP: if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { - gBattleStruct->moveDamage[gBattlerAttacker] = (-1) * gBattleMons[gBattlerAttacker].maxHP; + SetHealAmount(gBattlerAttacker, gBattleMons[gBattlerAttacker].maxHP); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_RECOVER_HP; BattleScriptPush(gBattlescriptCurrInstr + Z_EFFECT_BS_LENGTH); gBattlescriptCurrInstr = BattleScript_RecoverHPZMove; From 786859b6bb596d3d0d7951ec4798901fe0fe488d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 19 Oct 2025 22:38:27 +0200 Subject: [PATCH 084/183] Fix Fling Mental Herb message (#7984) --- asm/macros/battle_script.inc | 11 +-- data/battle_scripts_1.s | 43 +----------- include/battle.h | 1 + include/battle_hold_effects.h | 4 +- include/battle_scripts.h | 1 + src/battle_hold_effects.c | 3 +- src/battle_script_commands.c | 115 +++++++++++++++++--------------- src/data/hold_effects.h | 2 + test/battle/move_effect/fling.c | 21 ++++++ 9 files changed, 95 insertions(+), 106 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9170ffc85d..39ecce81a6 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1790,11 +1790,8 @@ .4byte \jumpInstr .endm - .macro jumpiflastuseditemholdeffect holdEffect:req, secondaryId:req, jumpInstr:req - callnative BS_JumpIfLastUsedItemHoldEffect - .byte \holdEffect - .2byte \secondaryId - .4byte \jumpInstr + .macro tryflingholdeffect + callnative BS_TryFlingHoldEffect .endm .macro swapsidestatuses @@ -2391,10 +2388,6 @@ .4byte \failInstr .endm - .macro curecertainstatuses - callnative BS_CureCertainStatuses - .endm - .macro tryresetnegativestatstages callnative BS_TryResetNegativeStatStages .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 94ad23d029..2aaf0649b3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -697,15 +697,9 @@ BattleScript_EffectFling:: resultmessage waitmessage B_WAIT_TIME_MED jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry - jumpifability BS_TARGET, ABILITY_SHIELD_DUST, BattleScript_FlingBlockedByShieldDust - jumpiflastuseditemholdeffect HOLD_EFFECT_FLAME_ORB, 0, BattleScript_FlingFlameOrb - jumpiflastuseditemholdeffect HOLD_EFFECT_FLINCH, 0, BattleScript_FlingFlinch - jumpiflastuseditemholdeffect HOLD_EFFECT_LIGHT_BALL, 0, BattleScript_FlingLightBall - jumpiflastuseditemholdeffect HOLD_EFFECT_MENTAL_HERB, 0, BattleScript_FlingMentalHerb - jumpiflastuseditemholdeffect HOLD_EFFECT_TYPE_POWER, TYPE_POISON, BattleScript_FlingPoisonBarb - jumpiflastuseditemholdeffect HOLD_EFFECT_TOXIC_ORB, 0, BattleScript_FlingToxicOrb - jumpiflastuseditemholdeffect HOLD_EFFECT_WHITE_HERB, 0, BattleScript_FlingWhiteHerb + tryflingholdeffect goto BattleScript_FlingEnd + BattleScript_EffectFlingConsumeBerry: savebattleritem battleritemtolastuseditem @@ -729,39 +723,6 @@ BattleScript_FlingBlockedByShieldDust:: waitmessage B_WAIT_TIME_LONG goto BattleScript_FlingEnd -BattleScript_FlingFlameOrb: - seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_BURN - goto BattleScript_FlingEnd -BattleScript_FlingFlinch: - seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_FLINCH - goto BattleScript_FlingEnd -BattleScript_FlingLightBall: - seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PARALYSIS - goto BattleScript_FlingEnd -BattleScript_FlingMentalHerb: - curecertainstatuses - saveattacker - copybyte gBattlerAttacker, gBattlerTarget - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL - printfromtable gMentalHerbCureStringIds - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_ATTACKER - restoreattacker - goto BattleScript_FlingEnd -BattleScript_FlingPoisonBarb: - seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_POISON - goto BattleScript_FlingEnd -BattleScript_FlingToxicOrb: - seteffectsecondary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_TOXIC - goto BattleScript_FlingEnd -BattleScript_FlingWhiteHerb: - tryresetnegativestatstages - swapattackerwithtarget - printstring STRINGID_PKMNSTATUSNORMAL - waitmessage B_WAIT_TIME_MED - swapattackerwithtarget - goto BattleScript_FlingEnd - BattleScript_FlingMissed: removeitem BS_ATTACKER goto BattleScript_MoveMissedPause diff --git a/include/battle.h b/include/battle.h index 1888c249de..1ec919c229 100644 --- a/include/battle.h +++ b/include/battle.h @@ -781,6 +781,7 @@ struct BattleStruct u8 hazardsCounter:4; // Counter for applying hazard on switch in enum SubmoveState submoveAnnouncement:2; u8 padding2:2; + u16 flingItem; }; struct AiBattleData diff --git a/include/battle_hold_effects.h b/include/battle_hold_effects.h index 5ee1d4a494..7ddace7782 100644 --- a/include/battle_hold_effects.h +++ b/include/battle_hold_effects.h @@ -20,7 +20,8 @@ struct HoldEffectInfo u32 leftovers:1; u32 orbs:1; u32 onEffect:1; - u32 padding:15; + u32 onFling:1; + u32 padding:14; }; extern const struct HoldEffectInfo gHoldEffectsInfo[]; @@ -48,5 +49,6 @@ bool32 IsOrbsActivation(enum HoldEffect holdEffect); bool32 IsOnEffectActivation(enum HoldEffect holdEffect); bool32 IsActivationForceTriggerItem(enum HoldEffect holdEffect); bool32 IsActivationOnBerry(enum HoldEffect holdEffect); +bool32 IsOnFlingActivation(enum HoldEffect holdEffect); #endif // GUARD_BATTLE_HOLD_EFFECTS diff --git a/include/battle_scripts.h b/include/battle_scripts.h index a0d99d9de3..d64d9812aa 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -14,6 +14,7 @@ extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissed[]; extern const u8 BattleScript_FlingFailConsumeItem[]; +extern const u8 BattleScript_FlingBlockedByShieldDust[]; extern const u8 BattleScript_FailedFromAtkCanceler[]; extern const u8 BattleScript_ButItFailed[]; extern const u8 BattleScript_StatUp[]; diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c index 907350cff5..b325956d9d 100644 --- a/src/battle_hold_effects.c +++ b/src/battle_hold_effects.c @@ -28,6 +28,7 @@ bool32 IsLeftoversActivation(enum HoldEffect holdEffect) { return gHol bool32 IsOrbsActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].orbs; } bool32 IsOnEffectActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onEffect; } bool32 IsActivationOnBerry(enum HoldEffect holdEffect) { return GetItemPocket(gLastUsedItem) == POCKET_BERRIES; } +bool32 IsOnFlingActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onFling; } bool32 IsActivationForceTriggerItem(enum HoldEffect holdEffect) { @@ -177,7 +178,7 @@ static enum ItemEffect RestoreWhiteHerbStats(u32 battler, ActivationTiming timin } if (effect != ITEM_NO_EFFECT) { - if (timing == IsWhiteHerbActivation) + if (timing == IsWhiteHerbActivation || timing == IsOnFlingActivation) BattleScriptCall(BattleScript_WhiteHerbRet); else BattleScriptExecute(BattleScript_WhiteHerbEnd2); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e74265b649..33ca053ad7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16332,14 +16332,68 @@ void BS_JumpIfCanGigantamax(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfLastUsedItemHoldEffect(void) +void BS_TryFlingHoldEffect(void) { - NATIVE_ARGS(u8 holdEffect, u16 secondaryId, const u8 *jumpInstr); - if (GetItemHoldEffect(gLastUsedItem) == cmd->holdEffect - && (cmd->secondaryId == 0 || GetItemSecondaryId(gLastUsedItem) == cmd->secondaryId)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else + NATIVE_ARGS(); + enum HoldEffect holdEffect = GetItemHoldEffect(gBattleStruct->flingItem); + gBattleStruct->flingItem = ITEM_NONE; + + if (IsMoveEffectBlockedByTarget(GetBattlerAbility(gBattlerTarget))) + { + gBattlescriptCurrInstr = BattleScript_FlingBlockedByShieldDust; + return; + } + + switch (holdEffect) + { + case HOLD_EFFECT_FLAME_ORB: + gBattlescriptCurrInstr = cmd->nextInstr - 1; + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; + SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); + break; + case HOLD_EFFECT_TOXIC_ORB: + gBattlescriptCurrInstr = cmd->nextInstr - 1; + gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; + SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); + break; + case HOLD_EFFECT_LIGHT_BALL: + gBattlescriptCurrInstr = cmd->nextInstr - 1; + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); + break; + case HOLD_EFFECT_TYPE_POWER: + if (GetItemSecondaryId(gLastUsedItem) != TYPE_POISON) + { + gBattlescriptCurrInstr = cmd->nextInstr; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr - 1; + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; + SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); + } + break; + case HOLD_EFFECT_FLINCH: + gBattlescriptCurrInstr = cmd->nextInstr - 1; + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; + SetMoveEffect(gBattlerAttacker, gBattlerTarget, FALSE, FALSE); + break; + case HOLD_EFFECT_MENTAL_HERB: + if (ItemBattleEffects(gBattlerTarget, 0, holdEffect, IsOnFlingActivation)) + return; + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; + case HOLD_EFFECT_WHITE_HERB: + if (ItemBattleEffects(gBattlerTarget, 0, holdEffect, IsOnFlingActivation)) + return; + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; + default: gBattlescriptCurrInstr = cmd->nextInstr; + break; + } } void BS_JumpIfNoWhiteOut(void) @@ -16507,6 +16561,7 @@ void BS_SetLastUsedItem(void) { NATIVE_ARGS(u8 battler); gLastUsedItem = gBattleMons[GetBattlerForBattleScript(cmd->battler)].item; + gBattleStruct->flingItem = gLastUsedItem; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17924,54 +17979,6 @@ void BS_SetPoltergeistMessage(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_CureCertainStatuses(void) -{ - NATIVE_ARGS(); - // Check infatuation - if (gBattleMons[gBattlerTarget].volatiles.infatuation) - { - gBattleMons[gBattlerTarget].volatiles.infatuation = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION - StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); - } - // Check taunt - if (gDisableStructs[gBattlerTarget].tauntTimer != 0) - { - gDisableStructs[gBattlerTarget].tauntTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); - } - // Check encore - if (gDisableStructs[gBattlerTarget].encoreTimer != 0) - { - gDisableStructs[gBattlerTarget].encoredMove = 0; - gDisableStructs[gBattlerTarget].encoreTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED - } - // Check torment - if (gBattleMons[gBattlerTarget].volatiles.torment == TRUE) - { - gBattleMons[gBattlerTarget].volatiles.torment = FALSE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT; - } - // Check heal block - if (gBattleMons[gBattlerTarget].volatiles.healBlock) - { - gBattleMons[gBattlerTarget].volatiles.healBlock = FALSE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK; - } - // Check disable - if (gDisableStructs[gBattlerTarget].disableTimer != 0) - { - gDisableStructs[gBattlerTarget].disableTimer = 0; - gDisableStructs[gBattlerTarget].disabledMove = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; - } - - gBattleScripting.battler = gBattlerTarget; - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_TryResetNegativeStatStages(void) { NATIVE_ARGS(); diff --git a/src/data/hold_effects.h b/src/data/hold_effects.h index f56b6811f9..221c9e166f 100644 --- a/src/data/hold_effects.h +++ b/src/data/hold_effects.h @@ -163,6 +163,7 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = .whiteHerb = TRUE, .whiteHerbFirstTurn = TRUE, .whiteHerbEndTurn = TRUE, + .onFling = TRUE, }, [HOLD_EFFECT_MACHO_BRACE] = @@ -185,6 +186,7 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = { .onTargetAfterHit = TRUE, .onAttackerAfterHit = TRUE, + .onFling = TRUE, }, [HOLD_EFFECT_CHOICE_BAND] = diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index 1efbd3fce7..4a3ca4597c 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -461,4 +461,25 @@ SINGLE_BATTLE_TEST("Fling deals damage based on items fling power") } } +SINGLE_BATTLE_TEST("Flinging a Mental Herb does not trigger the item if the target doesn't have anything that's cured by Mental Herb") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MENTAL_HERB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("The opposing Wobbuffet got over its infatuation!"); + MESSAGE("The opposing Wobbuffet's Taunt wore off!"); + MESSAGE("The opposing Wobbuffet ended its encore!"); + MESSAGE("The opposing Wobbuffet is no longer tormented!"); + MESSAGE("The opposing Wobbuffet's move is no longer disabled!"); + MESSAGE("The opposing Wobbuffet is cured of its heal block!"); + } + } +} + TO_DO_BATTLE_TEST("Fling deals damage based on a TM's move power") From eac5da89ad481f565dc118d1e2643469abe2f9fa Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Mon, 20 Oct 2025 15:31:42 +0200 Subject: [PATCH 085/183] Make movelist calculations happen during compilation instead of runtime (#7967) --- Makefile | 10 +- include/config/pokemon.h | 1 - include/constants/teaching_types.h | 34 + include/pokedex_plus_hgss.h | 2 + include/pokemon.h | 5 +- src/data/pokemon/special_movesets.json | 33 + src/data/pokemon/species_info.h | 1 + .../pokemon/species_info/gen_1_families.h | 13 +- .../pokemon/species_info/gen_2_families.h | 8 +- .../pokemon/species_info/gen_3_families.h | 8 +- .../pokemon/species_info/gen_4_families.h | 10 +- .../pokemon/species_info/gen_5_families.h | 2 +- .../pokemon/species_info/gen_6_families.h | 4 +- .../pokemon/species_info/gen_7_families.h | 5 +- .../pokemon/species_info/gen_8_families.h | 4 +- src/data/pokemon/teachable_learnsets.h | 26647 ++++++++++------ src/pokedex_plus_hgss.c | 223 +- src/pokemon.c | 83 +- tools/learnset_helpers/make_teachables.py | 150 +- tools/learnset_helpers/make_tutors.py | 68 + 20 files changed, 16937 insertions(+), 10374 deletions(-) create mode 100644 include/constants/teaching_types.h create mode 100644 src/data/pokemon/special_movesets.json create mode 100644 tools/learnset_helpers/make_tutors.py diff --git a/Makefile b/Makefile index 440202e61e..3f916dabec 100644 --- a/Makefile +++ b/Makefile @@ -212,6 +212,7 @@ LEARNSET_HELPERS_DIR := $(TOOLS_DIR)/learnset_helpers LEARNSET_HELPERS_DATA_DIR := $(LEARNSET_HELPERS_DIR)/porymoves_files LEARNSET_HELPERS_BUILD_DIR := $(LEARNSET_HELPERS_DIR)/build ALL_LEARNABLES_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_learnables.json +ALL_TUTORS_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_tutors.json # wild_encounters.h is generated by a Python script WILD_ENCOUNTERS_TOOL_DIR := $(TOOLS_DIR)/wild_encounters @@ -411,6 +412,8 @@ clean-generated: @echo "rm -f " @rm -f $(ALL_LEARNABLES_JSON) @echo "rm -f " + @rm -f $(ALL_TUTORS_JSON) + @echo "rm -f " $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast $(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member @@ -500,7 +503,7 @@ $(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt) $(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt $(RAMSCRGEN) ewram_data $< ENGLISH > $@ -TEACHABLE_DEPS := $(ALL_LEARNABLES_JSON) $(shell find data/ -type f -name '*.inc') $(INCLUDE_DIRS)/constants/tms_hms.h $(INCLUDE_DIRS)/config/pokemon.h $(C_SUBDIR)/pokemon.c +TEACHABLE_DEPS := $(ALL_LEARNABLES_JSON) $(ALL_TUTORS_JSON) $(INCLUDE_DIRS)/constants/tms_hms.h $(INCLUDE_DIRS)/config/pokemon.h $(INCLUDE_DIRS)/config/pokedex_plus_hgss.h $(LEARNSET_HELPERS_DIR)/make_teachables.py $(LEARNSET_HELPERS_BUILD_DIR): @mkdir -p $@ @@ -508,8 +511,11 @@ $(LEARNSET_HELPERS_BUILD_DIR): $(ALL_LEARNABLES_JSON): $(wildcard $(LEARNSET_HELPERS_DATA_DIR)/*.json) | $(LEARNSET_HELPERS_BUILD_DIR) python3 $(LEARNSET_HELPERS_DIR)/make_learnables.py $(LEARNSET_HELPERS_DATA_DIR) $@ +$(ALL_TUTORS_JSON): $(shell find data/ -type f -name '*.inc') $(LEARNSET_HELPERS_DIR)/make_tutors.py + python3 $(LEARNSET_HELPERS_DIR)/make_tutors.py $@ + $(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(TEACHABLE_DEPS) - python3 $(LEARNSET_HELPERS_DIR)/make_teachables.py $< + python3 $(LEARNSET_HELPERS_DIR)/make_teachables.py $< $(ALL_TUTORS_JSON) # Linker script LD_SCRIPT := ld_script_modern.ld diff --git a/include/config/pokemon.h b/include/config/pokemon.h index fdee4e8ad2..d2af42ea08 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -64,7 +64,6 @@ // Learnset helper toggles #define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/make_teachables.py using the included JSON files based on available TMs and tutors. -#define P_TUTOR_MOVES_ARRAY FALSE // If TRUE, generates a gTutorMoves array automatically using make_teachables.py. (generally not needed, but the HGSS Pokedex has an optional use for it) // Flag settings // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. diff --git a/include/constants/teaching_types.h b/include/constants/teaching_types.h new file mode 100644 index 0000000000..63fd9daa95 --- /dev/null +++ b/include/constants/teaching_types.h @@ -0,0 +1,34 @@ +#ifndef GUARD_CONSTANTS_TEACHING_TYPES_H +#define GUARD_CONSTANTS_TEACHING_TYPES_H + +/* +Teaching Types are not used directly by the ROM but they are used by +make_teachables.py to generate teachable learnsets. To save ROM space, the info is +stored in 1 bit and the python script reads the name of the define. +This means we can have multiple "modes" that define to 1. +You can add additional teaching types but they would need to be described in the +python script. +*/ + + +/* DEFAULT_LEARNING +Vanilla uses: most pokemon +Allow a pokemon to learn all universal moves +*/ +#define DEFAULT_LEARNING 0 + +/* TM_ILLITERATE +Vanilla uses: pokemon with "gimmick" moveset (Ditto, Smeargle, Magikarp, ...) +Pokemon can't learn any universal moves (unless it was added to their teachable learnset) +*/ +#define TM_ILLITERATE 1 + +/* ALL_TEACHABLES +Vanilla uses: Mew +Allows a pokemon to learn almost every teachable move (whether from TM or tutors) +Some moves are excluded, they are listed in SignatureTeachables +*/ +#define ALL_TEACHABLES 1 + + +#endif // GUARD_CONSTANTS_TEACHING_TYPES_H diff --git a/include/pokedex_plus_hgss.h b/include/pokedex_plus_hgss.h index a309924236..9486eea8c7 100644 --- a/include/pokedex_plus_hgss.h +++ b/include/pokedex_plus_hgss.h @@ -1,6 +1,8 @@ #ifndef GUARD_POKEDEX_PLUS_HGSS_H #define GUARD_POKEDEX_PLUS_HGSS_H +extern const u16 gTutorMoves[]; + void CB2_OpenPokedexPlusHGSS(void); void Task_DisplayCaughtMonDexPageHGSS(u8); diff --git a/include/pokemon.h b/include/pokemon.h index 08313fb95b..fd6855bf82 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -505,7 +505,7 @@ struct SpeciesInfo /*0xC4*/ u32 cannotBeTraded:1; u32 perfectIVCount:3; // This species will always generate with the specified amount of perfect IVs. u32 dexForceRequired:1; // This species will be taken into account for Pokédex ratings even if they have the "isMythical" flag set. - u32 tmIlliterate:1; // This species will be unable to learn the universal moves. + u32 teachingType:1; // Not used in the ROM but used in compilation (check constants/teaching_types.h for explanations) u32 isFrontierBanned:1; // This species is not allowed to participate in Battle Frontier facilities. u32 padding4:11; // Shadow settings @@ -700,9 +700,8 @@ extern const struct SpriteTemplate gBattlerSpriteTemplates[]; extern const u32 sExpCandyExperienceTable[]; extern const struct AbilityInfo gAbilitiesInfo[]; extern const struct NatureInfo gNaturesInfo[]; -#if P_TUTOR_MOVES_ARRAY + extern const u16 gTutorMoves[]; -#endif // P_TUTOR_MOVES_ARRAY void ZeroBoxMonData(struct BoxPokemon *boxMon); void ZeroMonData(struct Pokemon *mon); diff --git a/src/data/pokemon/special_movesets.json b/src/data/pokemon/special_movesets.json new file mode 100644 index 0000000000..82302b152a --- /dev/null +++ b/src/data/pokemon/special_movesets.json @@ -0,0 +1,33 @@ +{ + "universalMoves": + [ + "MOVE_BIDE", + "MOVE_FRUSTRATION", + "MOVE_HIDDEN_POWER", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_RAGE", + "MOVE_RETURN", + "MOVE_SECRET_POWER", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST" + ], + "signatureTeachables": + [ + "MOVE_BADDY_BAD", + "MOVE_BOUNCY_BUBBLE", + "MOVE_BUZZY_BUZZ", + "MOVE_DRAGON_ASCENT", + "MOVE_FLOATY_FALL", + "MOVE_FREEZY_FROST", + "MOVE_GLITZY_GLOW", + "MOVE_RELIC_SONG", + "MOVE_SAPPY_SEED", + "MOVE_SECRET_SWORD", + "MOVE_SIZZLY_SLIDE", + "MOVE_SPARKLY_SWIRL", + "MOVE_SPLISHY_SPLASH", + "MOVE_VOLT_TACKLE", + "MOVE_ZIPPY_ZAP" + ] +} diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 0cd1d5b1ac..4cf63f9bac 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -1,4 +1,5 @@ #include "constants/abilities.h" +#include "constants/teaching_types.h" #include "species_info/shared_dex_text.h" #include "species_info/shared_front_pic_anims.h" diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index a661147349..929db7dae7 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -1188,7 +1188,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Caterpie, gShinyOverworldPalette_Caterpie ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sCaterpieLevelUpLearnset, .teachableLearnset = sCaterpieTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_METAPOD}), @@ -1256,7 +1256,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Metapod, gShinyOverworldPalette_Metapod ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sMetapodLevelUpLearnset, .teachableLearnset = sMetapodTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BUTTERFREE}), @@ -1499,7 +1499,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Weedle, gShinyOverworldPalette_Weedle ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWeedleLevelUpLearnset, .teachableLearnset = sWeedleTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_KAKUNA}), @@ -1577,7 +1577,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Kakuna, gShinyOverworldPalette_Kakuna ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sKakunaLevelUpLearnset, .teachableLearnset = sKakunaTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BEEDRILL}), @@ -17203,7 +17203,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = TRACKS_SPOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sMagikarpLevelUpLearnset, .teachableLearnset = sMagikarpTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_GYARADOS}), @@ -17565,7 +17565,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Ditto, gShinyOverworldPalette_Ditto ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sDittoLevelUpLearnset, .teachableLearnset = sDittoTeachableLearnset, }, @@ -20239,6 +20239,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .isMythical = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, + .teachingType = ALL_TEACHABLES, .levelUpLearnset = sMewLevelUpLearnset, .teachableLearnset = sMewTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 98e856aae5..7d15ca7185 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -3970,9 +3970,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Unown, \ gShinyOverworldPalette_Unown, \ ) \ + .teachingType = TM_ILLITERATE, \ .levelUpLearnset = sUnownLevelUpLearnset, \ .teachableLearnset = sUnownTeachableLearnset, \ - .tmIlliterate = TRUE, \ .formSpeciesIdTable = sUnownFormSpeciesIdTable, \ } @@ -4074,7 +4074,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Wynaut, gShinyOverworldPalette_Wynaut ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWynautLevelUpLearnset, .teachableLearnset = sWynautTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 15, SPECIES_WOBBUFFET}), @@ -4163,7 +4163,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = TRACKS_FOOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWobbuffetLevelUpLearnset, .teachableLearnset = sWobbuffetTeachableLearnset, }, @@ -7697,7 +7697,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Smeargle, gShinyOverworldPalette_Smeargle ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sSmeargleLevelUpLearnset, .teachableLearnset = sSmeargleTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 6ad30646cf..9b9ba688c5 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -1501,7 +1501,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Wurmple, gShinyOverworldPalette_Wurmple ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWurmpleLevelUpLearnset, .teachableLearnset = sWurmpleTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_SILCOON, CONDITIONS({IF_PID_UPPER_MODULO_10_GT, 4})}, @@ -1571,7 +1571,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Silcoon, gShinyOverworldPalette_Silcoon ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sSilcoonLevelUpLearnset, .teachableLearnset = sSilcoonTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BEAUTIFLY}), @@ -1744,7 +1744,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Cascoon, gShinyOverworldPalette_Cascoon ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sCascoonLevelUpLearnset, .teachableLearnset = sCascoonTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_DUSTOX}), @@ -11668,7 +11668,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Beldum, gShinyOverworldPalette_Beldum ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBeldumLevelUpLearnset, .teachableLearnset = sBeldumTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_METANG}), diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index 84edb98987..f5a474137a 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -1183,7 +1183,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = TRACKS_FOOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sKricketotLevelUpLearnset, .teachableLearnset = sKricketotTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_KRICKETUNE}), @@ -1865,7 +1865,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmyPlant, gShinyOverworldPalette_BurmyPlant ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -1934,7 +1934,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmySandy, gShinyOverworldPalette_BurmySandy ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -2003,7 +2003,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmyTrash, gShinyOverworldPalette_BurmyTrash ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -2360,7 +2360,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = TRACKS_FOOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sCombeeLevelUpLearnset, .teachableLearnset = sCombeeTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 21, SPECIES_VESPIQUEN, CONDITIONS({IF_GENDER, MON_FEMALE})}), diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 1b5e484ab8..4f61b3141e 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -9394,7 +9394,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Tynamo, gShinyOverworldPalette_Tynamo ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sTynamoLevelUpLearnset, .teachableLearnset = sTynamoTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 39, SPECIES_EELEKTRIK}), diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 03bfc713f2..5e882ad353 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -1169,7 +1169,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Scatterbug, \ gShinyOverworldPalette_Scatterbug \ ) \ - .tmIlliterate = TRUE, \ + .teachingType = TM_ILLITERATE, \ .levelUpLearnset = sScatterbugLevelUpLearnset, \ .teachableLearnset = sScatterbugTeachableLearnset, \ .eggMoveLearnset = sScatterbugEggMoveLearnset, \ @@ -1253,7 +1253,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Spewpa, \ gShinyOverworldPalette_Spewpa \ ) \ - .tmIlliterate = TRUE, \ + .teachingType = TM_ILLITERATE, \ .levelUpLearnset = sSpewpaLevelUpLearnset, \ .teachableLearnset = sSpewpaTeachableLearnset, \ .formSpeciesIdTable = sSpewpaFormSpeciesIdTable, \ diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index 3877ee2705..8feb551fa6 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -4291,6 +4291,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Pyukumuku, gShinyOverworldPalette_Pyukumuku ) + .teachingType = TM_ILLITERATE, .levelUpLearnset = sPyukumukuLevelUpLearnset, .teachableLearnset = sPyukumukuTeachableLearnset, .eggMoveLearnset = sPyukumukuEggMoveLearnset, @@ -5900,7 +5901,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Cosmog ) .isLegendary = TRUE, - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmogLevelUpLearnset, @@ -5970,7 +5971,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Cosmoem ) .isLegendary = TRUE, - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmoemLevelUpLearnset, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 6ba7fed676..08f22c19aa 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -1230,7 +1230,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Blipbug, gShinyOverworldPalette_Blipbug ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBlipbugLevelUpLearnset, .teachableLearnset = sBlipbugTeachableLearnset, .eggMoveLearnset = sBlipbugEggMoveLearnset, @@ -2461,7 +2461,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Applin, gShinyOverworldPalette_Applin ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sApplinLevelUpLearnset, .teachableLearnset = sApplinTeachableLearnset, .eggMoveLearnset = sApplinEggMoveLearnset, diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index 8b400f5675..7c72a171ec 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -2,111 +2,111 @@ // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py // -// *************************************************** // -// TM/HM moves found in "include/constants/tms_hms.h": // -// - MOVE_FOCUS_PUNCH // -// - MOVE_DRAGON_CLAW // -// - MOVE_WATER_PULSE // -// - MOVE_CALM_MIND // -// - MOVE_ROAR // -// - MOVE_TOXIC // -// - MOVE_HAIL // -// - MOVE_BULK_UP // -// - MOVE_BULLET_SEED // -// - MOVE_HIDDEN_POWER // -// - MOVE_SUNNY_DAY // -// - MOVE_TAUNT // -// - MOVE_ICE_BEAM // -// - MOVE_BLIZZARD // -// - MOVE_HYPER_BEAM // -// - MOVE_LIGHT_SCREEN // -// - MOVE_PROTECT // -// - MOVE_RAIN_DANCE // -// - MOVE_GIGA_DRAIN // -// - MOVE_SAFEGUARD // -// - MOVE_FRUSTRATION // -// - MOVE_SOLAR_BEAM // -// - MOVE_IRON_TAIL // -// - MOVE_THUNDERBOLT // -// - MOVE_THUNDER // -// - MOVE_EARTHQUAKE // -// - MOVE_RETURN // -// - MOVE_DIG // -// - MOVE_PSYCHIC // -// - MOVE_SHADOW_BALL // -// - MOVE_BRICK_BREAK // -// - MOVE_DOUBLE_TEAM // -// - MOVE_REFLECT // -// - MOVE_SHOCK_WAVE // -// - MOVE_FLAMETHROWER // -// - MOVE_SLUDGE_BOMB // -// - MOVE_SANDSTORM // -// - MOVE_FIRE_BLAST // -// - MOVE_ROCK_TOMB // -// - MOVE_AERIAL_ACE // -// - MOVE_TORMENT // -// - MOVE_FACADE // -// - MOVE_SECRET_POWER // -// - MOVE_REST // -// - MOVE_ATTRACT // -// - MOVE_THIEF // -// - MOVE_STEEL_WING // -// - MOVE_SKILL_SWAP // -// - MOVE_SNATCH // -// - MOVE_OVERHEAT // -// - MOVE_CUT // -// - MOVE_FLY // -// - MOVE_SURF // -// - MOVE_STRENGTH // -// - MOVE_FLASH // -// - MOVE_ROCK_SMASH // -// - MOVE_WATERFALL // -// - MOVE_DIVE // -// *************************************************** // -// Tutor moves found from map scripts: // -// - MOVE_BODY_SLAM // -// - MOVE_COUNTER // -// - MOVE_DEFENSE_CURL // -// - MOVE_DOUBLE_EDGE // -// - MOVE_DREAM_EATER // -// - MOVE_DYNAMIC_PUNCH // -// - MOVE_ENDURE // -// - MOVE_EXPLOSION // -// - MOVE_FIRE_PUNCH // -// - MOVE_FURY_CUTTER // -// - MOVE_ICE_PUNCH // -// - MOVE_ICY_WIND // -// - MOVE_MEGA_KICK // -// - MOVE_MEGA_PUNCH // -// - MOVE_METRONOME // -// - MOVE_MIMIC // -// - MOVE_MUD_SLAP // -// - MOVE_PSYCH_UP // -// - MOVE_ROCK_SLIDE // -// - MOVE_ROLLOUT // -// - MOVE_SEISMIC_TOSS // -// - MOVE_SLEEP_TALK // -// - MOVE_SNORE // -// - MOVE_SOFT_BOILED // -// - MOVE_SUBSTITUTE // -// - MOVE_SWAGGER // -// - MOVE_SWIFT // -// - MOVE_SWORDS_DANCE // -// - MOVE_THUNDER_PUNCH // -// - MOVE_THUNDER_WAVE // -// *************************************************** // -// Near-universal moves found from sUniversalMoves: // -// - MOVE_BIDE // -// - MOVE_FRUSTRATION // -// - MOVE_HIDDEN_POWER // -// - MOVE_MIMIC // -// - MOVE_NATURAL_GIFT // -// - MOVE_RAGE // -// - MOVE_RETURN // -// - MOVE_SECRET_POWER // -// - MOVE_SUBSTITUTE // -// - MOVE_TERA_BLAST // -// *************************************************** // +// ********************************************************* // +// TM/HM moves found in "include/constants/tms_hms.h": // +// - MOVE_AERIAL_ACE // +// - MOVE_ATTRACT // +// - MOVE_BLIZZARD // +// - MOVE_BRICK_BREAK // +// - MOVE_BULK_UP // +// - MOVE_BULLET_SEED // +// - MOVE_CALM_MIND // +// - MOVE_CUT // +// - MOVE_DIG // +// - MOVE_DIVE // +// - MOVE_DOUBLE_TEAM // +// - MOVE_DRAGON_CLAW // +// - MOVE_EARTHQUAKE // +// - MOVE_FACADE // +// - MOVE_FIRE_BLAST // +// - MOVE_FLAMETHROWER // +// - MOVE_FLASH // +// - MOVE_FLY // +// - MOVE_FOCUS_PUNCH // +// - MOVE_FRUSTRATION // +// - MOVE_GIGA_DRAIN // +// - MOVE_HAIL // +// - MOVE_HIDDEN_POWER // +// - MOVE_HYPER_BEAM // +// - MOVE_ICE_BEAM // +// - MOVE_IRON_TAIL // +// - MOVE_LIGHT_SCREEN // +// - MOVE_OVERHEAT // +// - MOVE_PROTECT // +// - MOVE_PSYCHIC // +// - MOVE_RAIN_DANCE // +// - MOVE_REFLECT // +// - MOVE_REST // +// - MOVE_RETURN // +// - MOVE_ROAR // +// - MOVE_ROCK_SMASH // +// - MOVE_ROCK_TOMB // +// - MOVE_SAFEGUARD // +// - MOVE_SANDSTORM // +// - MOVE_SECRET_POWER // +// - MOVE_SHADOW_BALL // +// - MOVE_SHOCK_WAVE // +// - MOVE_SKILL_SWAP // +// - MOVE_SLUDGE_BOMB // +// - MOVE_SNATCH // +// - MOVE_SOLAR_BEAM // +// - MOVE_STEEL_WING // +// - MOVE_STRENGTH // +// - MOVE_SUNNY_DAY // +// - MOVE_SURF // +// - MOVE_TAUNT // +// - MOVE_THIEF // +// - MOVE_THUNDER // +// - MOVE_THUNDERBOLT // +// - MOVE_TORMENT // +// - MOVE_TOXIC // +// - MOVE_WATERFALL // +// - MOVE_WATER_PULSE // +// ********************************************************* // +// Tutor moves found from map scripts: // +// - MOVE_BODY_SLAM // +// - MOVE_COUNTER // +// - MOVE_DEFENSE_CURL // +// - MOVE_DOUBLE_EDGE // +// - MOVE_DREAM_EATER // +// - MOVE_DYNAMIC_PUNCH // +// - MOVE_ENDURE // +// - MOVE_EXPLOSION // +// - MOVE_FIRE_PUNCH // +// - MOVE_FURY_CUTTER // +// - MOVE_ICE_PUNCH // +// - MOVE_ICY_WIND // +// - MOVE_MEGA_KICK // +// - MOVE_MEGA_PUNCH // +// - MOVE_METRONOME // +// - MOVE_MIMIC // +// - MOVE_MUD_SLAP // +// - MOVE_PSYCH_UP // +// - MOVE_ROCK_SLIDE // +// - MOVE_ROLLOUT // +// - MOVE_SEISMIC_TOSS // +// - MOVE_SLEEP_TALK // +// - MOVE_SNORE // +// - MOVE_SOFT_BOILED // +// - MOVE_SUBSTITUTE // +// - MOVE_SWAGGER // +// - MOVE_SWIFT // +// - MOVE_SWORDS_DANCE // +// - MOVE_THUNDER_PUNCH // +// - MOVE_THUNDER_WAVE // +// ********************************************************* // +// Near-universal moves found in data/special_movesets.json: // +// - MOVE_BIDE // +// - MOVE_FRUSTRATION // +// - MOVE_HIDDEN_POWER // +// - MOVE_MIMIC // +// - MOVE_NATURAL_GIFT // +// - MOVE_RAGE // +// - MOVE_RETURN // +// - MOVE_SECRET_POWER // +// - MOVE_SUBSTITUTE // +// - MOVE_TERA_BLAST // +// ********************************************************* // static const u16 sNoneTeachableLearnset[] = { MOVE_UNAVAILABLE, @@ -115,101 +115,119 @@ static const u16 sNoneTeachableLearnset[] = { #if P_FAMILY_BULBASAUR static const u16 sBulbasaurTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sIvysaurTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVenusaurTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BULBASAUR @@ -218,141 +236,159 @@ static const u16 sVenusaurTeachableLearnset[] = { static const u16 sCharmanderTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCharmeleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCharizardTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHARMANDER @@ -361,132 +397,150 @@ static const u16 sCharizardTeachableLearnset[] = { static const u16 sSquirtleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sWartortleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sBlastoiseTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SQUIRTLE @@ -504,31 +558,37 @@ static const u16 sMetapodTeachableLearnset[] = { static const u16 sButterfreeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CATERPIE @@ -547,28 +607,34 @@ static const u16 sBeedrillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WEEDLE @@ -577,73 +643,91 @@ static const u16 sBeedrillTeachableLearnset[] = { static const u16 sPidgeyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPidgeottoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPidgeotTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIDGEY @@ -652,78 +736,90 @@ static const u16 sPidgeotTeachableLearnset[] = { static const u16 sRattataTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sRaticateTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -731,29 +827,35 @@ static const u16 sRaticateTeachableLearnset[] = { static const u16 sRattataAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -761,32 +863,38 @@ static const u16 sRaticateAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -796,47 +904,59 @@ static const u16 sRaticateAlolaTeachableLearnset[] = { static const u16 sSpearowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sFearowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPEAROW @@ -844,62 +964,74 @@ static const u16 sFearowTeachableLearnset[] = { #if P_FAMILY_EKANS static const u16 sEkansTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sArbokTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_EKANS @@ -908,165 +1040,189 @@ static const u16 sArbokTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sPichuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sPikachuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sRaichuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sRaichuAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -1076,81 +1232,93 @@ static const u16 sRaichuAlolaTeachableLearnset[] = { static const u16 sSandshrewTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSandslashTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1159,38 +1327,44 @@ static const u16 sSandshrewAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1198,39 +1372,45 @@ static const u16 sSandslashAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -1241,35 +1421,41 @@ static const u16 sNidoranFTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -1277,35 +1463,41 @@ static const u16 sNidorinaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -1313,186 +1505,210 @@ static const u16 sNidoqueenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sNidoranMTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sNidorinoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sNidokingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NIDORAN @@ -1501,47 +1717,53 @@ static const u16 sNidokingTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sCleffaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -1549,123 +1771,135 @@ static const u16 sCleffaTeachableLearnset[] = { static const u16 sClefairyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SOFT_BOILED, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sClefableTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SOFT_BOILED, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLEFAIRY @@ -1673,60 +1907,72 @@ static const u16 sClefableTeachableLearnset[] = { #if P_FAMILY_VULPIX static const u16 sVulpixTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sNinetalesTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1734,60 +1980,72 @@ static const u16 sNinetalesTeachableLearnset[] = { static const u16 sVulpixAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sNinetalesAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -1797,43 +2055,49 @@ static const u16 sNinetalesAlolaTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sIgglybuffTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -1841,121 +2105,133 @@ static const u16 sIgglybuffTeachableLearnset[] = { static const u16 sJigglypuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sWigglytuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JIGGLYPUFF @@ -1964,57 +2240,69 @@ static const u16 sWigglytuffTeachableLearnset[] = { static const u16 sZubatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sGolbatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -2022,29 +2310,35 @@ static const u16 sGolbatTeachableLearnset[] = { static const u16 sCrobatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -2055,23 +2349,29 @@ static const u16 sOddishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -2079,50 +2379,62 @@ static const u16 sGloomTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVileplumeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -2131,24 +2443,30 @@ static const u16 sBellossomTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -2158,67 +2476,79 @@ static const u16 sBellossomTeachableLearnset[] = { static const u16 sParasTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sParasectTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PARAS @@ -2226,54 +2556,66 @@ static const u16 sParasectTeachableLearnset[] = { #if P_FAMILY_VENONAT static const u16 sVenonatTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sVenomothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VENONAT @@ -2282,59 +2624,71 @@ static const u16 sVenomothTeachableLearnset[] = { static const u16 sDiglettTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sDugtrioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -2342,54 +2696,66 @@ static const u16 sDugtrioTeachableLearnset[] = { static const u16 sDiglettAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sDugtrioAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -2399,80 +2765,92 @@ static const u16 sDugtrioAlolaTeachableLearnset[] = { static const u16 sMeowthTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sPersianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -2480,72 +2858,84 @@ static const u16 sPersianTeachableLearnset[] = { static const u16 sMeowthAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sPersianAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -2554,55 +2944,67 @@ static const u16 sPersianAlolaTeachableLearnset[] = { static const u16 sMeowthGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sPerrserkerTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -2613,48 +3015,54 @@ static const u16 sPsyduckTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -2662,50 +3070,56 @@ static const u16 sGolduckTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PSYDUCK @@ -2714,130 +3128,148 @@ static const u16 sGolduckTeachableLearnset[] = { static const u16 sMankeyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sPrimeapeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sAnnihilapeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -2848,116 +3280,140 @@ static const u16 sAnnihilapeTeachableLearnset[] = { static const u16 sGrowlitheTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sArcanineTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sGrowlitheHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sArcanineHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -2967,124 +3423,142 @@ static const u16 sArcanineHisuiTeachableLearnset[] = { static const u16 sPoliwagTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPoliwhirlTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sPoliwrathTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -3092,45 +3566,51 @@ static const u16 sPoliwrathTeachableLearnset[] = { static const u16 sPolitoedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -3139,142 +3619,160 @@ static const u16 sPolitoedTeachableLearnset[] = { #if P_FAMILY_ABRA static const u16 sAbraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sKadabraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sAlakazamTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ABRA @@ -3282,125 +3780,143 @@ static const u16 sAlakazamTeachableLearnset[] = { #if P_FAMILY_MACHOP static const u16 sMachopTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMachokeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMachampTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MACHOP @@ -3410,79 +3926,97 @@ static const u16 sBellsproutTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sWeepinbellTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVictreebelTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BELLSPROUT @@ -3493,30 +4027,36 @@ static const u16 sTentacoolTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -3525,31 +4065,37 @@ static const u16 sTentacruelTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TENTACOOL @@ -3557,244 +4103,280 @@ static const u16 sTentacruelTeachableLearnset[] = { #if P_FAMILY_GEODUDE static const u16 sGeodudeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGravelerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGolemTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROAR, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sGeodudeAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGravelerAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGolemAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -3803,92 +4385,116 @@ static const u16 sGolemAlolaTeachableLearnset[] = { #if P_FAMILY_PONYTA static const u16 sPonytaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sRapidashTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sPonytaGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sRapidashGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, @@ -3900,45 +4506,51 @@ static const u16 sRapidashGalarTeachableLearnset[] = { static const u16 sSlowpokeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -3946,57 +4558,63 @@ static const u16 sSlowbroTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -4004,61 +4622,67 @@ static const u16 sSlowbroTeachableLearnset[] = { static const u16 sSlowkingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -4067,82 +4691,94 @@ static const u16 sSlowkingTeachableLearnset[] = { static const u16 sSlowpokeGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sSlowbroGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -4150,48 +4786,54 @@ static const u16 sSlowbroGalarTeachableLearnset[] = { static const u16 sSlowkingGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -4200,90 +4842,108 @@ static const u16 sSlowkingGalarTeachableLearnset[] = { #if P_FAMILY_MAGNEMITE static const u16 sMagnemiteTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sMagnetonTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sMagnezoneTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -4293,69 +4953,87 @@ static const u16 sMagnezoneTeachableLearnset[] = { static const u16 sFarfetchdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sFarfetchdGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_FACADE, MOVE_FURY_CUTTER, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROCK_SMASH, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sSirfetchdTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_FACADE, MOVE_FURY_CUTTER, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROCK_SMASH, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -4366,55 +5044,67 @@ static const u16 sSirfetchdTeachableLearnset[] = { static const u16 sDoduoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sDodrioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DODUO @@ -4423,59 +5113,71 @@ static const u16 sDodrioTeachableLearnset[] = { static const u16 sSeelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sDewgongTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEEL @@ -4483,170 +5185,194 @@ static const u16 sDewgongTeachableLearnset[] = { #if P_FAMILY_GRIMER static const u16 sGrimerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sMukTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sGrimerAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sMukAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -4657,57 +5383,69 @@ static const u16 sShellderTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sCloysterTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHELLDER @@ -4716,117 +5454,135 @@ static const u16 sCloysterTeachableLearnset[] = { static const u16 sGastlyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FIRE_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sHaunterTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FIRE_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_METRONOME, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sGengarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_FOCUS_PUNCH, - MOVE_GIGA_DRAIN, - MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_PROTECT, - MOVE_PSYCHIC, + MOVE_MIMIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GASTLY @@ -4834,70 +5590,82 @@ static const u16 sGengarTeachableLearnset[] = { #if P_FAMILY_ONIX static const u16 sOnixTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_GEN_2_CROSS_EVOS static const u16 sSteelixTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -4906,92 +5674,104 @@ static const u16 sSteelixTeachableLearnset[] = { #if P_FAMILY_DROWZEE static const u16 sDrowzeeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sHypnoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DROWZEE @@ -5000,177 +5780,213 @@ static const u16 sHypnoTeachableLearnset[] = { static const u16 sKrabbyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sKinglerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KRABBY #if P_FAMILY_VOLTORB static const u16 sVoltorbTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sElectrodeTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sVoltorbHisuiTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sElectrodeHisuiTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -5181,105 +5997,123 @@ static const u16 sElectrodeHisuiTeachableLearnset[] = { static const u16 sExeggcuteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sExeggutorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sExeggutorAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -5290,44 +6124,50 @@ static const u16 sCuboneTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -5335,45 +6175,51 @@ static const u16 sMarowakTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -5382,45 +6228,51 @@ static const u16 sMarowakAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -5430,110 +6282,128 @@ static const u16 sMarowakAlolaTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sTyrogueTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sHitmonleeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sHitmonchanTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, - MOVE_EARTHQUAKE, MOVE_ENDURE, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -5541,35 +6411,41 @@ static const u16 sHitmonchanTeachableLearnset[] = { static const u16 sHitmontopTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -5579,57 +6455,63 @@ static const u16 sHitmontopTeachableLearnset[] = { static const u16 sLickitungTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -5637,55 +6519,61 @@ static const u16 sLickitungTeachableLearnset[] = { static const u16 sLickilickyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -5694,90 +6582,108 @@ static const u16 sLickilickyTeachableLearnset[] = { #if P_FAMILY_KOFFING static const u16 sKoffingTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sWeezingTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sWeezingGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -5787,93 +6693,105 @@ static const u16 sWeezingGalarTeachableLearnset[] = { static const u16 sRhyhornTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sRhydonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -5881,51 +6799,57 @@ static const u16 sRhydonTeachableLearnset[] = { static const u16 sRhyperiorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -5936,40 +6860,46 @@ static const u16 sRhyperiorTeachableLearnset[] = { static const u16 sHappinyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_ICY_WIND, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -5977,66 +6907,72 @@ static const u16 sHappinyTeachableLearnset[] = { static const u16 sChanseyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SOFT_BOILED, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -6044,65 +6980,71 @@ static const u16 sChanseyTeachableLearnset[] = { static const u16 sBlisseyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SOFT_BOILED, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -6111,31 +7053,37 @@ static const u16 sBlisseyTeachableLearnset[] = { #if P_FAMILY_TANGELA static const u16 sTangelaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -6143,36 +7091,42 @@ static const u16 sTangelaTeachableLearnset[] = { static const u16 sTangrowthTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -6183,56 +7137,62 @@ static const u16 sKangaskhanTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KANGASKHAN @@ -6242,24 +7202,30 @@ static const u16 sHorseaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -6267,25 +7233,31 @@ static const u16 sSeadraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -6293,27 +7265,33 @@ static const u16 sSeadraTeachableLearnset[] = { static const u16 sKingdraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -6323,59 +7301,71 @@ static const u16 sKingdraTeachableLearnset[] = { static const u16 sGoldeenTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sSeakingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOLDEEN @@ -6385,33 +7375,39 @@ static const u16 sStaryuTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -6419,36 +7415,42 @@ static const u16 sStarmieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STARYU @@ -6460,37 +7462,43 @@ static const u16 sMimeJrTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -6498,52 +7506,58 @@ static const u16 sMimeJrTeachableLearnset[] = { static const u16 sMrMimeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -6551,36 +7565,42 @@ static const u16 sMrMimeTeachableLearnset[] = { static const u16 sMrMimeGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -6588,36 +7608,42 @@ static const u16 sMrMimeGalarTeachableLearnset[] = { static const u16 sMrRimeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -6630,29 +7656,35 @@ static const u16 sScytherTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6662,31 +7694,37 @@ static const u16 sScizorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -6696,26 +7734,32 @@ static const u16 sKleavorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_GEN_8_CROSS_EVOS @@ -6726,40 +7770,46 @@ static const u16 sKleavorTeachableLearnset[] = { static const u16 sSmoochumTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -6767,45 +7817,51 @@ static const u16 sSmoochumTeachableLearnset[] = { static const u16 sJynxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JYNX @@ -6814,136 +7870,154 @@ static const u16 sJynxTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sElekidTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sElectabuzzTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sElectivireTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -6953,119 +8027,137 @@ static const u16 sElectivireTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sMagbyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sMagmarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sMagmortarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -7074,34 +8166,40 @@ static const u16 sMagmortarTeachableLearnset[] = { #if P_FAMILY_PINSIR static const u16 sPinsirTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PINSIR @@ -7110,112 +8208,136 @@ static const u16 sPinsirTeachableLearnset[] = { static const u16 sTaurosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_PALDEAN_FORMS static const u16 sTaurosPaldeaCombatTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sTaurosPaldeaBlazeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sTaurosPaldeaAquaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_PALDEAN_FORMS @@ -7229,41 +8351,47 @@ static const u16 sMagikarpTeachableLearnset[] = { static const u16 sGyaradosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAGIKARP @@ -7272,39 +8400,45 @@ static const u16 sGyaradosTeachableLearnset[] = { static const u16 sLaprasTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LAPRAS @@ -7318,208 +8452,244 @@ static const u16 sDittoTeachableLearnset[] = { #if P_FAMILY_EEVEE static const u16 sEeveeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVaporeonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sJolteonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sFlareonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_2_CROSS_EVOS static const u16 sEspeonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sUmbreonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -7528,68 +8698,80 @@ static const u16 sUmbreonTeachableLearnset[] = { static const u16 sLeafeonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGlaceonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -7597,36 +8779,42 @@ static const u16 sGlaceonTeachableLearnset[] = { #if P_GEN_6_CROSS_EVOS static const u16 sSylveonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_6_CROSS_EVOS @@ -7636,35 +8824,41 @@ static const u16 sSylveonTeachableLearnset[] = { static const u16 sPorygonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -7672,35 +8866,41 @@ static const u16 sPorygonTeachableLearnset[] = { static const u16 sPorygon2TeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -7708,35 +8908,41 @@ static const u16 sPorygon2TeachableLearnset[] = { static const u16 sPorygonZTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -7747,66 +8953,78 @@ static const u16 sPorygonZTeachableLearnset[] = { static const u16 sOmanyteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sOmastarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_OMANYTE @@ -7816,34 +9034,40 @@ static const u16 sKabutoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -7851,42 +9075,48 @@ static const u16 sKabutopsTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KABUTO @@ -7895,37 +9125,43 @@ static const u16 sKabutopsTeachableLearnset[] = { static const u16 sAerodactylTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AERODACTYL @@ -7935,51 +9171,57 @@ static const u16 sAerodactylTeachableLearnset[] = { static const u16 sMunchlaxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SNATCH, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SANDSTORM, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, - MOVE_SNATCH, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -7987,56 +9229,62 @@ static const u16 sMunchlaxTeachableLearnset[] = { static const u16 sSnorlaxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SNATCH, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, - MOVE_SNATCH, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNORLAX @@ -8045,32 +9293,38 @@ static const u16 sSnorlaxTeachableLearnset[] = { static const u16 sArticunoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -8078,10 +9332,10 @@ static const u16 sArticunoTeachableLearnset[] = { static const u16 sArticunoGalarTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -8089,12 +9343,18 @@ static const u16 sArticunoGalarTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -8104,34 +9364,40 @@ static const u16 sArticunoGalarTeachableLearnset[] = { #if P_FAMILY_ZAPDOS static const u16 sZapdosTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -8140,25 +9406,31 @@ static const u16 sZapdosGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_TAUNT, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -8167,55 +9439,67 @@ static const u16 sZapdosGalarTeachableLearnset[] = { #if P_FAMILY_MOLTRES static const u16 sMoltresTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sMoltresGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -8225,74 +9509,86 @@ static const u16 sMoltresGalarTeachableLearnset[] = { static const u16 sDratiniTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDragonairTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -8300,60 +9596,66 @@ static const u16 sDragoniteTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRATINI @@ -8362,66 +9664,72 @@ static const u16 sDragoniteTeachableLearnset[] = { static const u16 sMewtwoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MEWTWO @@ -8429,6 +9737,94 @@ static const u16 sMewtwoTeachableLearnset[] = { #if P_FAMILY_MEW // Instead of reading this array for Mew, it checks for exceptions in CanLearnTeachableMove instead. static const u16 sMewTeachableLearnset[] = { + MOVE_AERIAL_ACE, + MOVE_ATTRACT, + MOVE_BLIZZARD, + MOVE_BRICK_BREAK, + MOVE_BULK_UP, + MOVE_BULLET_SEED, + MOVE_CALM_MIND, + MOVE_CUT, + MOVE_DIG, + MOVE_DIVE, + MOVE_DOUBLE_TEAM, + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FIRE_BLAST, + MOVE_FLAMETHROWER, + MOVE_FLASH, + MOVE_FLY, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_GIGA_DRAIN, + MOVE_HAIL, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, + MOVE_OVERHEAT, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_SOLAR_BEAM, + MOVE_STEEL_WING, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SOFT_BOILED, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MEW @@ -8436,97 +9832,115 @@ static const u16 sMewTeachableLearnset[] = { #if P_FAMILY_CHIKORITA static const u16 sChikoritaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBayleefTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMeganiumTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIKORITA @@ -8535,142 +9949,166 @@ static const u16 sMeganiumTeachableLearnset[] = { static const u16 sCyndaquilTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sQuilavaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sTyphlosionTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sTyphlosionHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, @@ -8683,42 +10121,48 @@ static const u16 sTotodileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -8726,46 +10170,52 @@ static const u16 sCroconawTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -8773,48 +10223,54 @@ static const u16 sFeraligatrTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOTODILE @@ -8823,89 +10279,101 @@ static const u16 sFeraligatrTeachableLearnset[] = { static const u16 sSentretTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sFurretTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SENTRET @@ -8915,63 +10383,75 @@ static const u16 sHoothootTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sNoctowlTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOOTHOOT @@ -8981,34 +10461,40 @@ static const u16 sLedybaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_ICE_PUNCH, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -9016,37 +10502,43 @@ static const u16 sLedianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LEDYBA @@ -9054,51 +10546,63 @@ static const u16 sLedianTeachableLearnset[] = { #if P_FAMILY_SPINARAK static const u16 sSpinarakTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sAriadosTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPINARAK @@ -9108,28 +10612,34 @@ static const u16 sChinchouTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -9137,29 +10647,35 @@ static const u16 sLanturnTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHINCHOU @@ -9168,95 +10684,107 @@ static const u16 sLanturnTeachableLearnset[] = { static const u16 sTogepiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sTogeticTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SOFT_BOILED, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -9264,46 +10792,52 @@ static const u16 sTogeticTeachableLearnset[] = { static const u16 sTogekissTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -9314,32 +10848,38 @@ static const u16 sNatuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -9347,34 +10887,40 @@ static const u16 sXatuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NATU @@ -9382,118 +10928,136 @@ static const u16 sXatuTeachableLearnset[] = { #if P_FAMILY_MAREEP static const u16 sMareepTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sFlaaffyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sAmpharosTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAREEP @@ -9503,30 +11067,36 @@ static const u16 sAmpharosTeachableLearnset[] = { static const u16 sAzurillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GEN_3_CROSS_EVOS @@ -9534,85 +11104,97 @@ static const u16 sAzurillTeachableLearnset[] = { static const u16 sMarillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sAzumarillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MARILL @@ -9621,77 +11203,89 @@ static const u16 sAzumarillTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sBonslyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS static const u16 sSudowoodoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DIG, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, - MOVE_DIG, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, - MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_FOCUS_PUNCH, - MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SUDOWOODO @@ -9701,27 +11295,33 @@ static const u16 sHoppipTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -9729,27 +11329,33 @@ static const u16 sSkiploomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -9757,28 +11363,34 @@ static const u16 sJumpluffTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOPPIP @@ -9787,50 +11399,56 @@ static const u16 sJumpluffTeachableLearnset[] = { static const u16 sAipomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -9839,44 +11457,50 @@ static const u16 sAmbipomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -9887,25 +11511,31 @@ static const u16 sSunkernTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -9913,26 +11543,32 @@ static const u16 sSunfloraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SUNKERN @@ -9941,28 +11577,34 @@ static const u16 sSunfloraTeachableLearnset[] = { static const u16 sYanmaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -9970,30 +11612,36 @@ static const u16 sYanmaTeachableLearnset[] = { static const u16 sYanmegaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -10003,140 +11651,164 @@ static const u16 sYanmegaTeachableLearnset[] = { static const u16 sWooperTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sQuagsireTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_PALDEAN_FORMS static const u16 sWooperPaldeaTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sClodsireTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_PALDEAN_FORMS @@ -10147,33 +11819,39 @@ static const u16 sMurkrowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -10182,33 +11860,39 @@ static const u16 sHonchkrowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -10219,36 +11903,42 @@ static const u16 sMisdreavusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -10258,33 +11948,39 @@ static const u16 sMismagiusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -10292,6 +11988,7 @@ static const u16 sMismagiusTeachableLearnset[] = { #if P_FAMILY_UNOWN static const u16 sUnownTeachableLearnset[] = { + MOVE_HIDDEN_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_UNOWN @@ -10299,15 +11996,15 @@ static const u16 sUnownTeachableLearnset[] = { #if P_FAMILY_WOBBUFFET #if P_GEN_3_CROSS_EVOS static const u16 sWynautTeachableLearnset[] = { - MOVE_COUNTER, MOVE_SAFEGUARD, + MOVE_COUNTER, MOVE_UNAVAILABLE, }; #endif //P_GEN_3_CROSS_EVOS static const u16 sWobbuffetTeachableLearnset[] = { - MOVE_COUNTER, MOVE_SAFEGUARD, + MOVE_COUNTER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WOBBUFFET @@ -10315,68 +12012,80 @@ static const u16 sWobbuffetTeachableLearnset[] = { #if P_FAMILY_GIRAFARIG static const u16 sGirafarigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sFarigirafTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -10386,71 +12095,83 @@ static const u16 sFarigirafTeachableLearnset[] = { #if P_FAMILY_PINECO static const u16 sPinecoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sForretressTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PINECO @@ -10459,81 +12180,93 @@ static const u16 sForretressTeachableLearnset[] = { static const u16 sDunsparceTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sDudunsparceTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -10544,38 +12277,44 @@ static const u16 sGligarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -10584,38 +12323,44 @@ static const u16 sGliscorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -10624,109 +12369,121 @@ static const u16 sGliscorTeachableLearnset[] = { #if P_FAMILY_SNUBBULL static const u16 sSnubbullTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sGranbullTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNUBBULL @@ -10735,82 +12492,100 @@ static const u16 sGranbullTeachableLearnset[] = { static const u16 sQwilfishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sQwilfishHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sOverqwilTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -10819,31 +12594,37 @@ static const u16 sOverqwilTeachableLearnset[] = { #if P_FAMILY_SHUCKLE static const u16 sShuckleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHUCKLE @@ -10852,37 +12633,43 @@ static const u16 sShuckleTeachableLearnset[] = { static const u16 sHeracrossTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HERACROSS @@ -10894,47 +12681,53 @@ static const u16 sSneaselTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -10945,46 +12738,52 @@ static const u16 sWeavileTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -10995,25 +12794,31 @@ static const u16 sSneaselHisuiTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -11022,29 +12827,35 @@ static const u16 sSneaslerTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -11054,166 +12865,190 @@ static const u16 sSneaslerTeachableLearnset[] = { static const u16 sTeddiursaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROAR, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sUrsaringTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROAR, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_8_CROSS_EVOS static const u16 sUrsalunaTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sUrsalunaBloodmoonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -11223,65 +13058,77 @@ static const u16 sUrsalunaBloodmoonTeachableLearnset[] = { #if P_FAMILY_SLUGMA static const u16 sSlugmaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMagcargoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SLUGMA @@ -11290,67 +13137,79 @@ static const u16 sMagcargoTeachableLearnset[] = { static const u16 sSwinubTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPiloswineTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11358,34 +13217,40 @@ static const u16 sPiloswineTeachableLearnset[] = { static const u16 sMamoswineTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -11395,41 +13260,47 @@ static const u16 sMamoswineTeachableLearnset[] = { static const u16 sCorsolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -11437,65 +13308,77 @@ static const u16 sCorsolaTeachableLearnset[] = { static const u16 sCorsolaGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCursolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -11506,33 +13389,39 @@ static const u16 sRemoraidTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -11540,35 +13429,41 @@ static const u16 sOctilleryTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REMORAID @@ -11578,36 +13473,42 @@ static const u16 sDelibirdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_STEEL_WING, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STEEL_WING, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DELIBIRD @@ -11619,27 +13520,33 @@ static const u16 sMantykeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -11648,32 +13555,38 @@ static const u16 sMantineTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MANTINE @@ -11682,36 +13595,42 @@ static const u16 sMantineTeachableLearnset[] = { static const u16 sSkarmoryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKARMORY @@ -11719,73 +13638,85 @@ static const u16 sSkarmoryTeachableLearnset[] = { #if P_FAMILY_HOUNDOUR static const u16 sHoundourTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sHoundoomTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOUNDOUR @@ -11793,66 +13724,78 @@ static const u16 sHoundoomTeachableLearnset[] = { #if P_FAMILY_PHANPY static const u16 sPhanpyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sDonphanTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PHANPY @@ -11860,72 +13803,84 @@ static const u16 sDonphanTeachableLearnset[] = { #if P_FAMILY_STANTLER static const u16 sStantlerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_8_CROSS_EVOS static const u16 sWyrdeerTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -11942,129 +13897,147 @@ static const u16 sSmeargleTeachableLearnset[] = { static const u16 sMiltankTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MILTANK #if P_FAMILY_RAIKOU static const u16 sRaikouTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RAIKOU #if P_FAMILY_ENTEI static const u16 sEnteiTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ENTEI @@ -12072,39 +14045,45 @@ static const u16 sEnteiTeachableLearnset[] = { #if P_FAMILY_SUICUNE static const u16 sSuicuneTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SUICUNE @@ -12112,62 +14091,74 @@ static const u16 sSuicuneTeachableLearnset[] = { #if P_FAMILY_LARVITAR static const u16 sLarvitarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sPupitarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -12175,55 +14166,61 @@ static const u16 sTyranitarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LARVITAR @@ -12232,52 +14229,58 @@ static const u16 sTyranitarTeachableLearnset[] = { static const u16 sLugiaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LUGIA @@ -12285,47 +14288,53 @@ static const u16 sLugiaTeachableLearnset[] = { #if P_FAMILY_HO_OH static const u16 sHoOhTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HO_OH @@ -12335,39 +14344,45 @@ static const u16 sCelebiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CELEBI @@ -12376,133 +14391,151 @@ static const u16 sCelebiTeachableLearnset[] = { static const u16 sTreeckoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGrovyleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSceptileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TREECKO @@ -12511,122 +14544,140 @@ static const u16 sSceptileTeachableLearnset[] = { static const u16 sTorchicTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCombuskenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBlazikenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TORCHIC @@ -12635,126 +14686,144 @@ static const u16 sBlazikenTeachableLearnset[] = { static const u16 sMudkipTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sMarshtompTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sSwampertTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUDKIP @@ -12762,63 +14831,75 @@ static const u16 sSwampertTeachableLearnset[] = { #if P_FAMILY_POOCHYENA static const u16 sPoochyenaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sMightyenaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POOCHYENA @@ -12827,79 +14908,91 @@ static const u16 sMightyenaTeachableLearnset[] = { static const u16 sZigzagoonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sLinooneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -12907,28 +15000,34 @@ static const u16 sLinooneTeachableLearnset[] = { static const u16 sZigzagoonGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -12936,29 +15035,35 @@ static const u16 sZigzagoonGalarTeachableLearnset[] = { static const u16 sLinooneGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -12966,35 +15071,41 @@ static const u16 sLinooneGalarTeachableLearnset[] = { static const u16 sObstagoonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -13015,26 +15126,32 @@ static const u16 sSilcoonTeachableLearnset[] = { static const u16 sBeautiflyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -13045,27 +15162,33 @@ static const u16 sCascoonTeachableLearnset[] = { static const u16 sDustoxTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WURMPLE @@ -13074,123 +15197,141 @@ static const u16 sDustoxTeachableLearnset[] = { static const u16 sLotadTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sLombreTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sLudicoloTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LOTAD @@ -13198,117 +15339,135 @@ static const u16 sLudicoloTeachableLearnset[] = { #if P_FAMILY_SEEDOT static const u16 sSeedotTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sNuzleafTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sShiftryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEEDOT @@ -13317,49 +15476,61 @@ static const u16 sShiftryTeachableLearnset[] = { static const u16 sTaillowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sSwellowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAILLOW @@ -13369,29 +15540,35 @@ static const u16 sWingullTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -13399,31 +15576,37 @@ static const u16 sPelipperTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WINGULL @@ -13431,141 +15614,159 @@ static const u16 sPelipperTeachableLearnset[] = { #if P_FAMILY_RALTS static const u16 sRaltsTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sKirliaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sGardevoirTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -13573,57 +15774,63 @@ static const u16 sGardevoirTeachableLearnset[] = { static const u16 sGalladeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -13633,31 +15840,37 @@ static const u16 sGalladeTeachableLearnset[] = { static const u16 sSurskitTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -13665,32 +15878,38 @@ static const u16 sMasquerainTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SURSKIT @@ -13698,76 +15917,88 @@ static const u16 sMasquerainTeachableLearnset[] = { #if P_FAMILY_SHROOMISH static const u16 sShroomishTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBreloomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHROOMISH @@ -13777,49 +16008,55 @@ static const u16 sSlakothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -13827,54 +16064,60 @@ static const u16 sVigorothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROAR, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -13882,55 +16125,61 @@ static const u16 sSlakingTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROAR, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SLAKOTH @@ -13940,24 +16189,30 @@ static const u16 sNincadaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -13966,28 +16221,34 @@ static const u16 sNinjaskTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -13995,27 +16256,33 @@ static const u16 sShedinjaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NINCADA @@ -14024,140 +16291,158 @@ static const u16 sShedinjaTeachableLearnset[] = { static const u16 sWhismurTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_DOUBLE_TEAM, + MOVE_FACADE, + MOVE_FIRE_BLAST, + MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, - MOVE_FACADE, - MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, - MOVE_FLAMETHROWER, - MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROAR, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sLoudredTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FIRE_BLAST, + MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_ICE_BEAM, + MOVE_OVERHEAT, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, - MOVE_EARTHQUAKE, MOVE_ENDURE, - MOVE_FACADE, - MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, - MOVE_FLAMETHROWER, - MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_OVERHEAT, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROAR, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sExploudTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WHISMUR @@ -14165,84 +16450,96 @@ static const u16 sExploudTeachableLearnset[] = { #if P_FAMILY_MAKUHITA static const u16 sMakuhitaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHariyamaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAKUHITA @@ -14250,75 +16547,87 @@ static const u16 sHariyamaTeachableLearnset[] = { #if P_FAMILY_NOSEPASS static const u16 sNosepassTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sProbopassTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FIRE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -14328,81 +16637,93 @@ static const u16 sProbopassTeachableLearnset[] = { static const u16 sSkittyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDelcattyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKITTY @@ -14411,56 +16732,62 @@ static const u16 sDelcattyTeachableLearnset[] = { static const u16 sSableyeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SABLEYE @@ -14468,47 +16795,53 @@ static const u16 sSableyeTeachableLearnset[] = { #if P_FAMILY_MAWILE static const u16 sMawileTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAWILE @@ -14517,70 +16850,82 @@ static const u16 sMawileTeachableLearnset[] = { static const u16 sAronTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sLaironTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -14588,57 +16933,63 @@ static const u16 sAggronTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARON @@ -14647,97 +16998,109 @@ static const u16 sAggronTeachableLearnset[] = { static const u16 sMedititeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sMedichamTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MEDITITE @@ -14745,63 +17108,75 @@ static const u16 sMedichamTeachableLearnset[] = { #if P_FAMILY_ELECTRIKE static const u16 sElectrikeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sManectricTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ELECTRIKE @@ -14809,37 +17184,43 @@ static const u16 sManectricTeachableLearnset[] = { #if P_FAMILY_PLUSLE static const u16 sPlusleTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DOUBLE_TEAM, + MOVE_FACADE, + MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, - MOVE_FACADE, - MOVE_FLASH, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PLUSLE @@ -14847,36 +17228,42 @@ static const u16 sPlusleTeachableLearnset[] = { #if P_FAMILY_MINUN static const u16 sMinunTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DOUBLE_TEAM, + MOVE_FACADE, + MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SHOCK_WAVE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, - MOVE_FACADE, - MOVE_FLASH, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MINUN @@ -14885,87 +17272,99 @@ static const u16 sMinunTeachableLearnset[] = { static const u16 sVolbeatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_ICE_PUNCH, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sIllumiseTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_ICE_PUNCH, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VOLBEAT_ILLUMISE @@ -14977,87 +17376,105 @@ static const u16 sBudewTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS static const u16 sRoseliaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sRoseradeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -15066,89 +17483,101 @@ static const u16 sRoseradeTeachableLearnset[] = { #if P_FAMILY_GULPIN static const u16 sGulpinTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DOUBLE_TEAM, + MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, + MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_GIGA_DRAIN, - MOVE_ICE_BEAM, MOVE_ICE_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROCK_SMASH, MOVE_ROLLOUT, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sSwalotTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FIRE_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GULPIN @@ -15158,29 +17587,35 @@ static const u16 sCarvanhaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -15188,35 +17623,41 @@ static const u16 sSharpedoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CARVANHA @@ -15225,65 +17666,77 @@ static const u16 sSharpedoTeachableLearnset[] = { static const u16 sWailmerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sWailordTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WAILMER @@ -15291,68 +17744,80 @@ static const u16 sWailordTeachableLearnset[] = { #if P_FAMILY_NUMEL static const u16 sNumelTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sCameruptTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NUMEL @@ -15360,34 +17825,40 @@ static const u16 sCameruptTeachableLearnset[] = { #if P_FAMILY_TORKOAL static const u16 sTorkoalTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TORKOAL @@ -15395,87 +17866,99 @@ static const u16 sTorkoalTeachableLearnset[] = { #if P_FAMILY_SPOINK static const u16 sSpoinkTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sGrumpigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPOINK @@ -15483,52 +17966,58 @@ static const u16 sGrumpigTeachableLearnset[] = { #if P_FAMILY_SPINDA static const u16 sSpindaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DIG, + MOVE_DOUBLE_TEAM, + MOVE_FACADE, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, + MOVE_SNATCH, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, - MOVE_DIG, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, - MOVE_SNATCH, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPINDA @@ -15536,105 +18025,123 @@ static const u16 sSpindaTeachableLearnset[] = { #if P_FAMILY_TRAPINCH static const u16 sTrapinchTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sVibravaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFlygonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TRAPINCH @@ -15642,80 +18149,92 @@ static const u16 sFlygonTeachableLearnset[] = { #if P_FAMILY_CACNEA static const u16 sCacneaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCacturneTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CACNEA @@ -15724,66 +18243,78 @@ static const u16 sCacturneTeachableLearnset[] = { static const u16 sSwabluTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sAltariaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SWABLU @@ -15793,58 +18324,64 @@ static const u16 sZangooseTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZANGOOSE @@ -15852,36 +18389,42 @@ static const u16 sZangooseTeachableLearnset[] = { #if P_FAMILY_SEVIPER static const u16 sSeviperTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEVIPER @@ -15889,83 +18432,95 @@ static const u16 sSeviperTeachableLearnset[] = { #if P_FAMILY_LUNATONE static const u16 sLunatoneTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LUNATONE #if P_FAMILY_SOLROCK static const u16 sSolrockTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SOLROCK @@ -15975,30 +18530,36 @@ static const u16 sBarboachTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -16006,35 +18567,41 @@ static const u16 sWhiscashTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BARBOACH @@ -16044,38 +18611,44 @@ static const u16 sCorphishTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -16083,41 +18656,47 @@ static const u16 sCrawdauntTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CORPHISH @@ -16126,73 +18705,85 @@ static const u16 sCrawdauntTeachableLearnset[] = { static const u16 sBaltoyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sClaydolTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BALTOY @@ -16200,62 +18791,74 @@ static const u16 sClaydolTeachableLearnset[] = { #if P_FAMILY_LILEEP static const u16 sLileepTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCradilyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LILEEP @@ -16264,63 +18867,75 @@ static const u16 sCradilyTeachableLearnset[] = { static const u16 sAnorithTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sArmaldoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ANORITH @@ -16330,58 +18945,70 @@ static const u16 sFeebasTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sMiloticTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FEEBAS @@ -16390,37 +19017,43 @@ static const u16 sMiloticTeachableLearnset[] = { static const u16 sCastformTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CASTFORM @@ -16430,58 +19063,64 @@ static const u16 sKecleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KECLEON @@ -16489,74 +19128,86 @@ static const u16 sKecleonTeachableLearnset[] = { #if P_FAMILY_SHUPPET static const u16 sShuppetTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_ICY_WIND, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sBanetteTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHUPPET @@ -16565,82 +19216,94 @@ static const u16 sBanetteTeachableLearnset[] = { static const u16 sDuskullTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sDusclopsTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, + MOVE_SNATCH, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, - MOVE_SNATCH, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16648,47 +19311,53 @@ static const u16 sDusclopsTeachableLearnset[] = { static const u16 sDusknoirTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, + MOVE_SNATCH, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, - MOVE_SNATCH, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -16698,36 +19367,42 @@ static const u16 sDusknoirTeachableLearnset[] = { static const u16 sTropiusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TROPIUS @@ -16737,35 +19412,41 @@ static const u16 sTropiusTeachableLearnset[] = { static const u16 sChinglingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -16773,36 +19454,42 @@ static const u16 sChinglingTeachableLearnset[] = { static const u16 sChimechoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIMECHO @@ -16812,51 +19499,57 @@ static const u16 sAbsolTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ABSOL @@ -16865,60 +19558,72 @@ static const u16 sAbsolTeachableLearnset[] = { static const u16 sSnoruntTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGlalieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -16926,40 +19631,46 @@ static const u16 sGlalieTeachableLearnset[] = { static const u16 sFroslassTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -16969,107 +19680,125 @@ static const u16 sFroslassTeachableLearnset[] = { static const u16 sSphealTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sSealeoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sWalreinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPHEAL @@ -17078,87 +19807,105 @@ static const u16 sWalreinTeachableLearnset[] = { static const u16 sClamperlTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sHuntailTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sGorebyssTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLAMPERL @@ -17167,35 +19914,41 @@ static const u16 sGorebyssTeachableLearnset[] = { static const u16 sRelicanthTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RELICANTH @@ -17205,26 +19958,32 @@ static const u16 sLuvdiscTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LUVDISC @@ -17233,104 +19992,122 @@ static const u16 sLuvdiscTeachableLearnset[] = { static const u16 sBagonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sShelgonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSalamenceTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BAGON @@ -17342,137 +20119,155 @@ static const u16 sBeldumTeachableLearnset[] = { static const u16 sMetangTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMetagrossTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BELDUM #if P_FAMILY_REGIROCK static const u16 sRegirockTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DIG, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHOCK_WAVE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, - MOVE_DIG, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, - MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_FOCUS_PUNCH, - MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGIROCK @@ -17480,46 +20275,52 @@ static const u16 sRegirockTeachableLearnset[] = { #if P_FAMILY_REGICE static const u16 sRegiceTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HAIL, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SHOCK_WAVE, + MOVE_STRENGTH, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, - MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_HAIL, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGICE @@ -17527,45 +20328,51 @@ static const u16 sRegiceTeachableLearnset[] = { #if P_FAMILY_REGISTEEL static const u16 sRegisteelTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHOCK_WAVE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, - MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGISTEEL @@ -17574,50 +20381,56 @@ static const u16 sRegisteelTeachableLearnset[] = { static const u16 sLatiasTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LATIAS @@ -17626,50 +20439,56 @@ static const u16 sLatiasTeachableLearnset[] = { static const u16 sLatiosTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LATIOS @@ -17677,43 +20496,49 @@ static const u16 sLatiosTeachableLearnset[] = { #if P_FAMILY_KYOGRE static const u16 sKyogreTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KYOGRE @@ -17721,56 +20546,62 @@ static const u16 sKyogreTeachableLearnset[] = { #if P_FAMILY_GROUDON static const u16 sGroudonTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GROUDON @@ -17779,51 +20610,57 @@ static const u16 sGroudonTeachableLearnset[] = { static const u16 sRayquazaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RAYQUAZA @@ -17831,47 +20668,53 @@ static const u16 sRayquazaTeachableLearnset[] = { #if P_FAMILY_JIRACHI static const u16 sJirachiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JIRACHI @@ -17879,223 +20722,247 @@ static const u16 sJirachiTeachableLearnset[] = { #if P_FAMILY_DEOXYS static const u16 sDeoxysNormalTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDeoxysAttackTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDeoxysDefenseTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDeoxysSpeedTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEOXYS @@ -18103,99 +20970,117 @@ static const u16 sDeoxysSpeedTeachableLearnset[] = { #if P_FAMILY_TURTWIG static const u16 sTurtwigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGrotleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sTorterraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TURTWIG @@ -18206,40 +21091,46 @@ static const u16 sChimcharTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18248,88 +21139,100 @@ static const u16 sMonfernoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sInfernapeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIMCHAR @@ -18343,28 +21246,34 @@ static const u16 sPiplupTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -18376,29 +21285,35 @@ static const u16 sPrinplupTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -18406,41 +21321,47 @@ static const u16 sEmpoleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIPLUP @@ -18449,70 +21370,88 @@ static const u16 sEmpoleonTeachableLearnset[] = { static const u16 sStarlyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sStaraviaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sStaraptorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STARLY @@ -18522,36 +21461,42 @@ static const u16 sBidoofTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -18559,43 +21504,49 @@ static const u16 sBibarelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BIDOOF @@ -18613,25 +21564,31 @@ static const u16 sKricketuneTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KRICKETOT @@ -18639,93 +21596,111 @@ static const u16 sKricketuneTeachableLearnset[] = { #if P_FAMILY_SHINX static const u16 sShinxTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sLuxioTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sLuxrayTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHINX @@ -18734,84 +21709,96 @@ static const u16 sLuxrayTeachableLearnset[] = { static const u16 sCranidosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sRampardosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRANIDOS @@ -18820,84 +21807,97 @@ static const u16 sRampardosTeachableLearnset[] = { static const u16 sShieldonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sBastiodonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHIELDON #if P_FAMILY_BURMY static const u16 sBurmyTeachableLearnset[] = { + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_SNORE, MOVE_UNAVAILABLE, @@ -18908,27 +21908,33 @@ static const u16 sWormadamPlantTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -18936,32 +21942,38 @@ static const u16 sWormadamSandyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -18969,27 +21981,33 @@ static const u16 sWormadamTrashTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -18997,29 +22015,35 @@ static const u16 sMothimTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BURMY @@ -19038,24 +22062,30 @@ static const u16 sVespiquenTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COMBEE @@ -19065,32 +22095,38 @@ static const u16 sPachirisuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PACHIRISU @@ -19104,76 +22140,88 @@ static const u16 sBuizelTeachableLearnset[] = { MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sFloatzelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUIZEL @@ -19182,49 +22230,61 @@ static const u16 sFloatzelTeachableLearnset[] = { static const u16 sCherubiTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCherrimTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHERUBI @@ -19233,65 +22293,77 @@ static const u16 sCherrimTeachableLearnset[] = { static const u16 sShellosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGastrodonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHELLOS @@ -19300,75 +22372,87 @@ static const u16 sGastrodonTeachableLearnset[] = { static const u16 sDrifloonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDrifblimTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRIFLOON @@ -19377,37 +22461,43 @@ static const u16 sDrifblimTeachableLearnset[] = { static const u16 sBunearyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -19415,41 +22505,47 @@ static const u16 sLopunnyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUNEARY @@ -19460,27 +22556,21 @@ static const u16 sGlameowTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, @@ -19488,39 +22578,43 @@ static const u16 sGlameowTeachableLearnset[] = { MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPuruglyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROLLOUT, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, @@ -19528,6 +22622,20 @@ static const u16 sPuruglyTeachableLearnset[] = { MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GLAMEOW @@ -19535,143 +22643,167 @@ static const u16 sPuruglyTeachableLearnset[] = { #if P_FAMILY_STUNKY static const u16 sStunkyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sSkuntankTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STUNKY #if P_FAMILY_BRONZOR static const u16 sBronzorTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sBronzongTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRONZOR @@ -19681,23 +22813,29 @@ static const u16 sChatotTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHATOT @@ -19705,34 +22843,40 @@ static const u16 sChatotTeachableLearnset[] = { #if P_FAMILY_SPIRITOMB static const u16 sSpiritombTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPIRITOMB @@ -19741,111 +22885,129 @@ static const u16 sSpiritombTeachableLearnset[] = { static const u16 sGibleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGabiteTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGarchompTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GIBLE @@ -19856,81 +23018,93 @@ static const u16 sRioluTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLucarioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_ROAR, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RIOLU @@ -19938,58 +23112,70 @@ static const u16 sLucarioTeachableLearnset[] = { #if P_FAMILY_HIPPOPOTAS static const u16 sHippopotasTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sHippowdonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HIPPOPOTAS @@ -20002,29 +23188,35 @@ static const u16 sSkorupiTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -20036,32 +23228,38 @@ static const u16 sDrapionTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKORUPI @@ -20072,39 +23270,45 @@ static const u16 sCroagunkTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -20113,42 +23317,48 @@ static const u16 sToxicroakTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CROAGUNK @@ -20159,24 +23369,30 @@ static const u16 sCarnivineTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CARNIVINE @@ -20187,26 +23403,32 @@ static const u16 sFinneonTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -20216,27 +23438,33 @@ static const u16 sLumineonTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FINNEON @@ -20245,77 +23473,89 @@ static const u16 sLumineonTeachableLearnset[] = { static const u16 sSnoverTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sAbomasnowTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNOVER @@ -20323,30 +23563,36 @@ static const u16 sAbomasnowTeachableLearnset[] = { #if P_FAMILY_ROTOM static const u16 sRotomTeachableLearnset[] = { MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROTOM @@ -20355,41 +23601,47 @@ static const u16 sRotomTeachableLearnset[] = { static const u16 sUxieTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_UXIE @@ -20398,42 +23650,48 @@ static const u16 sUxieTeachableLearnset[] = { static const u16 sMespritTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MESPRIT @@ -20441,46 +23699,52 @@ static const u16 sMespritTeachableLearnset[] = { #if P_FAMILY_AZELF static const u16 sAzelfTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AZELF @@ -20489,45 +23753,51 @@ static const u16 sAzelfTeachableLearnset[] = { static const u16 sDialgaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DIALGA @@ -20536,7 +23806,6 @@ static const u16 sDialgaTeachableLearnset[] = { static const u16 sPalkiaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -20544,41 +23813,48 @@ static const u16 sPalkiaTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PALKIA @@ -20586,34 +23862,40 @@ static const u16 sPalkiaTeachableLearnset[] = { #if P_FAMILY_HEATRAN static const u16 sHeatranTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HEATRAN @@ -20621,40 +23903,46 @@ static const u16 sHeatranTeachableLearnset[] = { #if P_FAMILY_REGIGIGAS static const u16 sRegigigasTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SHOCK_WAVE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGIGIGAS @@ -20662,42 +23950,48 @@ static const u16 sRegigigasTeachableLearnset[] = { #if P_FAMILY_GIRATINA static const u16 sGiratinaTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GIRATINA @@ -20705,38 +23999,44 @@ static const u16 sGiratinaTeachableLearnset[] = { #if P_FAMILY_CRESSELIA static const u16 sCresseliaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRESSELIA @@ -20747,25 +24047,31 @@ static const u16 sPhioneTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -20774,32 +24080,38 @@ static const u16 sManaphyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MANAPHY @@ -20812,41 +24124,47 @@ static const u16 sDarkraiTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DARKRAI @@ -20855,55 +24173,67 @@ static const u16 sDarkraiTeachableLearnset[] = { static const u16 sShayminLandTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sShayminSkyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHAYMIN @@ -20912,66 +24242,72 @@ static const u16 sShayminSkyTeachableLearnset[] = { static const u16 sArceusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARCEUS @@ -20979,40 +24315,46 @@ static const u16 sArceusTeachableLearnset[] = { #if P_FAMILY_VICTINI static const u16 sVictiniTeachableLearnset[] = { MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VICTINI @@ -21024,29 +24366,35 @@ static const u16 sSnivyTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -21056,65 +24404,77 @@ static const u16 sServineTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sSerperiorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNIVY @@ -21122,109 +24482,127 @@ static const u16 sSerperiorTeachableLearnset[] = { #if P_FAMILY_TEPIG static const u16 sTepigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sPigniteTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sEmboarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TEPIG @@ -21238,28 +24616,34 @@ static const u16 sOshawottTeachableLearnset[] = { MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -21272,28 +24656,34 @@ static const u16 sDewottTeachableLearnset[] = { MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -21301,36 +24691,42 @@ static const u16 sSamurottTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -21338,28 +24734,34 @@ static const u16 sSamurottTeachableLearnset[] = { static const u16 sSamurottHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -21373,19 +24775,25 @@ static const u16 sPatratTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -21395,34 +24803,40 @@ static const u16 sWatchogTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PATRAT @@ -21433,24 +24847,30 @@ static const u16 sLillipupTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SUNNY_DAY, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21459,26 +24879,32 @@ static const u16 sHerdierTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -21487,28 +24913,34 @@ static const u16 sStoutlandTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LILLIPUP @@ -21519,26 +24951,32 @@ static const u16 sPurrloinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -21547,28 +24985,34 @@ static const u16 sLiepardTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PURRLOIN @@ -21583,21 +25027,27 @@ static const u16 sPansageTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -21611,23 +25061,29 @@ static const u16 sSimisageTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANSAGE @@ -21640,24 +25096,30 @@ static const u16 sPansearTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -21669,26 +25131,32 @@ static const u16 sSimisearTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANSEAR @@ -21703,26 +25171,32 @@ static const u16 sPanpourTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -21736,28 +25210,34 @@ static const u16 sSimipourTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANPOUR @@ -21766,65 +25246,77 @@ static const u16 sSimipourTeachableLearnset[] = { static const u16 sMunnaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMusharnaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUNNA @@ -21834,20 +25326,26 @@ static const u16 sPidoveTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -21855,20 +25353,26 @@ static const u16 sTranquillTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -21876,22 +25380,28 @@ static const u16 sUnfezantTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIDOVE @@ -21899,58 +25409,70 @@ static const u16 sUnfezantTeachableLearnset[] = { #if P_FAMILY_BLITZLE static const u16 sBlitzleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sZebstrikaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BLITZLE @@ -21960,21 +25482,27 @@ static const u16 sRoggenrolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21982,21 +25510,27 @@ static const u16 sBoldoreTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -22004,23 +25538,29 @@ static const u16 sGigalithTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROGGENROLA @@ -22031,33 +25571,39 @@ static const u16 sWoobatTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -22066,34 +25612,40 @@ static const u16 sSwoobatTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WOOBAT @@ -22105,57 +25657,69 @@ static const u16 sDrilburTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sExcadrillTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRILBUR @@ -22164,48 +25728,54 @@ static const u16 sExcadrillTeachableLearnset[] = { static const u16 sAudinoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AUDINO @@ -22215,33 +25785,39 @@ static const u16 sTimburrTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -22249,70 +25825,82 @@ static const u16 sGurdurrTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sConkeldurrTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TIMBURR @@ -22321,44 +25909,56 @@ static const u16 sConkeldurrTeachableLearnset[] = { static const u16 sTympoleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sPalpitoadTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -22369,30 +25969,36 @@ static const u16 sSeismitoadTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SLUDGE_BOMB, + MOVE_STRENGTH, + MOVE_SURF, + MOVE_TOXIC, + MOVE_WATER_PULSE, + MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, - MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SURF, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYMPOLE @@ -22400,34 +26006,40 @@ static const u16 sSeismitoadTeachableLearnset[] = { #if P_FAMILY_THROH static const u16 sThrohTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_THROH @@ -22437,31 +26049,37 @@ static const u16 sSawkTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SAWK @@ -22472,22 +26090,28 @@ static const u16 sSewaddleTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -22496,22 +26120,28 @@ static const u16 sSwadloonTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -22522,26 +26152,32 @@ static const u16 sLeavannyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEWADDLE @@ -22549,77 +26185,95 @@ static const u16 sLeavannyTeachableLearnset[] = { #if P_FAMILY_VENIPEDE static const u16 sVenipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sWhirlipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sScolipedeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VENIPEDE @@ -22628,49 +26282,61 @@ static const u16 sScolipedeTeachableLearnset[] = { static const u16 sCottoneeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sWhimsicottTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COTTONEE @@ -22681,20 +26347,26 @@ static const u16 sPetililTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -22703,24 +26375,30 @@ static const u16 sLilligantTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -22729,20 +26407,26 @@ static const u16 sLilligantHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_METRONOME, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -22755,67 +26439,85 @@ static const u16 sBasculinTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sBasculinWhiteStripedTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sBasculegionTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -22824,113 +26526,131 @@ static const u16 sBasculegionTeachableLearnset[] = { #if P_FAMILY_SANDILE static const u16 sSandileTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sKrokorokTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sKrookodileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SANDILE @@ -22941,72 +26661,84 @@ static const u16 sDarumakaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sDarmanitanTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -23016,61 +26748,73 @@ static const u16 sDarumakaGalarTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sDarmanitanGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -23082,19 +26826,25 @@ static const u16 sMaractusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MARACTUS @@ -23103,55 +26853,67 @@ static const u16 sMaractusTeachableLearnset[] = { static const u16 sDwebbleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCrustleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DWEBBLE @@ -23161,81 +26923,93 @@ static const u16 sScraggyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sScraftyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCRAGGY @@ -23246,34 +27020,40 @@ static const u16 sSigilyphTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SIGILYPH @@ -23283,25 +27063,31 @@ static const u16 sYamaskTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -23309,26 +27095,32 @@ static const u16 sCofagrigusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -23337,21 +27129,27 @@ static const u16 sYamaskGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_THIEF, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; @@ -23359,23 +27157,29 @@ static const u16 sRunerigusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_TAUNT, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -23385,65 +27189,77 @@ static const u16 sRunerigusTeachableLearnset[] = { static const u16 sTirtougaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sCarracostaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TIRTOUGA @@ -23457,24 +27273,30 @@ static const u16 sArchenTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -23486,26 +27308,32 @@ static const u16 sArcheopsTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARCHEN @@ -23514,47 +27342,59 @@ static const u16 sArcheopsTeachableLearnset[] = { static const u16 sTrubbishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGarbodorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TRUBBISH @@ -23564,69 +27404,81 @@ static const u16 sZoruaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sZoroarkTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -23635,53 +27487,65 @@ static const u16 sZoruaHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CALM_MIND, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sZoroarkHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -23694,24 +27558,30 @@ static const u16 sMinccinoTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -23720,29 +27590,35 @@ static const u16 sCinccinoTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MINCCINO @@ -23752,34 +27628,40 @@ static const u16 sGothitaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -23787,74 +27669,86 @@ static const u16 sGothoritaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sGothitelleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOTHITA @@ -23864,34 +27758,40 @@ static const u16 sSolosisTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THUNDER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23899,78 +27799,90 @@ static const u16 sDuosionTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THUNDER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sReuniclusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THUNDER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SOLOSIS @@ -23980,25 +27892,31 @@ static const u16 sDucklettTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -24006,26 +27924,32 @@ static const u16 sSwannaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DUCKLETT @@ -24035,22 +27959,28 @@ static const u16 sVanilliteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -24058,22 +27988,28 @@ static const u16 sVanillishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -24081,23 +28017,29 @@ static const u16 sVanilluxeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VANILLITE @@ -24105,59 +28047,71 @@ static const u16 sVanilluxeTeachableLearnset[] = { #if P_FAMILY_DEERLING static const u16 sDeerlingTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSawsbuckTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEERLING @@ -24168,25 +28122,31 @@ static const u16 sEmolgaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_EMOLGA @@ -24195,47 +28155,59 @@ static const u16 sEmolgaTeachableLearnset[] = { static const u16 sKarrablastTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sEscavalierTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KARRABLAST @@ -24243,50 +28215,62 @@ static const u16 sEscavalierTeachableLearnset[] = { #if P_FAMILY_FOONGUS static const u16 sFoongusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sAmoongussTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FOONGUS @@ -24297,31 +28281,37 @@ static const u16 sFrillishTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -24330,32 +28320,38 @@ static const u16 sJellicentTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FRILLISH @@ -24364,32 +28360,38 @@ static const u16 sJellicentTeachableLearnset[] = { static const u16 sAlomomolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ALOMOMOLA @@ -24399,25 +28401,31 @@ static const u16 sJoltikTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -24425,26 +28433,32 @@ static const u16 sGalvantulaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JOLTIK @@ -24454,23 +28468,29 @@ static const u16 sFerroseedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24480,28 +28500,34 @@ static const u16 sFerrothornTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FERROSEED @@ -24509,59 +28535,77 @@ static const u16 sFerrothornTeachableLearnset[] = { #if P_FAMILY_KLINK static const u16 sKlinkTeachableLearnset[] = { MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sKlangTeachableLearnset[] = { MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sKlinklangTeachableLearnset[] = { MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KLINK @@ -24574,65 +28618,77 @@ static const u16 sTynamoTeachableLearnset[] = { static const u16 sEelektrikTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sEelektrossTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYNAMO @@ -24642,32 +28698,38 @@ static const u16 sElgyemTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -24675,33 +28737,39 @@ static const u16 sBeheeyemTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ELGYEM @@ -24711,28 +28779,34 @@ static const u16 sLitwickTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -24740,28 +28814,34 @@ static const u16 sLampentTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -24769,29 +28849,35 @@ static const u16 sChandelureTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LITWICK @@ -24801,32 +28887,38 @@ static const u16 sAxewTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24834,69 +28926,81 @@ static const u16 sFraxureTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHaxorusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AXEW @@ -24906,35 +29010,41 @@ static const u16 sCubchooTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -24942,43 +29052,49 @@ static const u16 sBearticTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CUBCHOO @@ -24987,26 +29103,32 @@ static const u16 sBearticTeachableLearnset[] = { static const u16 sCryogonalTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRYOGONAL @@ -25014,44 +29136,56 @@ static const u16 sCryogonalTeachableLearnset[] = { #if P_FAMILY_SHELMET static const u16 sShelmetTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sAccelgorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHELMET @@ -25062,49 +29196,61 @@ static const u16 sStunfiskTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sStunfiskGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_COUNTER, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -25120,28 +29266,34 @@ static const u16 sMienfooTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25152,31 +29304,37 @@ static const u16 sMienshaoTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MIENFOO @@ -25185,135 +29343,153 @@ static const u16 sMienshaoTeachableLearnset[] = { static const u16 sDruddigonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRUDDIGON #if P_FAMILY_GOLETT static const u16 sGolettTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGolurkTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_PSYCHIC, MOVE_PSYCH_UP, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THIEF, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOLETT @@ -25326,25 +29502,31 @@ static const u16 sPawniardTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -25355,26 +29537,32 @@ static const u16 sBisharpTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -25383,21 +29571,27 @@ static const u16 sKingambitTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -25407,28 +29601,34 @@ static const u16 sKingambitTeachableLearnset[] = { static const u16 sBouffalantTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BOUFFALANT @@ -25437,83 +29637,101 @@ static const u16 sBouffalantTeachableLearnset[] = { static const u16 sRuffletTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBraviaryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sBraviaryHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -25525,29 +29743,35 @@ static const u16 sVullabyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -25555,31 +29779,37 @@ static const u16 sMandibuzzTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VULLABY @@ -25588,33 +29818,39 @@ static const u16 sMandibuzzTeachableLearnset[] = { static const u16 sHeatmorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HEATMOR @@ -25626,21 +29862,27 @@ static const u16 sDurantTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DURANT @@ -25648,90 +29890,108 @@ static const u16 sDurantTeachableLearnset[] = { #if P_FAMILY_DEINO static const u16 sDeinoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sZweilousTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sHydreigonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEINO @@ -25739,43 +29999,48 @@ static const u16 sHydreigonTeachableLearnset[] = { #if P_FAMILY_LARVESTA static const u16 sLarvestaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sVolcaronaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -25783,13 +30048,20 @@ static const u16 sVolcaronaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LARVESTA @@ -25797,34 +30069,40 @@ static const u16 sVolcaronaTeachableLearnset[] = { #if P_FAMILY_COBALION static const u16 sCobalionTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COBALION @@ -25832,34 +30110,40 @@ static const u16 sCobalionTeachableLearnset[] = { #if P_FAMILY_TERRAKION static const u16 sTerrakionTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TERRAKION @@ -25867,36 +30151,42 @@ static const u16 sTerrakionTeachableLearnset[] = { #if P_FAMILY_VIRIZION static const u16 sVirizionTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VIRIZION @@ -25905,33 +30195,39 @@ static const u16 sVirizionTeachableLearnset[] = { static const u16 sTornadusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TORNADUS @@ -25939,51 +30235,56 @@ static const u16 sTornadusTeachableLearnset[] = { #if P_FAMILY_THUNDURUS static const u16 sThundurusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_THUNDURUS #if P_FAMILY_RESHIRAM static const u16 sReshiramTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -25992,38 +30293,44 @@ static const u16 sReshiramTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RESHIRAM #if P_FAMILY_ZEKROM static const u16 sZekromTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -26031,25 +30338,32 @@ static const u16 sZekromTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZEKROM @@ -26057,37 +30371,43 @@ static const u16 sZekromTeachableLearnset[] = { #if P_FAMILY_LANDORUS static const u16 sLandorusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LANDORUS @@ -26096,37 +30416,43 @@ static const u16 sLandorusTeachableLearnset[] = { static const u16 sKyuremTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KYUREM @@ -26137,32 +30463,38 @@ static const u16 sKeldeoTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KELDEO @@ -26172,39 +30504,45 @@ static const u16 sMeloettaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MELOETTA @@ -26214,14 +30552,13 @@ static const u16 sGenesectTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -26229,16 +30566,23 @@ static const u16 sGenesectTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GENESECT @@ -26247,128 +30591,146 @@ static const u16 sGenesectTeachableLearnset[] = { static const u16 sChespinTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sQuilladinTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sChesnaughtTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHESPIN @@ -26379,30 +30741,36 @@ static const u16 sFennekinTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -26411,34 +30779,40 @@ static const u16 sBraixenTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26447,38 +30821,44 @@ static const u16 sDelphoxTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FENNEKIN @@ -26488,34 +30868,40 @@ static const u16 sFroakieTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -26523,36 +30909,42 @@ static const u16 sFrogadierTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -26561,37 +30953,43 @@ static const u16 sGreninjaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FROAKIE @@ -26602,73 +31000,85 @@ static const u16 sBunnelbyTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sDiggersbyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, - MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUNNELBY @@ -26677,54 +31087,66 @@ static const u16 sDiggersbyTeachableLearnset[] = { static const u16 sFletchlingTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sFletchinderTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -26732,30 +31154,36 @@ static const u16 sTalonflameTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLETCHLING @@ -26775,27 +31203,33 @@ static const u16 sVivillonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCATTERBUG @@ -26803,66 +31237,78 @@ static const u16 sVivillonTeachableLearnset[] = { #if P_FAMILY_LITLEO static const u16 sLitleoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPyroarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LITLEO @@ -26872,23 +31318,29 @@ static const u16 sFlabebeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26896,25 +31348,31 @@ static const u16 sFloetteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26922,25 +31380,31 @@ static const u16 sFloetteEternalTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26948,26 +31412,32 @@ static const u16 sFlorgesTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLABEBE @@ -26975,70 +31445,82 @@ static const u16 sFlorgesTeachableLearnset[] = { #if P_FAMILY_SKIDDO static const u16 sSkiddoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGogoatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKIDDO @@ -27047,47 +31529,52 @@ static const u16 sGogoatTeachableLearnset[] = { static const u16 sPanchamTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sPangoroTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -27095,36 +31582,43 @@ static const u16 sPangoroTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANCHAM @@ -27136,19 +31630,25 @@ static const u16 sFurfrouTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_TOXIC, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FURFROU @@ -27159,32 +31659,38 @@ static const u16 sEspurrTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -27194,33 +31700,39 @@ static const u16 sMeowsticMTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -27230,33 +31742,39 @@ static const u16 sMeowsticFTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ESPURR @@ -27268,21 +31786,27 @@ static const u16 sHonedgeTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -27292,21 +31816,27 @@ static const u16 sDoubladeTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -27316,24 +31846,30 @@ static const u16 sAegislashTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HONEDGE @@ -27343,25 +31879,31 @@ static const u16 sSpritzeeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -27369,28 +31911,34 @@ static const u16 sAromatisseTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPRITZEE @@ -27400,26 +31948,32 @@ static const u16 sSwirlixTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -27427,29 +31981,35 @@ static const u16 sSlurpuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SWIRLIX @@ -27461,30 +32021,36 @@ static const u16 sInkayTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -27494,31 +32060,37 @@ static const u16 sMalamarTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_INKAY @@ -27533,32 +32105,38 @@ static const u16 sBinacleTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -27574,33 +32152,39 @@ static const u16 sBarbaracleTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BINACLE @@ -27610,27 +32194,33 @@ static const u16 sSkrelpTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_ICY_WIND, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -27638,29 +32228,35 @@ static const u16 sDragalgeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKRELP @@ -27672,58 +32268,70 @@ static const u16 sClauncherTeachableLearnset[] = { MOVE_CUT, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sClawitzerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLAUNCHER @@ -27734,29 +32342,35 @@ static const u16 sHelioptileTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -27765,36 +32379,42 @@ static const u16 sHelioliskTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HELIOPTILE @@ -27803,57 +32423,69 @@ static const u16 sHelioliskTeachableLearnset[] = { static const u16 sTyruntTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sTyrantrumTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYRUNT @@ -27862,77 +32494,89 @@ static const u16 sTyrantrumTeachableLearnset[] = { static const u16 sAmauraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_SECRET_POWER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sAurorusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AMAURA @@ -27941,39 +32585,45 @@ static const u16 sAurorusTeachableLearnset[] = { static const u16 sHawluchaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HAWLUCHA @@ -27985,60 +32635,72 @@ static const u16 sDedenneTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEDENNE #if P_FAMILY_CARBINK static const u16 sCarbinkTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CARBINK @@ -28046,149 +32708,179 @@ static const u16 sCarbinkTeachableLearnset[] = { #if P_FAMILY_GOOMY static const u16 sGoomyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sSliggooTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGoodraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sSliggooHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGoodraHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -28200,27 +32892,33 @@ static const u16 sKlefkiTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KLEFKI @@ -28231,29 +32929,35 @@ static const u16 sPhantumpTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -28263,31 +32967,37 @@ static const u16 sTrevenantTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PHANTUMP @@ -28297,31 +33007,37 @@ static const u16 sPumpkabooTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -28329,32 +33045,38 @@ static const u16 sGourgeistTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PUMPKABOO @@ -28363,85 +33085,103 @@ static const u16 sGourgeistTeachableLearnset[] = { static const u16 sBergmiteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sAvaluggTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sAvaluggHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -28455,97 +33195,115 @@ static const u16 sNoibatTeachableLearnset[] = { MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sNoivernTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NOIBAT #if P_FAMILY_XERNEAS static const u16 sXerneasTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_XERNEAS @@ -28553,94 +33311,112 @@ static const u16 sXerneasTeachableLearnset[] = { #if P_FAMILY_YVELTAL static const u16 sYveltalTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_YVELTAL #if P_FAMILY_ZYGARDE static const u16 sZygardeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZYGARDE #if P_FAMILY_DIANCIE static const u16 sDiancieTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DIANCIE @@ -28650,40 +33426,46 @@ static const u16 sHoopaConfinedTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -28691,78 +33473,90 @@ static const u16 sHoopaUnboundTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOOPA #if P_FAMILY_VOLCANION static const u16 sVolcanionTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VOLCANION @@ -28773,23 +33567,29 @@ static const u16 sRowletTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -28798,23 +33598,29 @@ static const u16 sDartrixTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -28823,25 +33629,31 @@ static const u16 sDecidueyeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -28852,23 +33664,29 @@ static const u16 sDecidueyeHisuiTeachableLearnset[] = { MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -28877,87 +33695,105 @@ static const u16 sDecidueyeHisuiTeachableLearnset[] = { #if P_FAMILY_LITTEN static const u16 sLittenTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sTorracatTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sIncineroarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LITTEN @@ -28968,82 +33804,100 @@ static const u16 sPopplioTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sBrionneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPrimarinaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POPPLIO @@ -29055,20 +33909,26 @@ static const u16 sPikipekTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -29078,21 +33938,27 @@ static const u16 sTrumbeakTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29102,24 +33968,30 @@ static const u16 sToucannonTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIKIPEK @@ -29128,61 +34000,73 @@ static const u16 sToucannonTeachableLearnset[] = { static const u16 sYungoosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGumshoosTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_YUNGOOS @@ -29192,20 +34076,26 @@ static const u16 sGrubbinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29213,21 +34103,27 @@ static const u16 sCharjabugTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -29235,25 +34131,31 @@ static const u16 sVikavoltTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GRUBBIN @@ -29261,68 +34163,80 @@ static const u16 sVikavoltTeachableLearnset[] = { #if P_FAMILY_CRABRAWLER static const u16 sCrabrawlerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCrabominableTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRABRAWLER @@ -29333,25 +34247,31 @@ static const u16 sOricorioTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ORICORIO @@ -29362,24 +34282,30 @@ static const u16 sCutieflyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -29388,26 +34314,32 @@ static const u16 sRibombeeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CUTIEFLY @@ -29415,117 +34347,141 @@ static const u16 sRibombeeTeachableLearnset[] = { #if P_FAMILY_ROCKRUFF static const u16 sRockruffTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sLycanrocMiddayTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLycanrocMidnightTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLycanrocDuskTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROCKRUFF @@ -29534,24 +34490,30 @@ static const u16 sLycanrocDuskTeachableLearnset[] = { static const u16 sWishiwashiTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WISHIWASHI @@ -29561,50 +34523,62 @@ static const u16 sMareanieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sToxapexTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAREANIE @@ -29612,56 +34586,68 @@ static const u16 sToxapexTeachableLearnset[] = { #if P_FAMILY_MUDBRAY static const u16 sMudbrayTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MEGA_KICK, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sMudsdaleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUDBRAY @@ -29671,48 +34657,60 @@ static const u16 sDewpiderTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sAraquanidTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEWPIDER @@ -29722,20 +34720,26 @@ static const u16 sFomantisTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29745,22 +34749,28 @@ static const u16 sLurantisTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FOMANTIS @@ -29769,48 +34779,60 @@ static const u16 sLurantisTeachableLearnset[] = { static const u16 sMorelullTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sShiinoticTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MORELULL @@ -29820,57 +34842,69 @@ static const u16 sSalanditTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sSalazzleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SALANDIT @@ -29881,65 +34915,77 @@ static const u16 sStuffulTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROAR, + MOVE_MIMIC, MOVE_ROCK_SLIDE, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBewearTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROAR, + MOVE_MIMIC, MOVE_ROCK_SLIDE, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STUFFUL @@ -29949,21 +34995,27 @@ static const u16 sBounsweetTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29971,21 +35023,27 @@ static const u16 sSteeneeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29993,24 +35051,30 @@ static const u16 sTsareenaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BOUNSWEET @@ -30021,24 +35085,30 @@ static const u16 sComfeyTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COMFEY @@ -30046,38 +35116,44 @@ static const u16 sComfeyTeachableLearnset[] = { #if P_FAMILY_ORANGURU static const u16 sOranguruTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ORANGURU @@ -30086,37 +35162,43 @@ static const u16 sOranguruTeachableLearnset[] = { static const u16 sPassimianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PASSIMIAN @@ -30124,23 +35206,29 @@ static const u16 sPassimianTeachableLearnset[] = { #if P_FAMILY_WIMPOD static const u16 sWimpodTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -30150,35 +35238,41 @@ static const u16 sGolisopodTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DEFENSE_CURL, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WIMPOD @@ -30188,53 +35282,65 @@ static const u16 sSandygastTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sPalossandTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SANDYGAST @@ -30242,21 +35348,22 @@ static const u16 sPalossandTeachableLearnset[] = { #if P_FAMILY_PYUKUMUKU static const u16 sPyukumukuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_HAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PYUKUMUKU @@ -30264,62 +35371,74 @@ static const u16 sPyukumukuTeachableLearnset[] = { #if P_FAMILY_TYPE_NULL static const u16 sTypeNullTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSilvallyTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYPE_NULL @@ -30328,31 +35447,37 @@ static const u16 sSilvallyTeachableLearnset[] = { static const u16 sMiniorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MINIOR @@ -30360,30 +35485,36 @@ static const u16 sMiniorTeachableLearnset[] = { #if P_FAMILY_KOMALA static const u16 sKomalaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_THIEF, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KOMALA @@ -30391,33 +35522,39 @@ static const u16 sKomalaTeachableLearnset[] = { #if P_FAMILY_TURTONATOR static const u16 sTurtonatorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TURTONATOR @@ -30425,26 +35562,32 @@ static const u16 sTurtonatorTeachableLearnset[] = { #if P_FAMILY_TOGEDEMARU static const u16 sTogedemaruTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOGEDEMARU @@ -30454,31 +35597,37 @@ static const u16 sMimikyuTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MIMIKYU @@ -30491,12 +35640,11 @@ static const u16 sBruxishTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -30504,18 +35652,25 @@ static const u16 sBruxishTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRUXISH @@ -30528,36 +35683,42 @@ static const u16 sDrampaTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRAMPA @@ -30569,24 +35730,30 @@ static const u16 sDhelmiseTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DHELMISE @@ -30595,106 +35762,124 @@ static const u16 sDhelmiseTeachableLearnset[] = { static const u16 sJangmoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sHakamoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sKommoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JANGMO_O @@ -30704,32 +35889,38 @@ static const u16 sTapuKokoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_KOKO @@ -30738,28 +35929,34 @@ static const u16 sTapuKokoTeachableLearnset[] = { static const u16 sTapuLeleTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_LELE @@ -30770,31 +35967,37 @@ static const u16 sTapuBuluTeachableLearnset[] = { MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_BULU @@ -30805,29 +36008,35 @@ static const u16 sTapuFiniTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_FINI @@ -30842,38 +36051,44 @@ static const u16 sCosmoemTeachableLearnset[] = { }; static const u16 sSolgaleoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -30882,89 +36097,107 @@ static const u16 sLunalaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COSMOG #if P_FAMILY_NIHILEGO static const u16 sNihilegoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, - MOVE_SNORE, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NIHILEGO #if P_FAMILY_BUZZWOLE static const u16 sBuzzwoleTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUZZWOLE @@ -30974,22 +36207,28 @@ static const u16 sPheromosaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PHEROMOSA @@ -30998,52 +36237,64 @@ static const u16 sPheromosaTeachableLearnset[] = { static const u16 sXurkitreeTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_XURKITREE #if P_FAMILY_CELESTEELA static const u16 sCelesteelaTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SOLAR_BEAM, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CELESTEELA @@ -31055,45 +36306,57 @@ static const u16 sKartanaTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_FURY_CUTTER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FURY_CUTTER, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KARTANA #if P_FAMILY_GUZZLORD static const u16 sGuzzlordTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_THIEF, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GUZZLORD @@ -31101,47 +36364,51 @@ static const u16 sGuzzlordTeachableLearnset[] = { #if P_FAMILY_NECROZMA static const u16 sNecrozmaTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NECROZMA #if P_FAMILY_MAGEARNA static const u16 sMagearnaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -31149,17 +36416,25 @@ static const u16 sMagearnaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -31170,46 +36445,58 @@ static const u16 sMarshadowTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SNATCH, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_PROTECT, + MOVE_MIMIC, MOVE_PSYCH_UP, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_TOMB, - MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SNATCH, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, - MOVE_THIEF, MOVE_THUNDER_PUNCH, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MARSHADOW #if P_FAMILY_POIPOLE static const u16 sPoipoleTeachableLearnset[] = { - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; @@ -31217,48 +36504,60 @@ static const u16 sNaganadelTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POIPOLE #if P_FAMILY_STAKATAKA static const u16 sStakatakaTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_TOXIC, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STAKATAKA @@ -31267,28 +36566,34 @@ static const u16 sStakatakaTeachableLearnset[] = { static const u16 sBlacephalonTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BLACEPHALON @@ -31300,69 +36605,87 @@ static const u16 sZeraoraTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SNATCH, - MOVE_SNORE, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZERAORA #if P_FAMILY_MELTAN static const u16 sMeltanTeachableLearnset[] = { - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_THUNDERBOLT, + MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMelmetalTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MELTAN @@ -31370,77 +36693,95 @@ static const u16 sMelmetalTeachableLearnset[] = { #if P_FAMILY_GROOKEY static const u16 sGrookeyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sThwackeyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sRillaboomTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GROOKEY @@ -31448,69 +36789,87 @@ static const u16 sRillaboomTeachableLearnset[] = { #if P_FAMILY_SCORBUNNY static const u16 sScorbunnyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MEGA_KICK, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWIFT, - MOVE_TAUNT, MOVE_UNAVAILABLE, }; static const u16 sRabootTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MEGA_KICK, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_UNAVAILABLE, }; static const u16 sCinderaceTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCORBUNNY @@ -31520,20 +36879,26 @@ static const u16 sSobbleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -31541,20 +36906,26 @@ static const u16 sDrizzileTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -31563,28 +36934,34 @@ static const u16 sInteleonTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SURF, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SOBBLE @@ -31592,48 +36969,60 @@ static const u16 sInteleonTeachableLearnset[] = { #if P_FAMILY_SKWOVET static const u16 sSkwovetTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_THIEF, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGreedentTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, - MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKWOVET @@ -31642,64 +37031,82 @@ static const u16 sGreedentTeachableLearnset[] = { static const u16 sRookideeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sCorvisquireTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sCorviknightTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROOKIDEE @@ -31712,40 +37119,52 @@ static const u16 sBlipbugTeachableLearnset[] = { static const u16 sDottlerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SOLAR_BEAM, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sOrbeetleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SOLAR_BEAM, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BLIPBUG @@ -31754,35 +37173,47 @@ static const u16 sOrbeetleTeachableLearnset[] = { static const u16 sNickitTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWIFT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sThievulTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NICKIT @@ -31791,33 +37222,45 @@ static const u16 sThievulTeachableLearnset[] = { static const u16 sGossifleurTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sEldegossTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOSSIFLEUR @@ -31825,15 +37268,21 @@ static const u16 sEldegossTeachableLearnset[] = { #if P_FAMILY_WOOLOO static const u16 sWoolooTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_FACADE, - MOVE_PROTECT, - MOVE_REST, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -31841,18 +37290,24 @@ static const u16 sWoolooTeachableLearnset[] = { static const u16 sDubwoolTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_FACADE, - MOVE_HYPER_BEAM, MOVE_MEGA_KICK, - MOVE_PROTECT, - MOVE_REST, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, @@ -31863,48 +37318,60 @@ static const u16 sDubwoolTeachableLearnset[] = { #if P_FAMILY_CHEWTLE static const u16 sChewtleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIVE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sDrednawTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHEWTLE @@ -31913,17 +37380,23 @@ static const u16 sDrednawTeachableLearnset[] = { static const u16 sYamperTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWIFT, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -31932,18 +37405,24 @@ static const u16 sBoltundTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWIFT, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -31952,72 +37431,90 @@ static const u16 sBoltundTeachableLearnset[] = { #if P_FAMILY_ROLYCOLY static const u16 sRolycolyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCarkolTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCoalossalTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROLYCOLY @@ -32034,83 +37531,107 @@ static const u16 sFlappleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sAppletunTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sDipplinTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sHydrappleTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -32119,38 +37640,50 @@ static const u16 sHydrappleTeachableLearnset[] = { #if P_FAMILY_SILICOBRA static const u16 sSilicobraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sSandacondaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SILICOBRA @@ -32161,21 +37694,27 @@ static const u16 sCramorantTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SURF, MOVE_THIEF, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRAMORANT @@ -32185,18 +37724,24 @@ static const u16 sArrokudaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_DIVE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -32205,20 +37750,26 @@ static const u16 sBarraskewdaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_DIVE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARROKUDA @@ -32226,72 +37777,90 @@ static const u16 sBarraskewdaTeachableLearnset[] = { #if P_FAMILY_TOXEL static const u16 sToxelTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sToxtricityAmpedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sToxtricityLowKeyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TOXIC, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOXEL @@ -32299,34 +37868,46 @@ static const u16 sToxtricityLowKeyTeachableLearnset[] = { #if P_FAMILY_SIZZLIPEDE static const u16 sSizzlipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCentiskorchTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SIZZLIPEDE @@ -32334,46 +37915,58 @@ static const u16 sCentiskorchTeachableLearnset[] = { #if P_FAMILY_CLOBBOPUS static const u16 sClobbopusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIVE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_ICE_PUNCH, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_TAUNT, + MOVE_WATERFALL, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_TAUNT, - MOVE_WATERFALL, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGrapploctTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DIVE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_WATERFALL, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLOBBOPUS @@ -32381,36 +37974,48 @@ static const u16 sGrapploctTeachableLearnset[] = { #if P_FAMILY_SINISTEA static const u16 sSinisteaTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_METRONOME, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sPolteageistTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SINISTEA @@ -32419,20 +38024,26 @@ static const u16 sPolteageistTeachableLearnset[] = { static const u16 sHatennaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -32441,20 +38052,26 @@ static const u16 sHatennaTeachableLearnset[] = { static const u16 sHattremTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -32463,22 +38080,28 @@ static const u16 sHattremTeachableLearnset[] = { static const u16 sHattereneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, @@ -32489,72 +38112,90 @@ static const u16 sHattereneTeachableLearnset[] = { #if P_FAMILY_IMPIDIMP static const u16 sImpidimpTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sMorgremTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sGrimmsnarlTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, + MOVE_TORMENT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TORMENT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IMPIDIMP @@ -32562,55 +38203,73 @@ static const u16 sGrimmsnarlTeachableLearnset[] = { #if P_FAMILY_MILCERY static const u16 sMilceryTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sAlcremieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_SOLAR_BEAM, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SOLAR_BEAM, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MILCERY #if P_FAMILY_FALINKS static const u16 sFalinksTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -32619,19 +38278,25 @@ static const u16 sFalinksTeachableLearnset[] = { #if P_FAMILY_PINCURCHIN static const u16 sPincurchinTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -32640,13 +38305,19 @@ static const u16 sPincurchinTeachableLearnset[] = { #if P_FAMILY_SNOM static const u16 sSnomTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_ENDURE, MOVE_FACADE, - MOVE_ICY_WIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; @@ -32654,20 +38325,26 @@ static const u16 sFrosmothTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -32676,22 +38353,28 @@ static const u16 sFrosmothTeachableLearnset[] = { #if P_FAMILY_STONJOURNER static const u16 sStonjournerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUNNY_DAY, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STONJOURNER @@ -32700,25 +38383,31 @@ static const u16 sStonjournerTeachableLearnset[] = { static const u16 sEiscueTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_EISCUE @@ -32726,41 +38415,53 @@ static const u16 sEiscueTeachableLearnset[] = { #if P_FAMILY_INDEEDEE static const u16 sIndeedeeMTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sIndeedeeFTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -32771,22 +38472,28 @@ static const u16 sMorpekoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWAGGER, - MOVE_SWIFT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_TORMENT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_TORMENT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MORPEKO @@ -32794,53 +38501,65 @@ static const u16 sMorpekoTeachableLearnset[] = { #if P_FAMILY_CUFANT static const u16 sCufantTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MEGA_KICK, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sCopperajahTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_STRENGTH, + MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_STRENGTH, + MOVE_SUBSTITUTE, MOVE_SWAGGER, - MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CUFANT @@ -32848,28 +38567,34 @@ static const u16 sCopperajahTeachableLearnset[] = { #if P_FAMILY_DRACOZOLT static const u16 sDracozoltTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -32879,27 +38604,33 @@ static const u16 sDracozoltTeachableLearnset[] = { #if P_FAMILY_ARCTOZOLT static const u16 sArctozoltTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -32908,22 +38639,28 @@ static const u16 sArctozoltTeachableLearnset[] = { #if P_FAMILY_DRACOVISH static const u16 sDracovishTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIVE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRACOVISH @@ -32931,23 +38668,29 @@ static const u16 sDracovishTeachableLearnset[] = { #if P_FAMILY_ARCTOVISH static const u16 sArctovishTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARCTOVISH @@ -32955,54 +38698,66 @@ static const u16 sArctovishTeachableLearnset[] = { #if P_FAMILY_DURALUDON static const u16 sDuraludonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sArchaludonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -33013,12 +38768,18 @@ static const u16 sArchaludonTeachableLearnset[] = { static const u16 sDreepyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -33027,58 +38788,70 @@ static const u16 sDreepyTeachableLearnset[] = { static const u16 sDrakloakTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDragapultTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -33086,17 +38859,23 @@ static const u16 sDragapultTeachableLearnset[] = { #if P_FAMILY_ZACIAN static const u16 sZacianTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, @@ -33105,11 +38884,11 @@ static const u16 sZacianTeachableLearnset[] = { #if P_FAMILY_ZAMAZENTA static const u16 sZamazentaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -33117,13 +38896,19 @@ static const u16 sZamazentaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -33131,25 +38916,31 @@ static const u16 sZamazentaTeachableLearnset[] = { #if P_FAMILY_ETERNATUS static const u16 sEternatusTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ETERNATUS @@ -33158,25 +38949,31 @@ static const u16 sEternatusTeachableLearnset[] = { static const u16 sKubfuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROCK_SMASH, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, @@ -33185,31 +38982,37 @@ static const u16 sKubfuTeachableLearnset[] = { static const u16 sUrshifuSingleStrikeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, - MOVE_FACADE, MOVE_FIRE_PUNCH, - MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROAR, + MOVE_MIMIC, MOVE_ROCK_SLIDE, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -33217,34 +39020,40 @@ static const u16 sUrshifuSingleStrikeTeachableLearnset[] = { static const u16 sUrshifuRapidStrikeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, + MOVE_TAUNT, + MOVE_WATERFALL, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_THUNDER_PUNCH, - MOVE_WATERFALL, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KUBFU @@ -33252,56 +39061,68 @@ static const u16 sUrshifuRapidStrikeTeachableLearnset[] = { #if P_FAMILY_ZARUDE static const u16 sZarudeTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, - MOVE_SNORE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZARUDE #if P_FAMILY_REGIELEKI static const u16 sRegielekiTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -33309,19 +39130,25 @@ static const u16 sRegielekiTeachableLearnset[] = { #if P_FAMILY_REGIDRAGO static const u16 sRegidragoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -33330,42 +39157,54 @@ static const u16 sRegidragoTeachableLearnset[] = { #if P_FAMILY_GLASTRIER static const u16 sGlastrierTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HAIL, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_SECRET_POWER, + MOVE_TAUNT, + MOVE_TORMENT, MOVE_BODY_SLAM, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_FACADE, - MOVE_HAIL, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, MOVE_ICY_WIND, - MOVE_PROTECT, - MOVE_REST, - MOVE_ROAR, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_TORMENT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GLASTRIER #if P_FAMILY_SPECTRIER static const u16 sSpectrierTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, - MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPECTRIER @@ -33374,23 +39213,29 @@ static const u16 sSpectrierTeachableLearnset[] = { static const u16 sCalyrexTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -33398,63 +39243,75 @@ static const u16 sCalyrexTeachableLearnset[] = { #if P_FUSION_FORMS static const u16 sCalyrexIceTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sCalyrexShadowTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FUSION_FORMS @@ -33462,23 +39319,29 @@ static const u16 sCalyrexShadowTeachableLearnset[] = { #if P_FAMILY_ENAMORUS static const u16 sEnamorusTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_TORMENT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ENAMORUS @@ -33486,32 +39349,44 @@ static const u16 sEnamorusTeachableLearnset[] = { #if P_FAMILY_SPRIGATITO static const u16 sSprigatitoTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWIFT, MOVE_TAUNT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sFloragatoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MUD_SLAP, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWIFT, MOVE_TAUNT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -33521,21 +39396,27 @@ static const u16 sMeowscaradaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -33543,57 +39424,75 @@ static const u16 sMeowscaradaTeachableLearnset[] = { #if P_FAMILY_FUECOCO static const u16 sFuecocoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCrocalorTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sSkeledirgeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FUECOCO @@ -33601,30 +39500,42 @@ static const u16 sSkeledirgeTeachableLearnset[] = { #if P_FAMILY_QUAXLY static const u16 sQuaxlyTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sQuaxwellTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -33632,130 +39543,172 @@ static const u16 sQuaquavalTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_QUAXLY #if P_FAMILY_LECHONK static const u16 sLechonkTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sOinkologneTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LECHONK #if P_FAMILY_TAROUNTULA static const u16 sTarountulaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sSpidopsTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAROUNTULA #if P_FAMILY_NYMBLE static const u16 sNymbleTeachableLearnset[] = { - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sLokixTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NYMBLE @@ -33763,35 +39716,47 @@ static const u16 sLokixTeachableLearnset[] = { #if P_FAMILY_PAWMI static const u16 sPawmiTeachableLearnset[] = { MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sPawmoTeachableLearnset[] = { MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -33801,24 +39766,30 @@ static const u16 sPawmotTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -33830,20 +39801,26 @@ static const u16 sTandemausTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -33851,58 +39828,76 @@ static const u16 sMausholdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_WATER_PULSE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TANDEMAUS #if P_FAMILY_FIDOUGH static const u16 sFidoughTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sDachsbunTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FIDOUGH @@ -33910,48 +39905,66 @@ static const u16 sDachsbunTeachableLearnset[] = { #if P_FAMILY_SMOLIV static const u16 sSmolivTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sDollivTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sArbolivaTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -33960,79 +39973,103 @@ static const u16 sArbolivaTeachableLearnset[] = { #if P_FAMILY_SQUAWKABILLY static const u16 sSquawkabillyTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SQUAWKABILLY #if P_FAMILY_NACLI static const u16 sNacliTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sNaclstackTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGarganaclTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -34040,36 +40077,48 @@ static const u16 sGarganaclTeachableLearnset[] = { #if P_FAMILY_CHARCADET static const u16 sCharcadetTeachableLearnset[] = { - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sArmarougeTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; @@ -34077,59 +40126,77 @@ static const u16 sCeruledgeTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHARCADET #if P_FAMILY_TADBULB static const u16 sTadbulbTeachableLearnset[] = { - MOVE_ENDURE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SWIFT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sBelliboltTeachableLearnset[] = { - MOVE_ENDURE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SWIFT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, + MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TADBULB @@ -34137,31 +40204,43 @@ static const u16 sBelliboltTeachableLearnset[] = { #if P_FAMILY_WATTREL static const u16 sWattrelTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SWIFT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sKilowattrelTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SWIFT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -34169,39 +40248,51 @@ static const u16 sKilowattrelTeachableLearnset[] = { #if P_FAMILY_MASCHIFF static const u16 sMaschiffTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sMabosstiffTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MASCHIFF @@ -34209,45 +40300,57 @@ static const u16 sMabosstiffTeachableLearnset[] = { #if P_FAMILY_SHROODLE static const u16 sShroodleTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sGrafaiaiTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_METRONOME, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHROODLE @@ -34255,34 +40358,46 @@ static const u16 sGrafaiaiTeachableLearnset[] = { #if P_FAMILY_BRAMBLIN static const u16 sBramblinTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_THIEF, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sBrambleghastTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_THIEF, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRAMBLIN @@ -34290,64 +40405,82 @@ static const u16 sBrambleghastTeachableLearnset[] = { #if P_FAMILY_TOEDSCOOL static const u16 sToedscoolTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sToedscruelTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, - MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOEDSCOOL #if P_FAMILY_KLAWF static const u16 sKlawfTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KLAWF @@ -34355,83 +40488,107 @@ static const u16 sKlawfTeachableLearnset[] = { #if P_FAMILY_CAPSAKID static const u16 sCapsakidTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sScovillainTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CAPSAKID #if P_FAMILY_RELLOR static const u16 sRellorTeachableLearnset[] = { - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_THIEF, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sRabscaTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RELLOR @@ -34439,107 +40596,137 @@ static const u16 sRabscaTeachableLearnset[] = { #if P_FAMILY_FLITTLE static const u16 sFlittleTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sEspathraTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLITTLE #if P_FAMILY_TINKATINK static const u16 sTinkatinkTeachableLearnset[] = { - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, MOVE_THIEF, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sTinkatuffTeachableLearnset[] = { MOVE_BRICK_BREAK, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, MOVE_THIEF, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sTinkatonTeachableLearnset[] = { MOVE_BRICK_BREAK, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, MOVE_THIEF, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -34549,37 +40736,49 @@ static const u16 sTinkatonTeachableLearnset[] = { static const u16 sWiglettTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sWugtrioTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIG, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WIGLETT @@ -34587,23 +40786,29 @@ static const u16 sWugtrioTeachableLearnset[] = { #if P_FAMILY_BOMBIRDIER static const u16 sBombirdierTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BOMBIRDIER @@ -34611,92 +40816,116 @@ static const u16 sBombirdierTeachableLearnset[] = { #if P_FAMILY_FINIZEN static const u16 sFinizenTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIVE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPalafinTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIVE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWIFT, MOVE_TAUNT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FINIZEN #if P_FAMILY_VAROOM static const u16 sVaroomTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sRevavroomTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VAROOM @@ -34704,86 +40933,110 @@ static const u16 sRevavroomTeachableLearnset[] = { #if P_FAMILY_CYCLIZAR static const u16 sCyclizarTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CYCLIZAR #if P_FAMILY_ORTHWORM static const u16 sOrthwormTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ORTHWORM #if P_FAMILY_GLIMMET static const u16 sGlimmetTeachableLearnset[] = { - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGlimmoraTeachableLearnset[] = { - MOVE_ENDURE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GLIMMET @@ -34791,38 +41044,50 @@ static const u16 sGlimmoraTeachableLearnset[] = { #if P_FAMILY_GREAVARD static const u16 sGreavardTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_MUD_SLAP, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sHoundstoneTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GREAVARD @@ -34832,19 +41097,25 @@ static const u16 sFlamigoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_WATER_PULSE, + MOVE_ENDURE, + MOVE_MEGA_KICK, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLAMIGO @@ -34852,38 +41123,50 @@ static const u16 sFlamigoTeachableLearnset[] = { #if P_FAMILY_CETODDLE static const u16 sCetoddleTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCetitanTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CETODDLE @@ -34891,86 +41174,110 @@ static const u16 sCetitanTeachableLearnset[] = { #if P_FAMILY_VELUZA static const u16 sVeluzaTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VELUZA #if P_FAMILY_DONDOZO static const u16 sDondozoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DONDOZO #if P_FAMILY_TATSUGIRI static const u16 sTatsugiriTeachableLearnset[] = { - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_WATER_PULSE, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TATSUGIRI #if P_FAMILY_GREAT_TUSK static const u16 sGreatTuskTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DEFENSE_CURL, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GREAT_TUSK @@ -34978,57 +41285,69 @@ static const u16 sGreatTuskTeachableLearnset[] = { #if P_FAMILY_SCREAM_TAIL static const u16 sScreamTailTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, - MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCREAM_TAIL #if P_FAMILY_BRUTE_BONNET static const u16 sBruteBonnetTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRUTE_BONNET @@ -35036,18 +41355,24 @@ static const u16 sBruteBonnetTeachableLearnset[] = { #if P_FAMILY_FLUTTER_MANE static const u16 sFlutterManeTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -35056,42 +41381,54 @@ static const u16 sFlutterManeTeachableLearnset[] = { #if P_FAMILY_SLITHER_WING static const u16 sSlitherWingTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SLITHER_WING #if P_FAMILY_SANDY_SHOCKS static const u16 sSandyShocksTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -35099,21 +41436,27 @@ static const u16 sSandyShocksTeachableLearnset[] = { #if P_FAMILY_IRON_TREADS static const u16 sIronTreadsTeachableLearnset[] = { + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_PROTECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_THUNDER, MOVE_BODY_SLAM, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_HYPER_BEAM, + MOVE_MIMIC, MOVE_MUD_SLAP, - MOVE_PROTECT, - MOVE_REST, MOVE_ROCK_SLIDE, - MOVE_ROCK_TOMB, MOVE_ROLLOUT, - MOVE_SANDSTORM, MOVE_SLEEP_TALK, - MOVE_THUNDER, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_TREADS @@ -35121,47 +41464,59 @@ static const u16 sIronTreadsTeachableLearnset[] = { #if P_FAMILY_IRON_BUNDLE static const u16 sIronBundleTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SWIFT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_BUNDLE #if P_FAMILY_IRON_HANDS static const u16 sIronHandsTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -35169,43 +41524,55 @@ static const u16 sIronHandsTeachableLearnset[] = { #if P_FAMILY_IRON_JUGULIS static const u16 sIronJugulisTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_JUGULIS #if P_FAMILY_IRON_MOTH static const u16 sIronMothTeachableLearnset[] = { - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWIFT, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_MOTH @@ -35213,32 +41580,38 @@ static const u16 sIronMothTeachableLearnset[] = { #if P_FAMILY_IRON_THORNS static const u16 sIronThornsTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, - MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -35248,17 +41621,23 @@ static const u16 sIronThornsTeachableLearnset[] = { #if P_FAMILY_FRIGIBAX static const u16 sFrigibaxTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -35266,18 +41645,24 @@ static const u16 sFrigibaxTeachableLearnset[] = { static const u16 sArctibaxTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -35285,21 +41670,27 @@ static const u16 sArctibaxTeachableLearnset[] = { static const u16 sBaxcaliburTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -35307,32 +41698,44 @@ static const u16 sBaxcaliburTeachableLearnset[] = { #if P_FAMILY_GIMMIGHOUL static const u16 sGimmighoulTeachableLearnset[] = { - MOVE_ENDURE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_THIEF, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGholdengoTeachableLearnset[] = { - MOVE_ENDURE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -35341,22 +41744,28 @@ static const u16 sGholdengoTeachableLearnset[] = { #if P_FAMILY_WO_CHIEN static const u16 sWoChienTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WO_CHIEN @@ -35366,48 +41775,61 @@ static const u16 sChienPaoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, MOVE_BRICK_BREAK, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIEN_PAO #if P_FAMILY_TING_LU static const u16 sTingLuTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TING_LU #if P_FAMILY_CHI_YU static const u16 sChiYuTeachableLearnset[] = { - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -35415,10 +41837,15 @@ static const u16 sChiYuTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWAGGER, MOVE_TAUNT, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHI_YU @@ -35426,25 +41853,31 @@ static const u16 sChiYuTeachableLearnset[] = { #if P_FAMILY_ROARING_MOON static const u16 sRoaringMoonTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROARING_MOON @@ -35455,26 +41888,32 @@ static const u16 sIronValiantTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_REFLECT, + MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, + MOVE_TAUNT, + MOVE_THUNDERBOLT, MOVE_ENDURE, MOVE_FIRE_PUNCH, MOVE_FURY_CUTTER, - MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, - MOVE_LIGHT_SCREEN, MOVE_METRONOME, - MOVE_PROTECT, - MOVE_PSYCHIC, + MOVE_MIMIC, MOVE_PSYCH_UP, - MOVE_REFLECT, - MOVE_REST, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, - MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -35483,54 +41922,66 @@ static const u16 sIronValiantTeachableLearnset[] = { #if P_FAMILY_KORAIDON static const u16 sKoraidonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KORAIDON #if P_FAMILY_MIRAIDON static const u16 sMiraidonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -35538,23 +41989,29 @@ static const u16 sMiraidonTeachableLearnset[] = { #if P_FAMILY_WALKING_WAKE static const u16 sWalkingWakeTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WALKING_WAKE @@ -35564,18 +42021,24 @@ static const u16 sIronLeavesTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_SLEEP_TALK, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, + MOVE_TAUNT, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, - MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_LEAVES @@ -35583,58 +42046,76 @@ static const u16 sIronLeavesTeachableLearnset[] = { #if P_FAMILY_POLTCHAGEIST static const u16 sPoltchageistTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sSinistchaTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POLTCHAGEIST #if P_FAMILY_OKIDOGI static const u16 sOkidogiTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, - MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_PUNCH, MOVE_TOXIC, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_OKIDOGI @@ -35642,23 +42123,29 @@ static const u16 sOkidogiTeachableLearnset[] = { #if P_FAMILY_MUNKIDORI static const u16 sMunkidoriTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, - MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUNKIDORI @@ -35668,24 +42155,30 @@ static const u16 sFezandipitiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_PSYCH_UP, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, + MOVE_ENDURE, + MOVE_ICY_WIND, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FEZANDIPITI @@ -35694,64 +42187,82 @@ static const u16 sFezandipitiTeachableLearnset[] = { static const u16 sOgerponTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_OGERPON #if P_FAMILY_GOUGING_FIRE static const u16 sGougingFireTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOUGING_FIRE #if P_FAMILY_RAGING_BOLT static const u16 sRagingBoltTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -35760,39 +42271,51 @@ static const u16 sRagingBoltTeachableLearnset[] = { #if P_FAMILY_IRON_BOULDER static const u16 sIronBoulderTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SLEEP_TALK, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, + MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_BOULDER #if P_FAMILY_IRON_CROWN static const u16 sIronCrownTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -35800,21 +42323,20 @@ static const u16 sIronCrownTeachableLearnset[] = { #if P_FAMILY_TERAPAGOS static const u16 sTerapagosTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, @@ -35822,21 +42344,68 @@ static const u16 sTerapagosTeachableLearnset[] = { MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TERAPAGOS #if P_FAMILY_PECHARUNT static const u16 sPecharuntTeachableLearnset[] = { - MOVE_DEFENSE_CURL, - MOVE_ENDURE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROLLOUT, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_TOXIC, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, + MOVE_MIMIC, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PECHARUNT + +const u16 gTutorMoves[] = { + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, + MOVE_FIRE_PUNCH, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MIMIC, + MOVE_MUD_SLAP, + MOVE_PSYCH_UP, + MOVE_ROCK_SLIDE, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SOFT_BOILED, + MOVE_SUBSTITUTE, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, + MOVE_UNAVAILABLE, +}; diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 9a28f13a54..5fcd7d3ef0 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -290,9 +290,6 @@ static EWRAM_DATA u16 sLastSelectedPokemon = 0; static EWRAM_DATA u8 sPokeBallRotation = 0; static EWRAM_DATA struct PokedexListItem *sPokedexListItem = NULL; //Pokedex Plus HGSS_Ui -#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_ALL_MACHINES) -EWRAM_DATA static u16 sStatsMoves[MOVES_COUNT_TOTAL] = {0}; -EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_ALL_MACHINES] = {0}; struct SearchOptionText @@ -409,8 +406,7 @@ struct PokedexView u8 categoryIconSpriteId; //Physical/Special/Status category u8 numEggMoves; u8 numLevelUpMoves; - u8 numTMHMMoves; - u8 numTutorMoves; + u8 numTeachableMoves; u8 numPreEvolutions; struct PokemonStats sPokemonStats; struct EvoScreenData sEvoScreenData; @@ -4871,7 +4867,7 @@ static void Task_LoadStatsScreen(u8 taskId) sPokedexView->movesTotal = 0; sPokedexView->numEggMoves = 0; sPokedexView->numLevelUpMoves = 0; - sPokedexView->numTMHMMoves = 0; + sPokedexView->numTeachableMoves = 0; if (CalculateMoves()) gMain.state++; break; @@ -5059,87 +5055,15 @@ static void PrintStatsScreen_DestroyMoveItemIcon(u8 taskId) DestroySprite(&gSprites[gTasks[taskId].data[3]]); //Destroy item icon } -static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *numTutorMoves) -{ - u16 i, move; - bool8 isTMMove[MOVES_COUNT] = {0}; - const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); - - // TM Moves - if (HGSS_SORT_TMS_BY_NUM) - { - for (i = 0; i < NUM_ALL_MACHINES; i++) - { - move = GetTMHMMoveId(i + 1); - if (move != MOVE_NONE && CanLearnTeachableMove(species, move)) - { - isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(i + 1); - (*numTMHMMoves)++; - sStatsMoves[movesTotal] = move; - movesTotal++; - } - } - } - else - { - for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) - { - move = teachableLearnset[i]; - for (u16 j = 0; j < NUM_ALL_MACHINES; j++) - { - if (GetTMHMMoveId(j + 1) == move) - { - isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(j + 1); - (*numTMHMMoves)++; - sStatsMoves[movesTotal] = move; - movesTotal++; - break; - } - } - } - } - - // Tutor Moves -#if P_TUTOR_MOVES_ARRAY - for (i = 0; gTutorMoves[i] != MOVE_UNAVAILABLE; i++) - { - move = gTutorMoves[i]; - if (!isTMMove[move] && CanLearnTeachableMove(species, move)) - { - sStatsMoves[movesTotal] = move; - movesTotal++; - (*numTutorMoves)++; - } - } -#else - for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) - { - move = teachableLearnset[i]; - if (!isTMMove[move] && CanLearnTeachableMove(species, move)) - { - sStatsMoves[movesTotal] = move; - movesTotal++; - (*numTutorMoves)++; - } - } -#endif - return movesTotal; -} - static bool8 CalculateMoves(void) { u16 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); u16 statsMovesEgg[EGG_MOVES_ARRAY_COUNT] = {0}; - u16 statsMovesLevelUp[MAX_LEVEL_UP_MOVES] = {0}; u8 numEggMoves = 0; u8 numLevelUpMoves = 0; - u8 numTMHMMoves = 0; - u8 numTutorMoves = 0; - u16 movesTotal = 0; + u8 numTeachableMoves = 0; u8 i; // Mega and Gmax Pokémon don't have distinct learnsets from their base form; so use base species for calculation @@ -5161,57 +5085,91 @@ static bool8 CalculateMoves(void) numEggMoves = GetEggMovesBySpecies(species, statsMovesEgg); } - for (i = 0; i < numEggMoves; i++) - { - sStatsMoves[movesTotal] = statsMovesEgg[i]; - movesTotal++; - } - // Level up moves - numLevelUpMoves = GetLevelUpMovesBySpecies(species, statsMovesLevelUp); - for (i = 0; i < numLevelUpMoves; i++) - { - sStatsMoves[movesTotal] = statsMovesLevelUp[i]; - movesTotal++; - } + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + for (i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) + numLevelUpMoves++; // TM and Tutor moves - movesTotal = AddTMTutorMoves(species, movesTotal, &numTMHMMoves, &numTutorMoves); + const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); + for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) + numTeachableMoves++; sPokedexView->numEggMoves = numEggMoves; sPokedexView->numLevelUpMoves = numLevelUpMoves; - sPokedexView->numTMHMMoves = numTMHMMoves; - sPokedexView->numTutorMoves = numTutorMoves; - sPokedexView->movesTotal = movesTotal; + sPokedexView->numTeachableMoves = numTeachableMoves; + sPokedexView->movesTotal = (numEggMoves + numLevelUpMoves + numTeachableMoves); return TRUE; } +static u16 GetSelectedMove(u32 species, u32 selected) +{ + if (selected < sPokedexView->numEggMoves) + return GetSpeciesEggMoves(species)[selected]; + selected -= sPokedexView->numEggMoves; + if (selected < sPokedexView->numLevelUpMoves) + return GetSpeciesLevelUpLearnset(species)[selected].move; + selected -= sPokedexView->numLevelUpMoves; + if (selected < sPokedexView->numTeachableMoves) + return GetSpeciesTeachableLearnset(species)[selected]; + return MOVE_NONE; //It should never get here but it allows us to visually see errors +} + static void PrintStatsScreen_Moves_Top(u8 taskId) { - u8 numEggMoves = sPokedexView->numEggMoves; - u8 numLevelUpMoves = sPokedexView->numLevelUpMoves; - u8 numTMHMMoves = sPokedexView->numTMHMMoves; - u8 numTutorMoves = sPokedexView->numTutorMoves; - u16 movesTotal = sPokedexView->movesTotal; - u16 selected = sPokedexView->moveSelected; - u8 level; u8 moves_x = 5; u8 moves_y = 3; - u16 move; - u16 item; - - u16 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); - - //Move - move = sStatsMoves[selected]; + u32 item = ITEM_MASTER_BALL; + u32 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); + u32 selected = sPokedexView->moveSelected; + u32 move = GetSelectedMove(species, selected); //Moves selected from move max ConvertIntToDecimalStringN(gStringVar1, (selected+1), STR_CONV_MODE_RIGHT_ALIGN, 3); - ConvertIntToDecimalStringN(gStringVar2, movesTotal, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, sPokedexView->movesTotal, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar1, sText_Stats_MoveSelectedMax); PrintStatsScreenTextSmallWhite(WIN_STATS_MOVES_TOP, gStringVar1, moves_x-1, moves_y+1); + //Calculate and retrieve correct move from the arrays + if (selected < sPokedexView->numEggMoves) + { + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); + item = ITEM_LUCKY_EGG; + } + else if (selected < (sPokedexView->numLevelUpMoves + sPokedexView->numEggMoves)) + { + u32 level = GetSpeciesLevelUpLearnset(species)[selected - sPokedexView->numEggMoves].level; + ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEFT_ALIGN, 3); //Move learn lvl + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, sText_Stats_MoveLevel, moves_x + 113, moves_y + 3); //Level text + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 14); //Print level + item = ITEM_RARE_CANDY; + } + else if (move) + { + u32 TMHMItemId = ITEM_NONE; + for (u32 i = 0; i < NUM_ALL_MACHINES; i++) + { + if (move == GetTMHMMoveId(i + 1)) + TMHMItemId = GetTMHMItemId(i + 1); + } + if (TMHMItemId) + { + CopyItemName(TMHMItemId, gStringVar1); //TM name + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 9); + item = TMHMItemId; + } + else + { + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); + item = ITEM_TEACHY_TV; + } + } + else + { + StringCopy(gStringVar4, gText_CommunicationError); + } + //Move name StringCopy(gStringVar3, GetMoveName(move)); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 20); @@ -5229,37 +5187,6 @@ static void PrintStatsScreen_Moves_Top(u8 taskId) SetSpriteInvisibility(0, TRUE); } - //Calculate and retrieve correct move from the arrays - if (selected < numEggMoves) - { - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); - item = ITEM_LUCKY_EGG; - } - else if (selected < (numEggMoves + numLevelUpMoves)) - { - level = GetSpeciesLevelUpLearnset(species)[(selected-numEggMoves)].level; - ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEFT_ALIGN, 3); //Move learn lvl - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, sText_Stats_MoveLevel, moves_x + 113, moves_y + 3); //Level text - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 14); //Print level - item = ITEM_RARE_CANDY; - } - else if (selected < (numEggMoves + numLevelUpMoves + numTMHMMoves)) - { - CopyItemName(sStatsMovesTMHM_ID[(selected-numEggMoves-numLevelUpMoves)], gStringVar1); //TM name - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 9); - item = sStatsMovesTMHM_ID[(selected-numEggMoves-numLevelUpMoves)]; - } - else if (selected < (numEggMoves + numLevelUpMoves + numTMHMMoves + numTutorMoves)) - { - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); - item = ITEM_TEACHY_TV; - } - else - { - StringCopy(gStringVar4, gText_CommunicationError); - item = ITEM_MASTER_BALL; - } - //Egg/TM/Level/Tutor Item Icon gTasks[taskId].data[3] = AddItemIconSprite(ITEM_TAG, ITEM_TAG, item); gSprites[gTasks[taskId].data[3]].x2 = 203; @@ -5270,13 +5197,11 @@ static void PrintStatsScreen_Moves_Top(u8 taskId) static void PrintStatsScreen_Moves_Description(u8 taskId) { - u16 selected = sPokedexView->moveSelected; - u16 move; u8 moves_x = 5; u8 moves_y = 5; - //Move - move = sStatsMoves[selected]; + u32 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); + u32 move = GetSelectedMove(species, sPokedexView->moveSelected); //Move description if (gTasks[taskId].data[5] == 0) @@ -5295,6 +5220,7 @@ static void PrintStatsScreen_Moves_BottomText(u8 taskId) { u8 moves_x = 8; u8 moves_y = 3; + if (gTasks[taskId].data[5] == 0) { PrintStatsScreenTextSmall(WIN_STATS_MOVES_BOTTOM, gText_Power, moves_x, moves_y); @@ -5311,15 +5237,14 @@ static void PrintStatsScreen_Moves_Bottom(u8 taskId) { u8 moves_x = 8; u8 moves_y = 3; - u8 selected = sPokedexView->moveSelected; - u16 move; + //Contest u8 contest_effectValue; u8 contest_appeal = 0; u8 contest_jam = 0; - //Move - move = sStatsMoves[selected]; + u32 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); + u32 move = GetSelectedMove(species, sPokedexView->moveSelected); //Power + Accuracy if (gTasks[taskId].data[5] == 0) diff --git a/src/pokemon.c b/src/pokemon.c index 08ca51ee65..e241cf3d03 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -95,9 +95,6 @@ EWRAM_DATA static u8 sTriedEvolving = 0; EWRAM_DATA u16 gFollowerSteps = 0; #include "data/abilities.h" -#if P_TUTOR_MOVES_ARRAY -#include "data/tutor_moves.h" -#endif // P_TUTOR_MOVES_ARRAY // Used in an unreferenced function in RS. // Unreferenced here and in FRLG. @@ -5581,89 +5578,17 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon) } } -static const u16 sUniversalMoves[] = -{ - MOVE_BIDE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_MIMIC, - MOVE_NATURAL_GIFT, - MOVE_RAGE, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUBSTITUTE, - MOVE_TERA_BLAST, -}; - u8 CanLearnTeachableMove(u16 species, u16 move) { + const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); if (species == SPECIES_EGG) - { return FALSE; - } - else if (species == SPECIES_MEW) + for (u32 i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) { - switch (move) - { - case MOVE_BADDY_BAD: - case MOVE_BOUNCY_BUBBLE: - case MOVE_BUZZY_BUZZ: - case MOVE_DRAGON_ASCENT: - case MOVE_FLOATY_FALL: - case MOVE_FREEZY_FROST: - case MOVE_GLITZY_GLOW: - case MOVE_RELIC_SONG: - case MOVE_SAPPY_SEED: - case MOVE_SECRET_SWORD: - case MOVE_SIZZLY_SLIDE: - case MOVE_SPARKLY_SWIRL: - case MOVE_SPLISHY_SPLASH: - case MOVE_VOLT_TACKLE: - case MOVE_ZIPPY_ZAP: - return FALSE; - default: + if (teachableLearnset[i] == move) return TRUE; - } - } - else - { - u32 i, j; - const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); - for (i = 0; i < ARRAY_COUNT(sUniversalMoves); i++) - { - if (sUniversalMoves[i] == move) - { - if (!gSpeciesInfo[species].tmIlliterate) - { - if (move == MOVE_TERA_BLAST && GET_BASE_SPECIES_ID(species) == SPECIES_TERAPAGOS) - return FALSE; - if (GET_BASE_SPECIES_ID(species) == SPECIES_PYUKUMUKU && (move == MOVE_HIDDEN_POWER || move == MOVE_RETURN || move == MOVE_FRUSTRATION)) - return FALSE; - return TRUE; - } - else - { - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - - if (P_TM_LITERACY < GEN_6) - return FALSE; - - for (j = 0; j < MAX_LEVEL_UP_MOVES && learnset[j].move != LEVEL_UP_MOVE_END; j++) - { - if (learnset[j].move == move) - return TRUE; - } - return FALSE; - } - } - } - for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) - { - if (teachableLearnset[i] == move) - return TRUE; - } - return FALSE; } + return FALSE; } u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) diff --git a/tools/learnset_helpers/make_teachables.py b/tools/learnset_helpers/make_teachables.py index 6f3b186b68..d8c79adf94 100644 --- a/tools/learnset_helpers/make_teachables.py +++ b/tools/learnset_helpers/make_teachables.py @@ -33,14 +33,14 @@ import typing CONFIG_ENABLED_PAT = re.compile(r"#define P_LEARNSET_HELPER_TEACHABLE\s+(?P[^ ]*)") -INCFILE_HAS_TUTOR_PAT = re.compile(r"special ChooseMonForMoveTutor") -INCFILE_MOVE_PAT = re.compile(r"setvar VAR_0x8005, (MOVE_.*)") +ALPHABETICAL_ORDER_ENABLED_PAT = re.compile(r"#define HGSS_SORT_TMS_BY_NUM\s+(?P[^ ]*)") +TM_LITTERACY_PAT = re.compile(r"#define P_TM_LITERACY\s+GEN_(?P[^ ]*)") TMHM_MACRO_PAT = re.compile(r"F\((\w+)\)") -UNIVERSAL_MOVES_PAT = re.compile(r"static const u16 sUniversalMoves\[\]\s*=\s*{((.|\n)*?)\n};") TEACHABLE_ARRAY_DECL_PAT = re.compile(r"(?Pstatic const u16 s(?P\w+)TeachableLearnset\[\]) = {[\s\S]*?};") +MOVE_TUTOR_ARRAY_DECL_PAT = re.compile(r"(?Pconst u16 gTutorMoves\[\] = {)[\s\S]*? MOVE_UNAVAILABLE,") SNAKIFY_PAT = re.compile(r"(?!^)([A-Z]+)") -TUTOR_ARRAY_ENABLED_PAT = re.compile(r"#define\s+P_TUTOR_MOVES_ARRAY\s+(?P[^ ]*)") - +TUTOR_ARRAY_ENABLED_PAT = re.compile(r"#define\s+POKEDEX_PLUS_HGSS\s+(?P[^ ]*)") +POKEMON_TEACHING_TYPE_PAT = re.compile(r"\{[\s\S]*?(.teachingType\s*=\s*(?P[A-Z_]+),[\s\S]*?)?\.teachableLearnset\s*=\s*s(?P\w+?)TeachableLearnset[\s\S]*?\}") def enabled() -> bool: """ @@ -51,22 +51,6 @@ def enabled() -> bool: cfg_defined = CONFIG_ENABLED_PAT.search(cfg_pokemon) return cfg_defined is not None and cfg_defined.group("cfg_val") in ("TRUE", "1") - -def extract_repo_tutors() -> typing.Generator[str, None, None]: - """ - Yield MOVE constants which are *likely* assigned to a move tutor. This isn't - foolproof, but it's suitable. - """ - for inc_fname in chain(glob.glob("./data/scripts/*.inc"), glob.glob("./data/maps/*/scripts.inc")): - with open(inc_fname, "r") as inc_fp: - incfile = inc_fp.read() - if not INCFILE_HAS_TUTOR_PAT.search(incfile): - continue - - for move in INCFILE_MOVE_PAT.finditer(incfile): - yield move.group(1) - - def extract_repo_tms() -> typing.Generator[str, None, None]: """ Yield MOVE constants assigned to a TM or HM in the user's repo. @@ -80,22 +64,37 @@ def extract_repo_tms() -> typing.Generator[str, None, None]: for match in match_it: yield f"MOVE_{match.group(1)}" +def extract_repo_teaching_types() -> dict[str, str]: + species_teaching_types = {} + for families_fname in sorted(glob.glob("src/data/pokemon/species_info/gen_*_families.h")): + with open(families_fname, "r") as family_fp: + family_file = family_fp.read() + for pokemon in POKEMON_TEACHING_TYPE_PAT.finditer(family_file): + if pokemon.group("teaching_type"): + species_teaching_types[pokemon.group("name")] = pokemon.group("teaching_type") + else: + species_teaching_types[pokemon.group("name")] = "DEFAULT_LEARNING" + return species_teaching_types -def extract_repo_universals() -> list[str]: - """ - Return a list of MOVE constants which are deemed to be universal and can - thus be learned by any species. - """ - with open("./src/pokemon.c", "r") as pokemon_fp: - if match := UNIVERSAL_MOVES_PAT.search(pokemon_fp.read()): - return list(filter(lambda s: s, map(lambda s: s.strip(), match.group(1).split(',')))) - return list() +def extract_tm_litteracy_config() -> bool: + config = False + with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = TM_LITTERACY_PAT.search(cfg_pokemon) + if cfg_defined: + cfg_val = cfg_defined.group("cfg_val") + if ((cfg_val == "LATEST") or (int(cfg_val) > 6)): + config = True + return config - -def prepare_output(all_learnables: dict[str, set[str]], repo_teachables: set[str], header: str) -> str: +def prepare_output(all_learnables: dict[str, set[str]], tms: list[str], tutors: list[str], special_movesets, header: str) -> str: """ Build the file content for teachable_learnsets.h. """ + + repo_teaching_types = extract_repo_teaching_types() + tm_litteracy_config = extract_tm_litteracy_config() + with open("./src/data/pokemon/teachable_learnsets.h", "r") as teachables_fp: old = teachables_fp.read() @@ -115,13 +114,22 @@ def prepare_output(all_learnables: dict[str, set[str]], repo_teachables: set[str cursor = match_e + 1 continue - if species_upper == "MEW": - new += old[cursor:match_e + 1] # copy the original content and skip. - cursor = match_e + 1 - continue + if repo_teaching_types[species.group("name")] == "ALL_TEACHABLES": + learnables = filter(lambda m: m not in special_movesets["signatureTeachables"], tms + tutors) + elif repo_teaching_types[species.group("name")] == "TM_ILLITERATE": + learnables = all_learnables[species_upper] + if not tm_litteracy_config: + learnables = filter(lambda m: m not in special_movesets["universalMoves"], learnables) + else: + learnables = all_learnables[species_upper] + special_movesets["universalMoves"] - repo_species_teachables = filter(lambda m: m in repo_teachables, all_learnables[species_upper]) + part1 = list(filter(lambda m: m in learnables, tms)) + part2 = list(filter(lambda m: m in learnables, tutors)) + repo_species_teachables = part1 + part2 + if species_upper == "TERAPAGOS": + repo_species_teachables = filter(lambda m: m != "MOVE_TERA_BLAST", repo_species_teachables) + repo_species_teachables = list(dict.fromkeys(repo_species_teachables)) new += old[cursor:match_b] new += "\n".join([ f"{species.group('decl')} = {{", @@ -130,39 +138,23 @@ def prepare_output(all_learnables: dict[str, set[str]], repo_teachables: set[str ]) cursor = match_e + 1 + tutors_array = MOVE_TUTOR_ARRAY_DECL_PAT.search(old) + match_b, match_e = tutors_array.span() + new += old[cursor:match_b] + new += "\n".join([ + f"{tutors_array.group('decl')}", + f" {joinpat.join(chain(sorted(tutors)))}," + f"\n MOVE_UNAVAILABLE,\n" + ]) + cursor = match_e + 1 + new += old[cursor:] return new -def create_tutor_moves_array(tutors: list[str]) -> None: - """ - Generate gTutorMoves[] if P_TUTOR_MOVES_ARRAY is enabled. - """ - # Check if the config is enabled - with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: - cfg_pokemon = cfg_pokemon_fp.read() - cfg_defined = TUTOR_ARRAY_ENABLED_PAT.search(cfg_pokemon) - if not (cfg_defined and cfg_defined.group("cfg_val") in ("TRUE", "1")): - return - - # If enabled, generate the tutor moves array - header = dedent("""\ - // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py - // Set the config P_TUTOR_MOVES_ARRAY in include/config/pokemon.h to TRUE to enable this array! - - const u16 gTutorMoves[] = { - """) - - lines = [f" {move}," for move in sorted(tutors)] - lines.append(" MOVE_UNAVAILABLE\n};\n") - - with open("./src/data/tutor_moves.h", "w") as f: - f.write(header + "\n".join(lines)) - - def prepare_header(h_align: int, tmshms: list[str], tutors: list[str], universals: list[str]) -> str: - universals_title = "Near-universal moves found from sUniversalMoves:" + universals_title = "Near-universal moves found in data/special_movesets.json:" tmhm_title = "TM/HM moves found in \"include/constants/tms_hms.h\":" tutor_title = "Tutor moves found from map scripts:" h_align = max(h_align, len(universals_title), len(tmhm_title), len(tutor_title)) @@ -204,30 +196,38 @@ def main(): quit(1) SOURCE_LEARNSETS_JSON = pathlib.Path(sys.argv[1]) + SOURCE_TUTORS_JSON = pathlib.Path(sys.argv[2]) assert SOURCE_LEARNSETS_JSON.exists(), f"{SOURCE_LEARNSETS_JSON=} does not exist" assert SOURCE_LEARNSETS_JSON.is_file(), f"{SOURCE_LEARNSETS_JSON=} is not a file" - repo_universals = extract_repo_universals() + assert SOURCE_TUTORS_JSON.exists(), f"{SOURCE_TUTORS_JSON=} does not exist" + assert SOURCE_TUTORS_JSON.is_file(), f"{SOURCE_TUTORS_JSON=} is not a file" + repo_tms = list(extract_repo_tms()) - repo_tutors = list(extract_repo_tutors()) - repo_teachables = set(filter( - lambda move: move not in set(repo_universals), - chain(repo_tms, repo_tutors) - )) + order_alphabetically = False - create_tutor_moves_array(repo_tutors) + with open("./include/config/pokedex_plus_hgss.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = ALPHABETICAL_ORDER_ENABLED_PAT.search(cfg_pokemon) + if cfg_defined is None or cfg_defined.group("cfg_val") in ("FALSE", "0"): + repo_tms = sorted(repo_tms) - h_align = max(map(lambda move: len(move), chain(repo_universals, repo_teachables))) + 2 - header = prepare_header(h_align, repo_tms, repo_tutors, repo_universals) + with open(SOURCE_TUTORS_JSON, "r") as fp: + repo_tutors = json.load(fp) + + with open("src/data/pokemon/special_movesets.json", "r") as file: + special_movesets = json.load(file) + + h_align = max(map(lambda move: len(move), chain(special_movesets["universalMoves"], repo_tms, repo_tutors))) + 2 + header = prepare_header(h_align, repo_tms, repo_tutors, special_movesets["universalMoves"]) with open(SOURCE_LEARNSETS_JSON, "r") as source_fp: all_learnables = json.load(source_fp) - content = prepare_output(all_learnables, repo_teachables, header) + content = prepare_output(all_learnables, repo_tms, repo_tutors, special_movesets, header) with open("./src/data/pokemon/teachable_learnsets.h", "w") as teachables_fp: teachables_fp.write(content) - if __name__ == "__main__": main() diff --git a/tools/learnset_helpers/make_tutors.py b/tools/learnset_helpers/make_tutors.py new file mode 100644 index 0000000000..2ef3790dd8 --- /dev/null +++ b/tools/learnset_helpers/make_tutors.py @@ -0,0 +1,68 @@ +from itertools import chain + +import glob +import json +import pathlib +import re +import sys +import typing + +CONFIG_ENABLED_PAT = re.compile(r"#define P_LEARNSET_HELPER_TEACHABLE\s+(?P[^ ]*)") +INCFILE_HAS_TUTOR_PAT = re.compile(r"special ChooseMonForMoveTutor") +INCFILE_MOVE_PAT = re.compile(r"setvar VAR_0x8005, (MOVE_.*)") + +def enabled() -> bool: + """ + Check if the user has explicitly enabled this opt-in helper. + """ + with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = CONFIG_ENABLED_PAT.search(cfg_pokemon) + return cfg_defined is not None and cfg_defined.group("cfg_val") in ("TRUE", "1") + +def extract_repo_tutors() -> typing.Generator[str, None, None]: + """ + Yield MOVE constants which are *likely* assigned to a move tutor. This isn't + foolproof, but it's suitable. + """ + for inc_fname in chain(glob.glob("./data/scripts/*.inc"), glob.glob("./data/maps/*/scripts.inc")): + with open(inc_fname, "r") as inc_fp: + incfile = inc_fp.read() + if not INCFILE_HAS_TUTOR_PAT.search(incfile): + continue + + for move in INCFILE_MOVE_PAT.finditer(incfile): + yield move.group(1) + + +def dump_output(file, data): + with open(file, "w") as fp: + fp.write(data) + +def main(): + if not enabled(): + quit() + + if len(sys.argv) < 2: + print("Missing required arguments", file=sys.stderr) + print(__doc__, file=sys.stderr) + quit(1) + + OUTPUT_FILE = pathlib.Path(sys.argv[1]) + + assert OUTPUT_FILE.parent.exists(), f"parent of {OUTPUT_FILE=} does not exist" + + new_tutors = json.dumps(sorted(list(extract_repo_tutors())), indent=2) + if OUTPUT_FILE.exists() and OUTPUT_FILE.is_file(): + with open(OUTPUT_FILE, "r") as fp: + old_tutors = fp.read() + else: + dump_output(OUTPUT_FILE, new_tutors) + return + + if new_tutors != old_tutors: + dump_output(OUTPUT_FILE, new_tutors) + + +if __name__ == "__main__": + main() From c052f49dab658f1ce87257c2f25a44ee49cc9e7a Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Tue, 21 Oct 2025 16:08:44 +0200 Subject: [PATCH 086/183] Fix unhandled config in hgss dex (#7999) --- src/pokedex_plus_hgss.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 5fcd7d3ef0..26484e0231 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -5106,7 +5106,14 @@ static bool8 CalculateMoves(void) static u16 GetSelectedMove(u32 species, u32 selected) { if (selected < sPokedexView->numEggMoves) - return GetSpeciesEggMoves(species)[selected]; + { + if (!HGSS_SHOW_EGG_MOVES_FOR_EVOS) + return GetSpeciesEggMoves(species)[selected]; + u16 preSpecies = species; + while (GetSpeciesPreEvolution(preSpecies) != SPECIES_NONE) + preSpecies = GetSpeciesPreEvolution(preSpecies); + return GetSpeciesEggMoves(preSpecies)[selected]; + } selected -= sPokedexView->numEggMoves; if (selected < sPokedexView->numLevelUpMoves) return GetSpeciesLevelUpLearnset(species)[selected].move; From b5b12051bff39d9c9c4fab65c6b716634a1d239a Mon Sep 17 00:00:00 2001 From: Estellar <137097857+estellarc@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:33:06 -0300 Subject: [PATCH 087/183] Display TM/HM's move name in the debug menu (#7994) --- src/debug.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/debug.c b/src/debug.c index a093bedcf9..2d3f1b2248 100644 --- a/src/debug.c +++ b/src/debug.c @@ -29,6 +29,7 @@ #include "international_string_util.h" #include "item.h" #include "item_icon.h" +#include "item_use.h" #include "list_menu.h" #include "m4a.h" #include "main.h" @@ -2076,6 +2077,17 @@ static void Debug_Display_ItemInfo(u32 itemId, u32 digit, u8 windowId) { StringCopy(gStringVar2, gText_DigitIndicator[digit]); u8* end = CopyItemName(itemId, gStringVar1); + u16 moveId = ItemIdToBattleMoveId(itemId); + if (moveId != MOVE_NONE) + { + end = StringCopy(end, gText_Space); + end = StringCopy(end, GetMoveName(moveId)); + } + else if (CheckIfItemIsTMHMOrEvolutionStone(itemId) == 1) + { + end = StringCopy(end, COMPOUND_STRING(" None")); + } + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); ConvertIntToDecimalStringN(gStringVar3, itemId, STR_CONV_MODE_LEADING_ZEROS, DEBUG_NUMBER_DIGITS_ITEMS); From f53861ae057f45f1f5ebe36ca626474d4413301d Mon Sep 17 00:00:00 2001 From: Nopinou <140268269+Nopinou@users.noreply.github.com> Date: Wed, 22 Oct 2025 23:25:18 +0200 Subject: [PATCH 088/183] Remove appearedInBattle bitfield & redundant use of sentOut partyState (#8011) --- include/battle.h | 1 - src/battle_controller_opponent.c | 2 -- src/battle_controller_player_partner.c | 2 -- src/battle_main.c | 8 +------- src/battle_script_commands.c | 3 --- 5 files changed, 1 insertion(+), 15 deletions(-) diff --git a/include/battle.h b/include/battle.h index 1ec919c229..758ed7a453 100644 --- a/include/battle.h +++ b/include/battle.h @@ -733,7 +733,6 @@ struct BattleStruct u8 throwingPokeBall:1; u8 ballSpriteIds[2]; // item gfx, window gfx u8 moveInfoSpriteId; // move info, window gfx - u8 appearedInBattle; // Bitfield to track which Pokemon appeared in battle. Used for Burmy's form change u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle. // When using a move which hits multiple opponents which is then bounced by a target, we need to make sure, the move hits both opponents, the one with bounce, and the one without. u16 beatUpSpecies[PARTY_SIZE]; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 0588d9208b..51322c0315 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -571,14 +571,12 @@ static void OpponentHandleChoosePokemon(u32 battler) } } gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; - GetBattlerPartyState(battler)->sentOut = TRUE; } else { chosenMonId = gBattleStruct->AI_monToSwitchIntoId[battler]; gBattleStruct->AI_monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; - GetBattlerPartyState(battler)->sentOut = TRUE; } #if TESTING TestRunner_Battle_CheckSwitch(battler, chosenMonId); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 58911f1518..2872a83c31 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -302,14 +302,12 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) } } gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; - GetBattlerPartyState(battler)->sentOut = TRUE; } else // Mon to switch out has been already chosen. { chosenMonId = gBattleStruct->monToSwitchIntoId[battler]; gBattleStruct->AI_monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; - GetBattlerPartyState(battler)->sentOut = TRUE; } BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL); BtlController_Complete(battler); diff --git a/src/battle_main.c b/src/battle_main.c index cbe58051cb..4591b7575f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3101,7 +3101,6 @@ static void BattleStartClearSetData(void) { gSideTimers[i].stickyWebBattlerId = 0xFF; } - gBattleStruct->appearedInBattle = 0; gBattleStruct->beatUpSlot = 0; for (i = 0; i < PARTY_SIZE; i++) @@ -3951,12 +3950,7 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleCommunication[i] = 0; for (i = 0; i < gBattlersCount; i++) - { gBattleMons[i].volatiles.flinched = FALSE; - // Record party slots of player's mons that appeared in battle - if (!BattlerHasAi(i)) - gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[i]; - } gBattleStruct->eventBlockCounter = 0; gBattleStruct->turnEffectsBattlerId = 0; @@ -5657,7 +5651,7 @@ static void HandleEndTurn_FinishBattle(void) bool8 changedForm = FALSE; // Appeared in battle and didn't faint - if ((gBattleStruct->appearedInBattle & (1u << i)) && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0) + if (gBattleStruct->partyState[B_SIDE_PLAYER][i].sentOut && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0) changedForm = TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_ENVIRONMENT); if (!changedForm) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 33ca053ad7..8180bb9fbf 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7691,9 +7691,6 @@ static void UpdateSentMonFlags(u32 battler) gHitMarker &= ~HITMARKER_FAINTED(battler); gSpecialStatuses[battler].faintedHasReplacement = FALSE; - - if (!BattlerHasAi(battler)) - gBattleStruct->appearedInBattle |= 1u << gBattlerPartyIndexes[battler]; } static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) From 46b122c5ce41991e39da2105008a13d548270889 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Thu, 23 Oct 2025 13:52:25 +0200 Subject: [PATCH 089/183] Revert HGSS dex and movelist changes (#8016) --- Makefile | 10 +- include/config/pokemon.h | 1 + include/constants/teaching_types.h | 34 - include/pokedex_plus_hgss.h | 2 - include/pokemon.h | 5 +- src/data/pokemon/special_movesets.json | 33 - src/data/pokemon/species_info.h | 1 - .../pokemon/species_info/gen_1_families.h | 13 +- .../pokemon/species_info/gen_2_families.h | 8 +- .../pokemon/species_info/gen_3_families.h | 8 +- .../pokemon/species_info/gen_4_families.h | 10 +- .../pokemon/species_info/gen_5_families.h | 2 +- .../pokemon/species_info/gen_6_families.h | 4 +- .../pokemon/species_info/gen_7_families.h | 5 +- .../pokemon/species_info/gen_8_families.h | 4 +- src/data/pokemon/teachable_learnsets.h | 27411 ++++++---------- src/pokedex_plus_hgss.c | 230 +- src/pokemon.c | 87 +- tools/learnset_helpers/make_teachables.py | 150 +- tools/learnset_helpers/make_tutors.py | 68 - 20 files changed, 10758 insertions(+), 17328 deletions(-) delete mode 100644 include/constants/teaching_types.h delete mode 100644 src/data/pokemon/special_movesets.json delete mode 100644 tools/learnset_helpers/make_tutors.py diff --git a/Makefile b/Makefile index 3f916dabec..440202e61e 100644 --- a/Makefile +++ b/Makefile @@ -212,7 +212,6 @@ LEARNSET_HELPERS_DIR := $(TOOLS_DIR)/learnset_helpers LEARNSET_HELPERS_DATA_DIR := $(LEARNSET_HELPERS_DIR)/porymoves_files LEARNSET_HELPERS_BUILD_DIR := $(LEARNSET_HELPERS_DIR)/build ALL_LEARNABLES_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_learnables.json -ALL_TUTORS_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_tutors.json # wild_encounters.h is generated by a Python script WILD_ENCOUNTERS_TOOL_DIR := $(TOOLS_DIR)/wild_encounters @@ -412,8 +411,6 @@ clean-generated: @echo "rm -f " @rm -f $(ALL_LEARNABLES_JSON) @echo "rm -f " - @rm -f $(ALL_TUTORS_JSON) - @echo "rm -f " $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast $(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member @@ -503,7 +500,7 @@ $(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt) $(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt $(RAMSCRGEN) ewram_data $< ENGLISH > $@ -TEACHABLE_DEPS := $(ALL_LEARNABLES_JSON) $(ALL_TUTORS_JSON) $(INCLUDE_DIRS)/constants/tms_hms.h $(INCLUDE_DIRS)/config/pokemon.h $(INCLUDE_DIRS)/config/pokedex_plus_hgss.h $(LEARNSET_HELPERS_DIR)/make_teachables.py +TEACHABLE_DEPS := $(ALL_LEARNABLES_JSON) $(shell find data/ -type f -name '*.inc') $(INCLUDE_DIRS)/constants/tms_hms.h $(INCLUDE_DIRS)/config/pokemon.h $(C_SUBDIR)/pokemon.c $(LEARNSET_HELPERS_BUILD_DIR): @mkdir -p $@ @@ -511,11 +508,8 @@ $(LEARNSET_HELPERS_BUILD_DIR): $(ALL_LEARNABLES_JSON): $(wildcard $(LEARNSET_HELPERS_DATA_DIR)/*.json) | $(LEARNSET_HELPERS_BUILD_DIR) python3 $(LEARNSET_HELPERS_DIR)/make_learnables.py $(LEARNSET_HELPERS_DATA_DIR) $@ -$(ALL_TUTORS_JSON): $(shell find data/ -type f -name '*.inc') $(LEARNSET_HELPERS_DIR)/make_tutors.py - python3 $(LEARNSET_HELPERS_DIR)/make_tutors.py $@ - $(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(TEACHABLE_DEPS) - python3 $(LEARNSET_HELPERS_DIR)/make_teachables.py $< $(ALL_TUTORS_JSON) + python3 $(LEARNSET_HELPERS_DIR)/make_teachables.py $< # Linker script LD_SCRIPT := ld_script_modern.ld diff --git a/include/config/pokemon.h b/include/config/pokemon.h index d2af42ea08..fdee4e8ad2 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -64,6 +64,7 @@ // Learnset helper toggles #define P_LEARNSET_HELPER_TEACHABLE TRUE // If TRUE, teachable_learnsets.h will be populated by tools/learnset_helpers/make_teachables.py using the included JSON files based on available TMs and tutors. +#define P_TUTOR_MOVES_ARRAY FALSE // If TRUE, generates a gTutorMoves array automatically using make_teachables.py. (generally not needed, but the HGSS Pokedex has an optional use for it) // Flag settings // To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. diff --git a/include/constants/teaching_types.h b/include/constants/teaching_types.h deleted file mode 100644 index 63fd9daa95..0000000000 --- a/include/constants/teaching_types.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef GUARD_CONSTANTS_TEACHING_TYPES_H -#define GUARD_CONSTANTS_TEACHING_TYPES_H - -/* -Teaching Types are not used directly by the ROM but they are used by -make_teachables.py to generate teachable learnsets. To save ROM space, the info is -stored in 1 bit and the python script reads the name of the define. -This means we can have multiple "modes" that define to 1. -You can add additional teaching types but they would need to be described in the -python script. -*/ - - -/* DEFAULT_LEARNING -Vanilla uses: most pokemon -Allow a pokemon to learn all universal moves -*/ -#define DEFAULT_LEARNING 0 - -/* TM_ILLITERATE -Vanilla uses: pokemon with "gimmick" moveset (Ditto, Smeargle, Magikarp, ...) -Pokemon can't learn any universal moves (unless it was added to their teachable learnset) -*/ -#define TM_ILLITERATE 1 - -/* ALL_TEACHABLES -Vanilla uses: Mew -Allows a pokemon to learn almost every teachable move (whether from TM or tutors) -Some moves are excluded, they are listed in SignatureTeachables -*/ -#define ALL_TEACHABLES 1 - - -#endif // GUARD_CONSTANTS_TEACHING_TYPES_H diff --git a/include/pokedex_plus_hgss.h b/include/pokedex_plus_hgss.h index 9486eea8c7..a309924236 100644 --- a/include/pokedex_plus_hgss.h +++ b/include/pokedex_plus_hgss.h @@ -1,8 +1,6 @@ #ifndef GUARD_POKEDEX_PLUS_HGSS_H #define GUARD_POKEDEX_PLUS_HGSS_H -extern const u16 gTutorMoves[]; - void CB2_OpenPokedexPlusHGSS(void); void Task_DisplayCaughtMonDexPageHGSS(u8); diff --git a/include/pokemon.h b/include/pokemon.h index fd6855bf82..08313fb95b 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -505,7 +505,7 @@ struct SpeciesInfo /*0xC4*/ u32 cannotBeTraded:1; u32 perfectIVCount:3; // This species will always generate with the specified amount of perfect IVs. u32 dexForceRequired:1; // This species will be taken into account for Pokédex ratings even if they have the "isMythical" flag set. - u32 teachingType:1; // Not used in the ROM but used in compilation (check constants/teaching_types.h for explanations) + u32 tmIlliterate:1; // This species will be unable to learn the universal moves. u32 isFrontierBanned:1; // This species is not allowed to participate in Battle Frontier facilities. u32 padding4:11; // Shadow settings @@ -700,8 +700,9 @@ extern const struct SpriteTemplate gBattlerSpriteTemplates[]; extern const u32 sExpCandyExperienceTable[]; extern const struct AbilityInfo gAbilitiesInfo[]; extern const struct NatureInfo gNaturesInfo[]; - +#if P_TUTOR_MOVES_ARRAY extern const u16 gTutorMoves[]; +#endif // P_TUTOR_MOVES_ARRAY void ZeroBoxMonData(struct BoxPokemon *boxMon); void ZeroMonData(struct Pokemon *mon); diff --git a/src/data/pokemon/special_movesets.json b/src/data/pokemon/special_movesets.json deleted file mode 100644 index 82302b152a..0000000000 --- a/src/data/pokemon/special_movesets.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "universalMoves": - [ - "MOVE_BIDE", - "MOVE_FRUSTRATION", - "MOVE_HIDDEN_POWER", - "MOVE_MIMIC", - "MOVE_NATURAL_GIFT", - "MOVE_RAGE", - "MOVE_RETURN", - "MOVE_SECRET_POWER", - "MOVE_SUBSTITUTE", - "MOVE_TERA_BLAST" - ], - "signatureTeachables": - [ - "MOVE_BADDY_BAD", - "MOVE_BOUNCY_BUBBLE", - "MOVE_BUZZY_BUZZ", - "MOVE_DRAGON_ASCENT", - "MOVE_FLOATY_FALL", - "MOVE_FREEZY_FROST", - "MOVE_GLITZY_GLOW", - "MOVE_RELIC_SONG", - "MOVE_SAPPY_SEED", - "MOVE_SECRET_SWORD", - "MOVE_SIZZLY_SLIDE", - "MOVE_SPARKLY_SWIRL", - "MOVE_SPLISHY_SPLASH", - "MOVE_VOLT_TACKLE", - "MOVE_ZIPPY_ZAP" - ] -} diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 4cf63f9bac..0cd1d5b1ac 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -1,5 +1,4 @@ #include "constants/abilities.h" -#include "constants/teaching_types.h" #include "species_info/shared_dex_text.h" #include "species_info/shared_front_pic_anims.h" diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 929db7dae7..a661147349 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -1188,7 +1188,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Caterpie, gShinyOverworldPalette_Caterpie ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sCaterpieLevelUpLearnset, .teachableLearnset = sCaterpieTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_METAPOD}), @@ -1256,7 +1256,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Metapod, gShinyOverworldPalette_Metapod ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sMetapodLevelUpLearnset, .teachableLearnset = sMetapodTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BUTTERFREE}), @@ -1499,7 +1499,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Weedle, gShinyOverworldPalette_Weedle ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sWeedleLevelUpLearnset, .teachableLearnset = sWeedleTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_KAKUNA}), @@ -1577,7 +1577,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Kakuna, gShinyOverworldPalette_Kakuna ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sKakunaLevelUpLearnset, .teachableLearnset = sKakunaTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BEEDRILL}), @@ -17203,7 +17203,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = TRACKS_SPOT, sAnimTable_Following ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sMagikarpLevelUpLearnset, .teachableLearnset = sMagikarpTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_GYARADOS}), @@ -17565,7 +17565,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Ditto, gShinyOverworldPalette_Ditto ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sDittoLevelUpLearnset, .teachableLearnset = sDittoTeachableLearnset, }, @@ -20239,7 +20239,6 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .isMythical = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, - .teachingType = ALL_TEACHABLES, .levelUpLearnset = sMewLevelUpLearnset, .teachableLearnset = sMewTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 7d15ca7185..98e856aae5 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -3970,9 +3970,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Unown, \ gShinyOverworldPalette_Unown, \ ) \ - .teachingType = TM_ILLITERATE, \ .levelUpLearnset = sUnownLevelUpLearnset, \ .teachableLearnset = sUnownTeachableLearnset, \ + .tmIlliterate = TRUE, \ .formSpeciesIdTable = sUnownFormSpeciesIdTable, \ } @@ -4074,7 +4074,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Wynaut, gShinyOverworldPalette_Wynaut ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sWynautLevelUpLearnset, .teachableLearnset = sWynautTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 15, SPECIES_WOBBUFFET}), @@ -4163,7 +4163,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = TRACKS_FOOT, sAnimTable_Following ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sWobbuffetLevelUpLearnset, .teachableLearnset = sWobbuffetTeachableLearnset, }, @@ -7697,7 +7697,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Smeargle, gShinyOverworldPalette_Smeargle ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sSmeargleLevelUpLearnset, .teachableLearnset = sSmeargleTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 9b9ba688c5..6ad30646cf 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -1501,7 +1501,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Wurmple, gShinyOverworldPalette_Wurmple ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sWurmpleLevelUpLearnset, .teachableLearnset = sWurmpleTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_SILCOON, CONDITIONS({IF_PID_UPPER_MODULO_10_GT, 4})}, @@ -1571,7 +1571,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Silcoon, gShinyOverworldPalette_Silcoon ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sSilcoonLevelUpLearnset, .teachableLearnset = sSilcoonTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BEAUTIFLY}), @@ -1744,7 +1744,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Cascoon, gShinyOverworldPalette_Cascoon ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sCascoonLevelUpLearnset, .teachableLearnset = sCascoonTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_DUSTOX}), @@ -11668,7 +11668,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Beldum, gShinyOverworldPalette_Beldum ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sBeldumLevelUpLearnset, .teachableLearnset = sBeldumTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_METANG}), diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index f5a474137a..84edb98987 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -1183,7 +1183,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = TRACKS_FOOT, sAnimTable_Following ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sKricketotLevelUpLearnset, .teachableLearnset = sKricketotTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_KRICKETUNE}), @@ -1865,7 +1865,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmyPlant, gShinyOverworldPalette_BurmyPlant ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -1934,7 +1934,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmySandy, gShinyOverworldPalette_BurmySandy ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -2003,7 +2003,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmyTrash, gShinyOverworldPalette_BurmyTrash ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -2360,7 +2360,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = TRACKS_FOOT, sAnimTable_Following ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sCombeeLevelUpLearnset, .teachableLearnset = sCombeeTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 21, SPECIES_VESPIQUEN, CONDITIONS({IF_GENDER, MON_FEMALE})}), diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 4f61b3141e..1b5e484ab8 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -9394,7 +9394,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Tynamo, gShinyOverworldPalette_Tynamo ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sTynamoLevelUpLearnset, .teachableLearnset = sTynamoTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 39, SPECIES_EELEKTRIK}), diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 5e882ad353..03bfc713f2 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -1169,7 +1169,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Scatterbug, \ gShinyOverworldPalette_Scatterbug \ ) \ - .teachingType = TM_ILLITERATE, \ + .tmIlliterate = TRUE, \ .levelUpLearnset = sScatterbugLevelUpLearnset, \ .teachableLearnset = sScatterbugTeachableLearnset, \ .eggMoveLearnset = sScatterbugEggMoveLearnset, \ @@ -1253,7 +1253,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Spewpa, \ gShinyOverworldPalette_Spewpa \ ) \ - .teachingType = TM_ILLITERATE, \ + .tmIlliterate = TRUE, \ .levelUpLearnset = sSpewpaLevelUpLearnset, \ .teachableLearnset = sSpewpaTeachableLearnset, \ .formSpeciesIdTable = sSpewpaFormSpeciesIdTable, \ diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index 8feb551fa6..3877ee2705 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -4291,7 +4291,6 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Pyukumuku, gShinyOverworldPalette_Pyukumuku ) - .teachingType = TM_ILLITERATE, .levelUpLearnset = sPyukumukuLevelUpLearnset, .teachableLearnset = sPyukumukuTeachableLearnset, .eggMoveLearnset = sPyukumukuEggMoveLearnset, @@ -5901,7 +5900,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Cosmog ) .isLegendary = TRUE, - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmogLevelUpLearnset, @@ -5971,7 +5970,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_Cosmoem ) .isLegendary = TRUE, - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmoemLevelUpLearnset, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 08f22c19aa..6ba7fed676 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -1230,7 +1230,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Blipbug, gShinyOverworldPalette_Blipbug ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sBlipbugLevelUpLearnset, .teachableLearnset = sBlipbugTeachableLearnset, .eggMoveLearnset = sBlipbugEggMoveLearnset, @@ -2461,7 +2461,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Applin, gShinyOverworldPalette_Applin ) - .teachingType = TM_ILLITERATE, + .tmIlliterate = TRUE, .levelUpLearnset = sApplinLevelUpLearnset, .teachableLearnset = sApplinTeachableLearnset, .eggMoveLearnset = sApplinEggMoveLearnset, diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index 7c72a171ec..8b400f5675 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -2,111 +2,111 @@ // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py // -// ********************************************************* // -// TM/HM moves found in "include/constants/tms_hms.h": // -// - MOVE_AERIAL_ACE // -// - MOVE_ATTRACT // -// - MOVE_BLIZZARD // -// - MOVE_BRICK_BREAK // -// - MOVE_BULK_UP // -// - MOVE_BULLET_SEED // -// - MOVE_CALM_MIND // -// - MOVE_CUT // -// - MOVE_DIG // -// - MOVE_DIVE // -// - MOVE_DOUBLE_TEAM // -// - MOVE_DRAGON_CLAW // -// - MOVE_EARTHQUAKE // -// - MOVE_FACADE // -// - MOVE_FIRE_BLAST // -// - MOVE_FLAMETHROWER // -// - MOVE_FLASH // -// - MOVE_FLY // -// - MOVE_FOCUS_PUNCH // -// - MOVE_FRUSTRATION // -// - MOVE_GIGA_DRAIN // -// - MOVE_HAIL // -// - MOVE_HIDDEN_POWER // -// - MOVE_HYPER_BEAM // -// - MOVE_ICE_BEAM // -// - MOVE_IRON_TAIL // -// - MOVE_LIGHT_SCREEN // -// - MOVE_OVERHEAT // -// - MOVE_PROTECT // -// - MOVE_PSYCHIC // -// - MOVE_RAIN_DANCE // -// - MOVE_REFLECT // -// - MOVE_REST // -// - MOVE_RETURN // -// - MOVE_ROAR // -// - MOVE_ROCK_SMASH // -// - MOVE_ROCK_TOMB // -// - MOVE_SAFEGUARD // -// - MOVE_SANDSTORM // -// - MOVE_SECRET_POWER // -// - MOVE_SHADOW_BALL // -// - MOVE_SHOCK_WAVE // -// - MOVE_SKILL_SWAP // -// - MOVE_SLUDGE_BOMB // -// - MOVE_SNATCH // -// - MOVE_SOLAR_BEAM // -// - MOVE_STEEL_WING // -// - MOVE_STRENGTH // -// - MOVE_SUNNY_DAY // -// - MOVE_SURF // -// - MOVE_TAUNT // -// - MOVE_THIEF // -// - MOVE_THUNDER // -// - MOVE_THUNDERBOLT // -// - MOVE_TORMENT // -// - MOVE_TOXIC // -// - MOVE_WATERFALL // -// - MOVE_WATER_PULSE // -// ********************************************************* // -// Tutor moves found from map scripts: // -// - MOVE_BODY_SLAM // -// - MOVE_COUNTER // -// - MOVE_DEFENSE_CURL // -// - MOVE_DOUBLE_EDGE // -// - MOVE_DREAM_EATER // -// - MOVE_DYNAMIC_PUNCH // -// - MOVE_ENDURE // -// - MOVE_EXPLOSION // -// - MOVE_FIRE_PUNCH // -// - MOVE_FURY_CUTTER // -// - MOVE_ICE_PUNCH // -// - MOVE_ICY_WIND // -// - MOVE_MEGA_KICK // -// - MOVE_MEGA_PUNCH // -// - MOVE_METRONOME // -// - MOVE_MIMIC // -// - MOVE_MUD_SLAP // -// - MOVE_PSYCH_UP // -// - MOVE_ROCK_SLIDE // -// - MOVE_ROLLOUT // -// - MOVE_SEISMIC_TOSS // -// - MOVE_SLEEP_TALK // -// - MOVE_SNORE // -// - MOVE_SOFT_BOILED // -// - MOVE_SUBSTITUTE // -// - MOVE_SWAGGER // -// - MOVE_SWIFT // -// - MOVE_SWORDS_DANCE // -// - MOVE_THUNDER_PUNCH // -// - MOVE_THUNDER_WAVE // -// ********************************************************* // -// Near-universal moves found in data/special_movesets.json: // -// - MOVE_BIDE // -// - MOVE_FRUSTRATION // -// - MOVE_HIDDEN_POWER // -// - MOVE_MIMIC // -// - MOVE_NATURAL_GIFT // -// - MOVE_RAGE // -// - MOVE_RETURN // -// - MOVE_SECRET_POWER // -// - MOVE_SUBSTITUTE // -// - MOVE_TERA_BLAST // -// ********************************************************* // +// *************************************************** // +// TM/HM moves found in "include/constants/tms_hms.h": // +// - MOVE_FOCUS_PUNCH // +// - MOVE_DRAGON_CLAW // +// - MOVE_WATER_PULSE // +// - MOVE_CALM_MIND // +// - MOVE_ROAR // +// - MOVE_TOXIC // +// - MOVE_HAIL // +// - MOVE_BULK_UP // +// - MOVE_BULLET_SEED // +// - MOVE_HIDDEN_POWER // +// - MOVE_SUNNY_DAY // +// - MOVE_TAUNT // +// - MOVE_ICE_BEAM // +// - MOVE_BLIZZARD // +// - MOVE_HYPER_BEAM // +// - MOVE_LIGHT_SCREEN // +// - MOVE_PROTECT // +// - MOVE_RAIN_DANCE // +// - MOVE_GIGA_DRAIN // +// - MOVE_SAFEGUARD // +// - MOVE_FRUSTRATION // +// - MOVE_SOLAR_BEAM // +// - MOVE_IRON_TAIL // +// - MOVE_THUNDERBOLT // +// - MOVE_THUNDER // +// - MOVE_EARTHQUAKE // +// - MOVE_RETURN // +// - MOVE_DIG // +// - MOVE_PSYCHIC // +// - MOVE_SHADOW_BALL // +// - MOVE_BRICK_BREAK // +// - MOVE_DOUBLE_TEAM // +// - MOVE_REFLECT // +// - MOVE_SHOCK_WAVE // +// - MOVE_FLAMETHROWER // +// - MOVE_SLUDGE_BOMB // +// - MOVE_SANDSTORM // +// - MOVE_FIRE_BLAST // +// - MOVE_ROCK_TOMB // +// - MOVE_AERIAL_ACE // +// - MOVE_TORMENT // +// - MOVE_FACADE // +// - MOVE_SECRET_POWER // +// - MOVE_REST // +// - MOVE_ATTRACT // +// - MOVE_THIEF // +// - MOVE_STEEL_WING // +// - MOVE_SKILL_SWAP // +// - MOVE_SNATCH // +// - MOVE_OVERHEAT // +// - MOVE_CUT // +// - MOVE_FLY // +// - MOVE_SURF // +// - MOVE_STRENGTH // +// - MOVE_FLASH // +// - MOVE_ROCK_SMASH // +// - MOVE_WATERFALL // +// - MOVE_DIVE // +// *************************************************** // +// Tutor moves found from map scripts: // +// - MOVE_BODY_SLAM // +// - MOVE_COUNTER // +// - MOVE_DEFENSE_CURL // +// - MOVE_DOUBLE_EDGE // +// - MOVE_DREAM_EATER // +// - MOVE_DYNAMIC_PUNCH // +// - MOVE_ENDURE // +// - MOVE_EXPLOSION // +// - MOVE_FIRE_PUNCH // +// - MOVE_FURY_CUTTER // +// - MOVE_ICE_PUNCH // +// - MOVE_ICY_WIND // +// - MOVE_MEGA_KICK // +// - MOVE_MEGA_PUNCH // +// - MOVE_METRONOME // +// - MOVE_MIMIC // +// - MOVE_MUD_SLAP // +// - MOVE_PSYCH_UP // +// - MOVE_ROCK_SLIDE // +// - MOVE_ROLLOUT // +// - MOVE_SEISMIC_TOSS // +// - MOVE_SLEEP_TALK // +// - MOVE_SNORE // +// - MOVE_SOFT_BOILED // +// - MOVE_SUBSTITUTE // +// - MOVE_SWAGGER // +// - MOVE_SWIFT // +// - MOVE_SWORDS_DANCE // +// - MOVE_THUNDER_PUNCH // +// - MOVE_THUNDER_WAVE // +// *************************************************** // +// Near-universal moves found from sUniversalMoves: // +// - MOVE_BIDE // +// - MOVE_FRUSTRATION // +// - MOVE_HIDDEN_POWER // +// - MOVE_MIMIC // +// - MOVE_NATURAL_GIFT // +// - MOVE_RAGE // +// - MOVE_RETURN // +// - MOVE_SECRET_POWER // +// - MOVE_SUBSTITUTE // +// - MOVE_TERA_BLAST // +// *************************************************** // static const u16 sNoneTeachableLearnset[] = { MOVE_UNAVAILABLE, @@ -115,119 +115,101 @@ static const u16 sNoneTeachableLearnset[] = { #if P_FAMILY_BULBASAUR static const u16 sBulbasaurTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sIvysaurTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVenusaurTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BULBASAUR @@ -236,159 +218,141 @@ static const u16 sVenusaurTeachableLearnset[] = { static const u16 sCharmanderTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCharmeleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCharizardTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHARMANDER @@ -397,150 +361,132 @@ static const u16 sCharizardTeachableLearnset[] = { static const u16 sSquirtleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sWartortleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sBlastoiseTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SQUIRTLE @@ -558,37 +504,31 @@ static const u16 sMetapodTeachableLearnset[] = { static const u16 sButterfreeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CATERPIE @@ -607,34 +547,28 @@ static const u16 sBeedrillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WEEDLE @@ -643,91 +577,73 @@ static const u16 sBeedrillTeachableLearnset[] = { static const u16 sPidgeyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPidgeottoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPidgeotTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIDGEY @@ -736,90 +652,78 @@ static const u16 sPidgeotTeachableLearnset[] = { static const u16 sRattataTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sRaticateTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -827,35 +731,29 @@ static const u16 sRaticateTeachableLearnset[] = { static const u16 sRattataAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -863,38 +761,32 @@ static const u16 sRaticateAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -904,59 +796,47 @@ static const u16 sRaticateAlolaTeachableLearnset[] = { static const u16 sSpearowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFearowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPEAROW @@ -964,74 +844,62 @@ static const u16 sFearowTeachableLearnset[] = { #if P_FAMILY_EKANS static const u16 sEkansTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sArbokTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_EKANS @@ -1040,189 +908,165 @@ static const u16 sArbokTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sPichuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLASH, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sPikachuTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sRaichuTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sRaichuAlolaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -1232,93 +1076,81 @@ static const u16 sRaichuAlolaTeachableLearnset[] = { static const u16 sSandshrewTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSandslashTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1327,44 +1159,38 @@ static const u16 sSandshrewAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1372,45 +1198,39 @@ static const u16 sSandslashAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -1421,41 +1241,35 @@ static const u16 sNidoranFTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -1463,41 +1277,35 @@ static const u16 sNidorinaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -1505,210 +1313,186 @@ static const u16 sNidoqueenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sNidoranMTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sNidorinoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sNidokingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NIDORAN @@ -1717,53 +1501,47 @@ static const u16 sNidokingTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sCleffaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -1771,135 +1549,123 @@ static const u16 sCleffaTeachableLearnset[] = { static const u16 sClefairyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sClefableTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLEFAIRY @@ -1907,72 +1673,60 @@ static const u16 sClefableTeachableLearnset[] = { #if P_FAMILY_VULPIX static const u16 sVulpixTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sNinetalesTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1980,72 +1734,60 @@ static const u16 sNinetalesTeachableLearnset[] = { static const u16 sVulpixAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sNinetalesAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -2055,49 +1797,43 @@ static const u16 sNinetalesAlolaTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sIgglybuffTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -2105,133 +1841,121 @@ static const u16 sIgglybuffTeachableLearnset[] = { static const u16 sJigglypuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sWigglytuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JIGGLYPUFF @@ -2240,69 +1964,57 @@ static const u16 sWigglytuffTeachableLearnset[] = { static const u16 sZubatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sGolbatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -2310,35 +2022,29 @@ static const u16 sGolbatTeachableLearnset[] = { static const u16 sCrobatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -2349,29 +2055,23 @@ static const u16 sOddishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -2379,62 +2079,50 @@ static const u16 sGloomTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVileplumeTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -2443,30 +2131,24 @@ static const u16 sBellossomTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -2476,79 +2158,67 @@ static const u16 sBellossomTeachableLearnset[] = { static const u16 sParasTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sParasectTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PARAS @@ -2556,66 +2226,54 @@ static const u16 sParasectTeachableLearnset[] = { #if P_FAMILY_VENONAT static const u16 sVenonatTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVenomothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VENONAT @@ -2624,71 +2282,59 @@ static const u16 sVenomothTeachableLearnset[] = { static const u16 sDiglettTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sDugtrioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -2696,66 +2342,54 @@ static const u16 sDugtrioTeachableLearnset[] = { static const u16 sDiglettAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sDugtrioAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -2765,92 +2399,80 @@ static const u16 sDugtrioAlolaTeachableLearnset[] = { static const u16 sMeowthTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sPersianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -2858,84 +2480,72 @@ static const u16 sPersianTeachableLearnset[] = { static const u16 sMeowthAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sPersianAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -2944,67 +2554,55 @@ static const u16 sPersianAlolaTeachableLearnset[] = { static const u16 sMeowthGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sPerrserkerTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -3015,54 +2613,48 @@ static const u16 sPsyduckTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -3070,56 +2662,50 @@ static const u16 sGolduckTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PSYDUCK @@ -3128,148 +2714,130 @@ static const u16 sGolduckTeachableLearnset[] = { static const u16 sMankeyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPrimeapeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sAnnihilapeTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -3280,140 +2848,116 @@ static const u16 sAnnihilapeTeachableLearnset[] = { static const u16 sGrowlitheTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sArcanineTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sGrowlitheHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sArcanineHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -3423,142 +2967,124 @@ static const u16 sArcanineHisuiTeachableLearnset[] = { static const u16 sPoliwagTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPoliwhirlTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, + MOVE_DIVE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sPoliwrathTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, + MOVE_DIVE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -3566,51 +3092,45 @@ static const u16 sPoliwrathTeachableLearnset[] = { static const u16 sPolitoedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, + MOVE_DIVE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -3619,160 +3139,142 @@ static const u16 sPolitoedTeachableLearnset[] = { #if P_FAMILY_ABRA static const u16 sAbraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sKadabraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sAlakazamTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ABRA @@ -3780,143 +3282,125 @@ static const u16 sAlakazamTeachableLearnset[] = { #if P_FAMILY_MACHOP static const u16 sMachopTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMachokeTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMachampTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MACHOP @@ -3926,97 +3410,79 @@ static const u16 sBellsproutTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sWeepinbellTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVictreebelTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BELLSPROUT @@ -4027,36 +3493,30 @@ static const u16 sTentacoolTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -4065,37 +3525,31 @@ static const u16 sTentacruelTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TENTACOOL @@ -4103,280 +3557,244 @@ static const u16 sTentacruelTeachableLearnset[] = { #if P_FAMILY_GEODUDE static const u16 sGeodudeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGravelerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGolemTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, MOVE_FURY_CUTTER, + MOVE_HYPER_BEAM, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sGeodudeAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, - MOVE_MIMIC, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGravelerAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGolemAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -4385,116 +3803,92 @@ static const u16 sGolemAlolaTeachableLearnset[] = { #if P_FAMILY_PONYTA static const u16 sPonytaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sRapidashTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sPonytaGalarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sRapidashGalarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, @@ -4506,51 +3900,45 @@ static const u16 sRapidashGalarTeachableLearnset[] = { static const u16 sSlowpokeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -4558,63 +3946,57 @@ static const u16 sSlowbroTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROCK_SMASH, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -4622,67 +4004,61 @@ static const u16 sSlowbroTeachableLearnset[] = { static const u16 sSlowkingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -4691,94 +4067,82 @@ static const u16 sSlowkingTeachableLearnset[] = { static const u16 sSlowpokeGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sSlowbroGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -4786,54 +4150,48 @@ static const u16 sSlowbroGalarTeachableLearnset[] = { static const u16 sSlowkingGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -4842,108 +4200,90 @@ static const u16 sSlowkingGalarTeachableLearnset[] = { #if P_FAMILY_MAGNEMITE static const u16 sMagnemiteTeachableLearnset[] = { + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_ROLLOUT, + MOVE_SANDSTORM, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMagnetonTeachableLearnset[] = { + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_ROLLOUT, + MOVE_SANDSTORM, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sMagnezoneTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_ROLLOUT, + MOVE_SANDSTORM, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -4953,87 +4293,69 @@ static const u16 sMagnezoneTeachableLearnset[] = { static const u16 sFarfetchdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sFarfetchdGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FURY_CUTTER, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sSirfetchdTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FURY_CUTTER, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -5044,67 +4366,55 @@ static const u16 sSirfetchdTeachableLearnset[] = { static const u16 sDoduoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sDodrioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DODUO @@ -5113,71 +4423,59 @@ static const u16 sDodrioTeachableLearnset[] = { static const u16 sSeelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sDewgongTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEEL @@ -5185,194 +4483,170 @@ static const u16 sDewgongTeachableLearnset[] = { #if P_FAMILY_GRIMER static const u16 sGrimerTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sMukTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sGrimerAlolaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sMukAlolaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -5383,69 +4657,57 @@ static const u16 sShellderTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sCloysterTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHELLDER @@ -5454,135 +4716,117 @@ static const u16 sCloysterTeachableLearnset[] = { static const u16 sGastlyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FIRE_PUNCH, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sHaunterTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FIRE_PUNCH, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sGengarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GASTLY @@ -5590,82 +4834,70 @@ static const u16 sGengarTeachableLearnset[] = { #if P_FAMILY_ONIX static const u16 sOnixTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_GEN_2_CROSS_EVOS static const u16 sSteelixTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -5674,104 +4906,92 @@ static const u16 sSteelixTeachableLearnset[] = { #if P_FAMILY_DROWZEE static const u16 sDrowzeeTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHypnoTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DROWZEE @@ -5780,213 +5000,177 @@ static const u16 sHypnoTeachableLearnset[] = { static const u16 sKrabbyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sKinglerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KRABBY #if P_FAMILY_VOLTORB static const u16 sVoltorbTeachableLearnset[] = { + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sElectrodeTeachableLearnset[] = { + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sVoltorbHisuiTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sElectrodeHisuiTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -5997,123 +5181,105 @@ static const u16 sElectrodeHisuiTeachableLearnset[] = { static const u16 sExeggcuteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SKILL_SWAP, - MOVE_SLUDGE_BOMB, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_REFLECT, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sExeggutorTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_ALOLAN_FORMS static const u16 sExeggutorAlolaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -6124,50 +5290,44 @@ static const u16 sCuboneTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6175,51 +5335,45 @@ static const u16 sMarowakTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6228,51 +5382,45 @@ static const u16 sMarowakAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_ALOLAN_FORMS @@ -6282,128 +5430,110 @@ static const u16 sMarowakAlolaTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sTyrogueTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sHitmonleeTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHitmonchanTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6411,41 +5541,35 @@ static const u16 sHitmonchanTeachableLearnset[] = { static const u16 sHitmontopTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -6455,63 +5579,57 @@ static const u16 sHitmontopTeachableLearnset[] = { static const u16 sLickitungTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -6519,61 +5637,55 @@ static const u16 sLickitungTeachableLearnset[] = { static const u16 sLickilickyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -6582,108 +5694,90 @@ static const u16 sLickilickyTeachableLearnset[] = { #if P_FAMILY_KOFFING static const u16 sKoffingTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sWeezingTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sWeezingGalarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -6693,105 +5787,93 @@ static const u16 sWeezingGalarTeachableLearnset[] = { static const u16 sRhyhornTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sRhydonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6799,57 +5881,51 @@ static const u16 sRhydonTeachableLearnset[] = { static const u16 sRhyperiorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -6860,46 +5936,40 @@ static const u16 sRhyperiorTeachableLearnset[] = { static const u16 sHappinyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -6907,72 +5977,66 @@ static const u16 sHappinyTeachableLearnset[] = { static const u16 sChanseyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -6980,71 +6044,65 @@ static const u16 sChanseyTeachableLearnset[] = { static const u16 sBlisseyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -7053,37 +6111,31 @@ static const u16 sBlisseyTeachableLearnset[] = { #if P_FAMILY_TANGELA static const u16 sTangelaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7091,42 +6143,36 @@ static const u16 sTangelaTeachableLearnset[] = { static const u16 sTangrowthTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -7137,62 +6183,56 @@ static const u16 sKangaskhanTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KANGASKHAN @@ -7202,30 +6242,24 @@ static const u16 sHorseaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -7233,31 +6267,25 @@ static const u16 sSeadraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -7265,33 +6293,27 @@ static const u16 sSeadraTeachableLearnset[] = { static const u16 sKingdraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -7301,71 +6323,59 @@ static const u16 sKingdraTeachableLearnset[] = { static const u16 sGoldeenTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sSeakingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOLDEEN @@ -7375,39 +6385,33 @@ static const u16 sStaryuTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -7415,42 +6419,36 @@ static const u16 sStarmieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STARYU @@ -7462,43 +6460,37 @@ static const u16 sMimeJrTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -7506,58 +6498,52 @@ static const u16 sMimeJrTeachableLearnset[] = { static const u16 sMrMimeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7565,42 +6551,36 @@ static const u16 sMrMimeTeachableLearnset[] = { static const u16 sMrMimeGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -7608,42 +6588,36 @@ static const u16 sMrMimeGalarTeachableLearnset[] = { static const u16 sMrRimeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -7656,35 +6630,29 @@ static const u16 sScytherTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7694,37 +6662,31 @@ static const u16 sScizorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -7734,32 +6696,26 @@ static const u16 sKleavorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_GEN_8_CROSS_EVOS @@ -7770,46 +6726,40 @@ static const u16 sKleavorTeachableLearnset[] = { static const u16 sSmoochumTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLASH, + MOVE_HAIL, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -7817,51 +6767,45 @@ static const u16 sSmoochumTeachableLearnset[] = { static const u16 sJynxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JYNX @@ -7870,154 +6814,136 @@ static const u16 sJynxTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sElekidTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sElectabuzzTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sElectivireTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -8027,137 +6953,119 @@ static const u16 sElectivireTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sMagbyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS static const u16 sMagmarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sMagmortarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -8166,40 +7074,34 @@ static const u16 sMagmortarTeachableLearnset[] = { #if P_FAMILY_PINSIR static const u16 sPinsirTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PINSIR @@ -8208,136 +7110,112 @@ static const u16 sPinsirTeachableLearnset[] = { static const u16 sTaurosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_PALDEAN_FORMS static const u16 sTaurosPaldeaCombatTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sTaurosPaldeaBlazeTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sTaurosPaldeaAquaTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_PALDEAN_FORMS @@ -8351,47 +7229,41 @@ static const u16 sMagikarpTeachableLearnset[] = { static const u16 sGyaradosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAGIKARP @@ -8400,45 +7272,39 @@ static const u16 sGyaradosTeachableLearnset[] = { static const u16 sLaprasTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LAPRAS @@ -8452,244 +7318,208 @@ static const u16 sDittoTeachableLearnset[] = { #if P_FAMILY_EEVEE static const u16 sEeveeTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVaporeonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sJolteonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFlareonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_2_CROSS_EVOS static const u16 sEspeonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sUmbreonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS @@ -8698,80 +7528,68 @@ static const u16 sUmbreonTeachableLearnset[] = { static const u16 sLeafeonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGlaceonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -8779,42 +7597,36 @@ static const u16 sGlaceonTeachableLearnset[] = { #if P_GEN_6_CROSS_EVOS static const u16 sSylveonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_6_CROSS_EVOS @@ -8824,41 +7636,35 @@ static const u16 sSylveonTeachableLearnset[] = { static const u16 sPorygonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -8866,41 +7672,35 @@ static const u16 sPorygonTeachableLearnset[] = { static const u16 sPorygon2TeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -8908,41 +7708,35 @@ static const u16 sPorygon2TeachableLearnset[] = { static const u16 sPorygonZTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -8953,78 +7747,66 @@ static const u16 sPorygonZTeachableLearnset[] = { static const u16 sOmanyteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sOmastarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_OMANYTE @@ -9034,40 +7816,34 @@ static const u16 sKabutoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -9075,48 +7851,42 @@ static const u16 sKabutopsTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KABUTO @@ -9125,43 +7895,37 @@ static const u16 sKabutopsTeachableLearnset[] = { static const u16 sAerodactylTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AERODACTYL @@ -9171,57 +7935,51 @@ static const u16 sAerodactylTeachableLearnset[] = { static const u16 sMunchlaxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -9229,62 +7987,56 @@ static const u16 sMunchlaxTeachableLearnset[] = { static const u16 sSnorlaxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNORLAX @@ -9293,38 +8045,32 @@ static const u16 sSnorlaxTeachableLearnset[] = { static const u16 sArticunoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -9332,10 +8078,10 @@ static const u16 sArticunoTeachableLearnset[] = { static const u16 sArticunoGalarTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -9343,18 +8089,12 @@ static const u16 sArticunoGalarTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -9364,40 +8104,34 @@ static const u16 sArticunoGalarTeachableLearnset[] = { #if P_FAMILY_ZAPDOS static const u16 sZapdosTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -9406,31 +8140,25 @@ static const u16 sZapdosGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_FACADE, - MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLY, + MOVE_HYPER_BEAM, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWIFT, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -9439,67 +8167,55 @@ static const u16 sZapdosGalarTeachableLearnset[] = { #if P_FAMILY_MOLTRES static const u16 sMoltresTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sMoltresGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -9509,86 +8225,74 @@ static const u16 sMoltresGalarTeachableLearnset[] = { static const u16 sDratiniTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDragonairTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -9596,66 +8300,60 @@ static const u16 sDragoniteTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRATINI @@ -9664,72 +8362,66 @@ static const u16 sDragoniteTeachableLearnset[] = { static const u16 sMewtwoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MEWTWO @@ -9737,94 +8429,6 @@ static const u16 sMewtwoTeachableLearnset[] = { #if P_FAMILY_MEW // Instead of reading this array for Mew, it checks for exceptions in CanLearnTeachableMove instead. static const u16 sMewTeachableLearnset[] = { - MOVE_AERIAL_ACE, - MOVE_ATTRACT, - MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_BULK_UP, - MOVE_BULLET_SEED, - MOVE_CALM_MIND, - MOVE_CUT, - MOVE_DIG, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_DRAGON_CLAW, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FLASH, - MOVE_FLY, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_OVERHEAT, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STEEL_WING, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MEW @@ -9832,115 +8436,97 @@ static const u16 sMewTeachableLearnset[] = { #if P_FAMILY_CHIKORITA static const u16 sChikoritaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBayleefTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMeganiumTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIKORITA @@ -9949,166 +8535,142 @@ static const u16 sMeganiumTeachableLearnset[] = { static const u16 sCyndaquilTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sQuilavaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sTyphlosionTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sTyphlosionHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, @@ -10121,48 +8683,42 @@ static const u16 sTotodileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -10170,52 +8726,46 @@ static const u16 sCroconawTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -10223,54 +8773,48 @@ static const u16 sFeraligatrTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOTODILE @@ -10279,101 +8823,89 @@ static const u16 sFeraligatrTeachableLearnset[] = { static const u16 sSentretTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sFurretTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SENTRET @@ -10383,75 +8915,63 @@ static const u16 sHoothootTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sNoctowlTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOOTHOOT @@ -10461,40 +8981,34 @@ static const u16 sLedybaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -10502,43 +9016,37 @@ static const u16 sLedianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LEDYBA @@ -10546,63 +9054,51 @@ static const u16 sLedianTeachableLearnset[] = { #if P_FAMILY_SPINARAK static const u16 sSpinarakTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sAriadosTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPINARAK @@ -10612,34 +9108,28 @@ static const u16 sChinchouTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -10647,35 +9137,29 @@ static const u16 sLanturnTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHINCHOU @@ -10684,107 +9168,95 @@ static const u16 sLanturnTeachableLearnset[] = { static const u16 sTogepiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sTogeticTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -10792,52 +9264,46 @@ static const u16 sTogeticTeachableLearnset[] = { static const u16 sTogekissTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -10848,38 +9314,32 @@ static const u16 sNatuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -10887,40 +9347,34 @@ static const u16 sXatuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NATU @@ -10928,136 +9382,118 @@ static const u16 sXatuTeachableLearnset[] = { #if P_FAMILY_MAREEP static const u16 sMareepTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFlaaffyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sAmpharosTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAREEP @@ -11067,36 +9503,30 @@ static const u16 sAmpharosTeachableLearnset[] = { static const u16 sAzurillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, + MOVE_FACADE, + MOVE_HAIL, + MOVE_ICE_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_3_CROSS_EVOS @@ -11104,97 +9534,85 @@ static const u16 sAzurillTeachableLearnset[] = { static const u16 sMarillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sAzumarillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MARILL @@ -11203,89 +9621,77 @@ static const u16 sAzumarillTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sBonslyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_MIMIC, + MOVE_FACADE, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS static const u16 sSudowoodoTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SUDOWOODO @@ -11295,33 +9701,27 @@ static const u16 sHoppipTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11329,33 +9729,27 @@ static const u16 sSkiploomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11363,34 +9757,28 @@ static const u16 sJumpluffTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOPPIP @@ -11399,56 +9787,50 @@ static const u16 sJumpluffTeachableLearnset[] = { static const u16 sAipomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -11457,50 +9839,44 @@ static const u16 sAmbipomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -11511,31 +9887,25 @@ static const u16 sSunkernTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11543,32 +9913,26 @@ static const u16 sSunfloraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SUNKERN @@ -11577,34 +9941,28 @@ static const u16 sSunfloraTeachableLearnset[] = { static const u16 sYanmaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11612,36 +9970,30 @@ static const u16 sYanmaTeachableLearnset[] = { static const u16 sYanmegaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -11651,164 +10003,140 @@ static const u16 sYanmegaTeachableLearnset[] = { static const u16 sWooperTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DIG, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, + MOVE_DIVE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLASH, + MOVE_HAIL, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, - MOVE_MIMIC, + MOVE_IRON_TAIL, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sQuagsireTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #if P_PALDEAN_FORMS static const u16 sWooperPaldeaTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sClodsireTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_PALDEAN_FORMS @@ -11819,39 +10147,33 @@ static const u16 sMurkrowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SNATCH, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLY, + MOVE_HYPER_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11860,39 +10182,33 @@ static const u16 sHonchkrowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SNATCH, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLY, + MOVE_HYPER_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -11903,42 +10219,36 @@ static const u16 sMisdreavusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -11948,39 +10258,33 @@ static const u16 sMismagiusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -11988,7 +10292,6 @@ static const u16 sMismagiusTeachableLearnset[] = { #if P_FAMILY_UNOWN static const u16 sUnownTeachableLearnset[] = { - MOVE_HIDDEN_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_UNOWN @@ -11996,15 +10299,15 @@ static const u16 sUnownTeachableLearnset[] = { #if P_FAMILY_WOBBUFFET #if P_GEN_3_CROSS_EVOS static const u16 sWynautTeachableLearnset[] = { - MOVE_SAFEGUARD, MOVE_COUNTER, + MOVE_SAFEGUARD, MOVE_UNAVAILABLE, }; #endif //P_GEN_3_CROSS_EVOS static const u16 sWobbuffetTeachableLearnset[] = { - MOVE_SAFEGUARD, MOVE_COUNTER, + MOVE_SAFEGUARD, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WOBBUFFET @@ -12012,80 +10315,68 @@ static const u16 sWobbuffetTeachableLearnset[] = { #if P_FAMILY_GIRAFARIG static const u16 sGirafarigTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sFarigirafTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -12095,83 +10386,71 @@ static const u16 sFarigirafTeachableLearnset[] = { #if P_FAMILY_PINECO static const u16 sPinecoTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sForretressTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PINECO @@ -12180,93 +10459,81 @@ static const u16 sForretressTeachableLearnset[] = { static const u16 sDunsparceTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sDudunsparceTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -12277,44 +10544,38 @@ static const u16 sGligarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -12323,44 +10584,38 @@ static const u16 sGliscorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -12369,121 +10624,109 @@ static const u16 sGliscorTeachableLearnset[] = { #if P_FAMILY_SNUBBULL static const u16 sSnubbullTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sGranbullTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNUBBULL @@ -12492,100 +10735,82 @@ static const u16 sGranbullTeachableLearnset[] = { static const u16 sQwilfishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SLUDGE_BOMB, - MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sQwilfishHisuiTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SURF, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sOverqwilTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SURF, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -12594,37 +10819,31 @@ static const u16 sOverqwilTeachableLearnset[] = { #if P_FAMILY_SHUCKLE static const u16 sShuckleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHUCKLE @@ -12633,43 +10852,37 @@ static const u16 sShuckleTeachableLearnset[] = { static const u16 sHeracrossTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HERACROSS @@ -12681,53 +10894,47 @@ static const u16 sSneaselTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -12738,52 +10945,46 @@ static const u16 sWeavileTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -12794,31 +10995,25 @@ static const u16 sSneaselHisuiTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -12827,35 +11022,29 @@ static const u16 sSneaslerTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -12865,190 +11054,166 @@ static const u16 sSneaslerTeachableLearnset[] = { static const u16 sTeddiursaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_CUT, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_CUT, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sUrsaringTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_CUT, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_CUT, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_FURY_CUTTER, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_8_CROSS_EVOS static const u16 sUrsalunaTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sUrsalunaBloodmoonTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -13058,77 +11223,65 @@ static const u16 sUrsalunaBloodmoonTeachableLearnset[] = { #if P_FAMILY_SLUGMA static const u16 sSlugmaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMagcargoTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SLUGMA @@ -13137,79 +11290,67 @@ static const u16 sMagcargoTeachableLearnset[] = { static const u16 sSwinubTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPiloswineTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -13217,40 +11358,34 @@ static const u16 sPiloswineTeachableLearnset[] = { static const u16 sMamoswineTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -13260,47 +11395,41 @@ static const u16 sMamoswineTeachableLearnset[] = { static const u16 sCorsolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -13308,77 +11437,65 @@ static const u16 sCorsolaTeachableLearnset[] = { static const u16 sCorsolaGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCursolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -13389,39 +11506,33 @@ static const u16 sRemoraidTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -13429,41 +11540,35 @@ static const u16 sOctilleryTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REMORAID @@ -13473,42 +11578,36 @@ static const u16 sDelibirdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DELIBIRD @@ -13520,33 +11619,27 @@ static const u16 sMantykeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -13555,38 +11648,32 @@ static const u16 sMantineTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MANTINE @@ -13595,42 +11682,36 @@ static const u16 sMantineTeachableLearnset[] = { static const u16 sSkarmoryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKARMORY @@ -13638,85 +11719,73 @@ static const u16 sSkarmoryTeachableLearnset[] = { #if P_FAMILY_HOUNDOUR static const u16 sHoundourTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sHoundoomTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOUNDOUR @@ -13724,78 +11793,66 @@ static const u16 sHoundoomTeachableLearnset[] = { #if P_FAMILY_PHANPY static const u16 sPhanpyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_IRON_TAIL, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sDonphanTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_HYPER_BEAM, + MOVE_IRON_TAIL, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PHANPY @@ -13803,84 +11860,72 @@ static const u16 sDonphanTeachableLearnset[] = { #if P_FAMILY_STANTLER static const u16 sStantlerTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_8_CROSS_EVOS static const u16 sWyrdeerTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -13897,147 +11942,129 @@ static const u16 sSmeargleTeachableLearnset[] = { static const u16 sMiltankTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MILTANK #if P_FAMILY_RAIKOU static const u16 sRaikouTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RAIKOU #if P_FAMILY_ENTEI static const u16 sEnteiTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ENTEI @@ -14045,45 +12072,39 @@ static const u16 sEnteiTeachableLearnset[] = { #if P_FAMILY_SUICUNE static const u16 sSuicuneTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SUICUNE @@ -14091,74 +12112,62 @@ static const u16 sSuicuneTeachableLearnset[] = { #if P_FAMILY_LARVITAR static const u16 sLarvitarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sPupitarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -14166,61 +12175,55 @@ static const u16 sTyranitarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LARVITAR @@ -14229,58 +12232,52 @@ static const u16 sTyranitarTeachableLearnset[] = { static const u16 sLugiaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LUGIA @@ -14288,53 +12285,47 @@ static const u16 sLugiaTeachableLearnset[] = { #if P_FAMILY_HO_OH static const u16 sHoOhTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HO_OH @@ -14344,45 +12335,39 @@ static const u16 sCelebiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CELEBI @@ -14391,151 +12376,133 @@ static const u16 sCelebiTeachableLearnset[] = { static const u16 sTreeckoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGrovyleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSceptileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TREECKO @@ -14544,140 +12511,122 @@ static const u16 sSceptileTeachableLearnset[] = { static const u16 sTorchicTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCombuskenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_OVERHEAT, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, MOVE_FURY_CUTTER, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_OVERHEAT, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBlazikenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TORCHIC @@ -14686,144 +12635,126 @@ static const u16 sBlazikenTeachableLearnset[] = { static const u16 sMudkipTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DIG, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, + MOVE_DIVE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, + MOVE_FACADE, + MOVE_HAIL, + MOVE_ICE_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, + MOVE_IRON_TAIL, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sMarshtompTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sSwampertTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUDKIP @@ -14831,75 +12762,63 @@ static const u16 sSwampertTeachableLearnset[] = { #if P_FAMILY_POOCHYENA static const u16 sPoochyenaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sMightyenaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POOCHYENA @@ -14908,91 +12827,79 @@ static const u16 sMightyenaTeachableLearnset[] = { static const u16 sZigzagoonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sLinooneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -15000,34 +12907,28 @@ static const u16 sLinooneTeachableLearnset[] = { static const u16 sZigzagoonGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -15035,35 +12936,29 @@ static const u16 sZigzagoonGalarTeachableLearnset[] = { static const u16 sLinooneGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -15071,41 +12966,35 @@ static const u16 sLinooneGalarTeachableLearnset[] = { static const u16 sObstagoonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FIRE_PUNCH, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -15126,32 +13015,26 @@ static const u16 sSilcoonTeachableLearnset[] = { static const u16 sBeautiflyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15162,33 +13045,27 @@ static const u16 sCascoonTeachableLearnset[] = { static const u16 sDustoxTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WURMPLE @@ -15197,141 +13074,123 @@ static const u16 sDustoxTeachableLearnset[] = { static const u16 sLotadTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sLombreTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIVE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_HAIL, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sLudicoloTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_DIVE, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIVE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_GIGA_DRAIN, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LOTAD @@ -15339,135 +13198,117 @@ static const u16 sLudicoloTeachableLearnset[] = { #if P_FAMILY_SEEDOT static const u16 sSeedotTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, MOVE_ROLLOUT, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sNuzleafTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sShiftryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, + MOVE_MEGA_KICK, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEEDOT @@ -15476,61 +13317,49 @@ static const u16 sShiftryTeachableLearnset[] = { static const u16 sTaillowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSwellowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAILLOW @@ -15540,35 +13369,29 @@ static const u16 sWingullTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -15576,37 +13399,31 @@ static const u16 sPelipperTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WINGULL @@ -15614,159 +13431,141 @@ static const u16 sPelipperTeachableLearnset[] = { #if P_FAMILY_RALTS static const u16 sRaltsTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sKirliaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGardevoirTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15774,63 +13573,57 @@ static const u16 sGardevoirTeachableLearnset[] = { static const u16 sGalladeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -15840,37 +13633,31 @@ static const u16 sGalladeTeachableLearnset[] = { static const u16 sSurskitTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -15878,38 +13665,32 @@ static const u16 sMasquerainTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SURSKIT @@ -15917,88 +13698,76 @@ static const u16 sMasquerainTeachableLearnset[] = { #if P_FAMILY_SHROOMISH static const u16 sShroomishTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBreloomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHROOMISH @@ -16008,55 +13777,49 @@ static const u16 sSlakothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_CUT, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_CUT, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH, MOVE_FURY_CUTTER, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -16064,60 +13827,54 @@ static const u16 sVigorothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_FURY_CUTTER, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -16125,61 +13882,55 @@ static const u16 sSlakingTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SLAKOTH @@ -16189,30 +13940,24 @@ static const u16 sNincadaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16221,34 +13966,28 @@ static const u16 sNinjaskTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16256,33 +13995,27 @@ static const u16 sShedinjaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLASH, MOVE_FURY_CUTTER, - MOVE_MIMIC, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, + MOVE_SANDSTORM, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NINCADA @@ -16291,158 +14024,140 @@ static const u16 sShedinjaTeachableLearnset[] = { static const u16 sWhismurTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sLoudredTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_OVERHEAT, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_OVERHEAT, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sExploudTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_OVERHEAT, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_OVERHEAT, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WHISMUR @@ -16450,96 +14165,84 @@ static const u16 sExploudTeachableLearnset[] = { #if P_FAMILY_MAKUHITA static const u16 sMakuhitaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHariyamaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAKUHITA @@ -16547,87 +14250,75 @@ static const u16 sHariyamaTeachableLearnset[] = { #if P_FAMILY_NOSEPASS static const u16 sNosepassTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sProbopassTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FIRE_PUNCH, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -16637,93 +14328,81 @@ static const u16 sProbopassTeachableLearnset[] = { static const u16 sSkittyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLASH, + MOVE_ICE_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, + MOVE_IRON_TAIL, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sDelcattyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKITTY @@ -16732,62 +14411,56 @@ static const u16 sDelcattyTeachableLearnset[] = { static const u16 sSableyeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, MOVE_FURY_CUTTER, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SABLEYE @@ -16795,53 +14468,47 @@ static const u16 sSableyeTeachableLearnset[] = { #if P_FAMILY_MAWILE static const u16 sMawileTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAWILE @@ -16850,82 +14517,70 @@ static const u16 sMawileTeachableLearnset[] = { static const u16 sAronTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, + MOVE_SANDSTORM, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sLaironTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, + MOVE_SANDSTORM, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -16933,63 +14588,57 @@ static const u16 sAggronTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARON @@ -16998,109 +14647,97 @@ static const u16 sAggronTeachableLearnset[] = { static const u16 sMedititeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMedichamTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MEDITITE @@ -17108,75 +14745,63 @@ static const u16 sMedichamTeachableLearnset[] = { #if P_FAMILY_ELECTRIKE static const u16 sElectrikeTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sManectricTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ELECTRIKE @@ -17184,43 +14809,37 @@ static const u16 sManectricTeachableLearnset[] = { #if P_FAMILY_PLUSLE static const u16 sPlusleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLASH, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PLUSLE @@ -17228,42 +14847,36 @@ static const u16 sPlusleTeachableLearnset[] = { #if P_FAMILY_MINUN static const u16 sMinunTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLASH, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MINUN @@ -17272,99 +14885,87 @@ static const u16 sMinunTeachableLearnset[] = { static const u16 sVolbeatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sIllumiseTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VOLBEAT_ILLUMISE @@ -17376,105 +14977,87 @@ static const u16 sBudewTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS static const u16 sRoseliaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sRoseradeTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -17483,101 +15066,89 @@ static const u16 sRoseradeTeachableLearnset[] = { #if P_FAMILY_GULPIN static const u16 sGulpinTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BULLET_SEED, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_BULLET_SEED, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_GIGA_DRAIN, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sSwalotTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GULPIN @@ -17587,35 +15158,29 @@ static const u16 sCarvanhaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -17623,41 +15188,35 @@ static const u16 sSharpedoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CARVANHA @@ -17666,77 +15225,65 @@ static const u16 sSharpedoTeachableLearnset[] = { static const u16 sWailmerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sWailordTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WAILMER @@ -17744,80 +15291,68 @@ static const u16 sWailordTeachableLearnset[] = { #if P_FAMILY_NUMEL static const u16 sNumelTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCameruptTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NUMEL @@ -17825,40 +15360,34 @@ static const u16 sCameruptTeachableLearnset[] = { #if P_FAMILY_TORKOAL static const u16 sTorkoalTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TORKOAL @@ -17866,99 +15395,87 @@ static const u16 sTorkoalTeachableLearnset[] = { #if P_FAMILY_SPOINK static const u16 sSpoinkTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGrumpigTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPOINK @@ -17966,58 +15483,52 @@ static const u16 sGrumpigTeachableLearnset[] = { #if P_FAMILY_SPINDA static const u16 sSpindaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPINDA @@ -18025,123 +15536,105 @@ static const u16 sSpindaTeachableLearnset[] = { #if P_FAMILY_TRAPINCH static const u16 sTrapinchTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVibravaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFlygonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TRAPINCH @@ -18149,92 +15642,80 @@ static const u16 sFlygonTeachableLearnset[] = { #if P_FAMILY_CACNEA static const u16 sCacneaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCacturneTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CACNEA @@ -18243,78 +15724,66 @@ static const u16 sCacturneTeachableLearnset[] = { static const u16 sSwabluTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sAltariaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SWABLU @@ -18324,64 +15793,58 @@ static const u16 sZangooseTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZANGOOSE @@ -18389,42 +15852,36 @@ static const u16 sZangooseTeachableLearnset[] = { #if P_FAMILY_SEVIPER static const u16 sSeviperTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEVIPER @@ -18432,95 +15889,83 @@ static const u16 sSeviperTeachableLearnset[] = { #if P_FAMILY_LUNATONE static const u16 sLunatoneTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LUNATONE #if P_FAMILY_SOLROCK static const u16 sSolrockTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SOLROCK @@ -18530,36 +15975,30 @@ static const u16 sBarboachTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -18567,41 +16006,35 @@ static const u16 sWhiscashTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BARBOACH @@ -18611,44 +16044,38 @@ static const u16 sCorphishTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -18656,47 +16083,41 @@ static const u16 sCrawdauntTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CORPHISH @@ -18705,85 +16126,73 @@ static const u16 sCrawdauntTeachableLearnset[] = { static const u16 sBaltoyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sClaydolTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BALTOY @@ -18791,74 +16200,62 @@ static const u16 sClaydolTeachableLearnset[] = { #if P_FAMILY_LILEEP static const u16 sLileepTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCradilyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LILEEP @@ -18867,75 +16264,63 @@ static const u16 sCradilyTeachableLearnset[] = { static const u16 sAnorithTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sArmaldoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ANORITH @@ -18945,70 +16330,58 @@ static const u16 sFeebasTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sMiloticTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FEEBAS @@ -19017,43 +16390,37 @@ static const u16 sMiloticTeachableLearnset[] = { static const u16 sCastformTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CASTFORM @@ -19063,64 +16430,58 @@ static const u16 sKecleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_FURY_CUTTER, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_IRON_TAIL, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KECLEON @@ -19128,86 +16489,74 @@ static const u16 sKecleonTeachableLearnset[] = { #if P_FAMILY_SHUPPET static const u16 sShuppetTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sBanetteTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHUPPET @@ -19216,94 +16565,82 @@ static const u16 sBanetteTeachableLearnset[] = { static const u16 sDuskullTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sDusclopsTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19311,53 +16648,47 @@ static const u16 sDusclopsTeachableLearnset[] = { static const u16 sDusknoirTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -19367,42 +16698,36 @@ static const u16 sDusknoirTeachableLearnset[] = { static const u16 sTropiusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TROPIUS @@ -19412,41 +16737,35 @@ static const u16 sTropiusTeachableLearnset[] = { static const u16 sChinglingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -19454,42 +16773,36 @@ static const u16 sChinglingTeachableLearnset[] = { static const u16 sChimechoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIMECHO @@ -19499,57 +16812,51 @@ static const u16 sAbsolTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ABSOL @@ -19558,72 +16865,60 @@ static const u16 sAbsolTeachableLearnset[] = { static const u16 sSnoruntTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sGlalieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -19631,46 +16926,40 @@ static const u16 sGlalieTeachableLearnset[] = { static const u16 sFroslassTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS @@ -19680,125 +16969,107 @@ static const u16 sFroslassTeachableLearnset[] = { static const u16 sSphealTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sSealeoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sWalreinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPHEAL @@ -19807,105 +17078,87 @@ static const u16 sWalreinTeachableLearnset[] = { static const u16 sClamperlTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sHuntailTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sGorebyssTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLAMPERL @@ -19914,41 +17167,35 @@ static const u16 sGorebyssTeachableLearnset[] = { static const u16 sRelicanthTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RELICANTH @@ -19958,32 +17205,26 @@ static const u16 sLuvdiscTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LUVDISC @@ -19992,122 +17233,104 @@ static const u16 sLuvdiscTeachableLearnset[] = { static const u16 sBagonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sShelgonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSalamenceTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BAGON @@ -20119,155 +17342,137 @@ static const u16 sBeldumTeachableLearnset[] = { static const u16 sMetangTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMetagrossTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BELDUM #if P_FAMILY_REGIROCK static const u16 sRegirockTeachableLearnset[] = { - MOVE_BRICK_BREAK, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGIROCK @@ -20275,52 +17480,46 @@ static const u16 sRegirockTeachableLearnset[] = { #if P_FAMILY_REGICE static const u16 sRegiceTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGICE @@ -20328,51 +17527,45 @@ static const u16 sRegiceTeachableLearnset[] = { #if P_FAMILY_REGISTEEL static const u16 sRegisteelTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, MOVE_SEISMIC_TOSS, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGISTEEL @@ -20381,56 +17574,50 @@ static const u16 sRegisteelTeachableLearnset[] = { static const u16 sLatiasTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LATIAS @@ -20439,56 +17626,50 @@ static const u16 sLatiasTeachableLearnset[] = { static const u16 sLatiosTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LATIOS @@ -20496,49 +17677,43 @@ static const u16 sLatiosTeachableLearnset[] = { #if P_FAMILY_KYOGRE static const u16 sKyogreTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KYOGRE @@ -20546,62 +17721,56 @@ static const u16 sKyogreTeachableLearnset[] = { #if P_FAMILY_GROUDON static const u16 sGroudonTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GROUDON @@ -20610,57 +17779,51 @@ static const u16 sGroudonTeachableLearnset[] = { static const u16 sRayquazaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RAYQUAZA @@ -20668,53 +17831,47 @@ static const u16 sRayquazaTeachableLearnset[] = { #if P_FAMILY_JIRACHI static const u16 sJirachiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, + MOVE_CALM_MIND, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JIRACHI @@ -20722,247 +17879,223 @@ static const u16 sJirachiTeachableLearnset[] = { #if P_FAMILY_DEOXYS static const u16 sDeoxysNormalTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDeoxysAttackTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDeoxysDefenseTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDeoxysSpeedTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_CUT, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_CUT, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, MOVE_SEISMIC_TOSS, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEOXYS @@ -20970,117 +18103,99 @@ static const u16 sDeoxysSpeedTeachableLearnset[] = { #if P_FAMILY_TURTWIG static const u16 sTurtwigTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGrotleTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sTorterraTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TURTWIG @@ -21091,46 +18206,40 @@ static const u16 sChimcharTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21139,100 +18248,88 @@ static const u16 sMonfernoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sInfernapeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIMCHAR @@ -21246,34 +18343,28 @@ static const u16 sPiplupTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -21285,35 +18376,29 @@ static const u16 sPrinplupTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -21321,47 +18406,41 @@ static const u16 sEmpoleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SURF, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIPLUP @@ -21370,88 +18449,70 @@ static const u16 sEmpoleonTeachableLearnset[] = { static const u16 sStarlyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sStaraviaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sStaraptorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STARLY @@ -21461,42 +18522,36 @@ static const u16 sBidoofTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21504,49 +18559,43 @@ static const u16 sBibarelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BIDOOF @@ -21564,31 +18613,25 @@ static const u16 sKricketuneTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KRICKETOT @@ -21596,111 +18639,93 @@ static const u16 sKricketuneTeachableLearnset[] = { #if P_FAMILY_SHINX static const u16 sShinxTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLuxioTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLuxrayTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHINX @@ -21709,96 +18734,84 @@ static const u16 sLuxrayTeachableLearnset[] = { static const u16 sCranidosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sRampardosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRANIDOS @@ -21807,97 +18820,84 @@ static const u16 sRampardosTeachableLearnset[] = { static const u16 sShieldonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sBastiodonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHIELDON #if P_FAMILY_BURMY static const u16 sBurmyTeachableLearnset[] = { - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_SNORE, MOVE_UNAVAILABLE, @@ -21908,33 +18908,27 @@ static const u16 sWormadamPlantTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21942,38 +18936,32 @@ static const u16 sWormadamSandyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21981,33 +18969,27 @@ static const u16 sWormadamTrashTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -22015,35 +18997,29 @@ static const u16 sMothimTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, MOVE_DREAM_EATER, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BURMY @@ -22062,30 +19038,24 @@ static const u16 sVespiquenTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COMBEE @@ -22095,38 +19065,32 @@ static const u16 sPachirisuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PACHIRISU @@ -22140,88 +19104,76 @@ static const u16 sBuizelTeachableLearnset[] = { MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sFloatzelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUIZEL @@ -22230,61 +19182,49 @@ static const u16 sFloatzelTeachableLearnset[] = { static const u16 sCherubiTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_PROTECT, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCherrimTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHERUBI @@ -22293,77 +19233,65 @@ static const u16 sCherrimTeachableLearnset[] = { static const u16 sShellosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGastrodonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHELLOS @@ -22372,87 +19300,75 @@ static const u16 sGastrodonTeachableLearnset[] = { static const u16 sDrifloonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_DREAM_EATER, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FLASH, + MOVE_FLY, MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sDrifblimTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_DREAM_EATER, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FLASH, + MOVE_FLY, + MOVE_HYPER_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRIFLOON @@ -22461,43 +19377,37 @@ static const u16 sDrifblimTeachableLearnset[] = { static const u16 sBunearyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -22505,47 +19415,41 @@ static const u16 sLopunnyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUNEARY @@ -22556,21 +19460,27 @@ static const u16 sGlameowTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, @@ -22578,43 +19488,39 @@ static const u16 sGlameowTeachableLearnset[] = { MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPuruglyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, @@ -22622,20 +19528,6 @@ static const u16 sPuruglyTeachableLearnset[] = { MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GLAMEOW @@ -22643,167 +19535,143 @@ static const u16 sPuruglyTeachableLearnset[] = { #if P_FAMILY_STUNKY static const u16 sStunkyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sSkuntankTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STUNKY #if P_FAMILY_BRONZOR static const u16 sBronzorTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBronzongTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRONZOR @@ -22813,29 +19681,23 @@ static const u16 sChatotTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHATOT @@ -22843,40 +19705,34 @@ static const u16 sChatotTeachableLearnset[] = { #if P_FAMILY_SPIRITOMB static const u16 sSpiritombTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPIRITOMB @@ -22885,129 +19741,111 @@ static const u16 sSpiritombTeachableLearnset[] = { static const u16 sGibleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGabiteTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGarchompTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GIBLE @@ -23018,93 +19856,81 @@ static const u16 sRioluTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLucarioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, MOVE_FURY_CUTTER, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RIOLU @@ -23112,70 +19938,58 @@ static const u16 sLucarioTeachableLearnset[] = { #if P_FAMILY_HIPPOPOTAS static const u16 sHippopotasTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sHippowdonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HIPPOPOTAS @@ -23188,35 +20002,29 @@ static const u16 sSkorupiTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -23228,38 +20036,32 @@ static const u16 sDrapionTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKORUPI @@ -23270,45 +20072,39 @@ static const u16 sCroagunkTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FURY_CUTTER, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23317,48 +20113,42 @@ static const u16 sToxicroakTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_FURY_CUTTER, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CROAGUNK @@ -23369,30 +20159,24 @@ static const u16 sCarnivineTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CARNIVINE @@ -23403,32 +20187,26 @@ static const u16 sFinneonTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -23438,33 +20216,27 @@ static const u16 sLumineonTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FINNEON @@ -23473,89 +20245,77 @@ static const u16 sLumineonTeachableLearnset[] = { static const u16 sSnoverTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sAbomasnowTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNOVER @@ -23563,36 +20323,30 @@ static const u16 sAbomasnowTeachableLearnset[] = { #if P_FAMILY_ROTOM static const u16 sRotomTeachableLearnset[] = { MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROTOM @@ -23601,47 +20355,41 @@ static const u16 sRotomTeachableLearnset[] = { static const u16 sUxieTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_UXIE @@ -23650,48 +20398,42 @@ static const u16 sUxieTeachableLearnset[] = { static const u16 sMespritTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MESPRIT @@ -23699,52 +20441,46 @@ static const u16 sMespritTeachableLearnset[] = { #if P_FAMILY_AZELF static const u16 sAzelfTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_WATER_PULSE, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DREAM_EATER, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_FLASH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, MOVE_METRONOME, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AZELF @@ -23753,51 +20489,45 @@ static const u16 sAzelfTeachableLearnset[] = { static const u16 sDialgaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DIALGA @@ -23806,6 +20536,7 @@ static const u16 sDialgaTeachableLearnset[] = { static const u16 sPalkiaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -23813,48 +20544,41 @@ static const u16 sPalkiaTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PALKIA @@ -23862,40 +20586,34 @@ static const u16 sPalkiaTeachableLearnset[] = { #if P_FAMILY_HEATRAN static const u16 sHeatranTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HEATRAN @@ -23903,46 +20621,40 @@ static const u16 sHeatranTeachableLearnset[] = { #if P_FAMILY_REGIGIGAS static const u16 sRegigigasTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGIGIGAS @@ -23950,48 +20662,42 @@ static const u16 sRegigigasTeachableLearnset[] = { #if P_FAMILY_GIRATINA static const u16 sGiratinaTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GIRATINA @@ -23999,44 +20705,38 @@ static const u16 sGiratinaTeachableLearnset[] = { #if P_FAMILY_CRESSELIA static const u16 sCresseliaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRESSELIA @@ -24047,31 +20747,25 @@ static const u16 sPhioneTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -24080,38 +20774,32 @@ static const u16 sManaphyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MANAPHY @@ -24124,47 +20812,41 @@ static const u16 sDarkraiTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DARKRAI @@ -24173,67 +20855,55 @@ static const u16 sDarkraiTeachableLearnset[] = { static const u16 sShayminLandTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sShayminSkyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_PSYCH_UP, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHAYMIN @@ -24242,72 +20912,66 @@ static const u16 sShayminSkyTeachableLearnset[] = { static const u16 sArceusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TAUNT, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARCEUS @@ -24315,46 +20979,40 @@ static const u16 sArceusTeachableLearnset[] = { #if P_FAMILY_VICTINI static const u16 sVictiniTeachableLearnset[] = { MOVE_BRICK_BREAK, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VICTINI @@ -24366,35 +21024,29 @@ static const u16 sSnivyTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24404,77 +21056,65 @@ static const u16 sServineTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSerperiorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNIVY @@ -24482,127 +21122,109 @@ static const u16 sSerperiorTeachableLearnset[] = { #if P_FAMILY_TEPIG static const u16 sTepigTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPigniteTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sEmboarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TEPIG @@ -24616,34 +21238,28 @@ static const u16 sOshawottTeachableLearnset[] = { MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -24656,34 +21272,28 @@ static const u16 sDewottTeachableLearnset[] = { MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -24691,42 +21301,36 @@ static const u16 sSamurottTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -24734,34 +21338,28 @@ static const u16 sSamurottTeachableLearnset[] = { static const u16 sSamurottHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SURF, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -24775,25 +21373,19 @@ static const u16 sPatratTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THUNDERBOLT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24803,40 +21395,34 @@ static const u16 sWatchogTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PATRAT @@ -24847,30 +21433,24 @@ static const u16 sLillipupTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24879,32 +21459,26 @@ static const u16 sHerdierTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24913,34 +21487,28 @@ static const u16 sStoutlandTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LILLIPUP @@ -24951,32 +21519,26 @@ static const u16 sPurrloinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, MOVE_DREAM_EATER, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_IRON_TAIL, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24985,34 +21547,28 @@ static const u16 sLiepardTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PURRLOIN @@ -25027,27 +21583,21 @@ static const u16 sPansageTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -25061,29 +21611,23 @@ static const u16 sSimisageTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANSAGE @@ -25096,30 +21640,24 @@ static const u16 sPansearTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -25131,32 +21669,26 @@ static const u16 sSimisearTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANSEAR @@ -25171,32 +21703,26 @@ static const u16 sPanpourTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -25210,34 +21736,28 @@ static const u16 sSimipourTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANPOUR @@ -25246,77 +21766,65 @@ static const u16 sSimipourTeachableLearnset[] = { static const u16 sMunnaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMusharnaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUNNA @@ -25326,26 +21834,20 @@ static const u16 sPidoveTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25353,26 +21855,20 @@ static const u16 sTranquillTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25380,28 +21876,22 @@ static const u16 sUnfezantTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIDOVE @@ -25409,70 +21899,58 @@ static const u16 sUnfezantTeachableLearnset[] = { #if P_FAMILY_BLITZLE static const u16 sBlitzleTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sZebstrikaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BLITZLE @@ -25482,27 +21960,21 @@ static const u16 sRoggenrolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25510,27 +21982,21 @@ static const u16 sBoldoreTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25538,29 +22004,23 @@ static const u16 sGigalithTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROGGENROLA @@ -25571,39 +22031,33 @@ static const u16 sWoobatTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_STEEL_WING, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25612,40 +22066,34 @@ static const u16 sSwoobatTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_STEEL_WING, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WOOBAT @@ -25657,69 +22105,57 @@ static const u16 sDrilburTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sExcadrillTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRILBUR @@ -25728,54 +22164,48 @@ static const u16 sExcadrillTeachableLearnset[] = { static const u16 sAudinoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AUDINO @@ -25785,39 +22215,33 @@ static const u16 sTimburrTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25825,82 +22249,70 @@ static const u16 sGurdurrTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sConkeldurrTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_DYNAMIC_PUNCH, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TIMBURR @@ -25909,56 +22321,44 @@ static const u16 sConkeldurrTeachableLearnset[] = { static const u16 sTympoleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sPalpitoadTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -25969,36 +22369,30 @@ static const u16 sSeismitoadTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYMPOLE @@ -26006,40 +22400,34 @@ static const u16 sSeismitoadTeachableLearnset[] = { #if P_FAMILY_THROH static const u16 sThrohTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_THROH @@ -26049,37 +22437,31 @@ static const u16 sSawkTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_COUNTER, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SAWK @@ -26090,28 +22472,22 @@ static const u16 sSewaddleTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26120,28 +22496,22 @@ static const u16 sSwadloonTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26152,32 +22522,26 @@ static const u16 sLeavannyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SEWADDLE @@ -26185,95 +22549,77 @@ static const u16 sLeavannyTeachableLearnset[] = { #if P_FAMILY_VENIPEDE static const u16 sVenipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FURY_CUTTER, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sWhirlipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FURY_CUTTER, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sScolipedeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VENIPEDE @@ -26282,61 +22628,49 @@ static const u16 sScolipedeTeachableLearnset[] = { static const u16 sCottoneeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_DREAM_EATER, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_PROTECT, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sWhimsicottTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COTTONEE @@ -26347,26 +22681,20 @@ static const u16 sPetililTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_DREAM_EATER, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_PROTECT, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26375,30 +22703,24 @@ static const u16 sLilligantTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_PSYCH_UP, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26407,26 +22729,20 @@ static const u16 sLilligantHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, MOVE_ENDURE, + MOVE_FACADE, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, MOVE_MEGA_KICK, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -26439,85 +22755,67 @@ static const u16 sBasculinTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sBasculinWhiteStripedTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SURF, + MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sBasculegionTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SURF, + MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -26526,131 +22824,113 @@ static const u16 sBasculegionTeachableLearnset[] = { #if P_FAMILY_SANDILE static const u16 sSandileTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sKrokorokTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sKrookodileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SANDILE @@ -26661,84 +22941,72 @@ static const u16 sDarumakaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sDarmanitanTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -26748,73 +23016,61 @@ static const u16 sDarumakaGalarTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sDarmanitanGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -26826,25 +23082,19 @@ static const u16 sMaractusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MARACTUS @@ -26853,67 +23103,55 @@ static const u16 sMaractusTeachableLearnset[] = { static const u16 sDwebbleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCrustleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DWEBBLE @@ -26923,93 +23161,81 @@ static const u16 sScraggyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; static const u16 sScraftyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCRAGGY @@ -27020,40 +23246,34 @@ static const u16 sSigilyphTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_STEEL_WING, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STEEL_WING, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SIGILYPH @@ -27063,31 +23283,25 @@ static const u16 sYamaskTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -27095,32 +23309,26 @@ static const u16 sCofagrigusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -27129,27 +23337,21 @@ static const u16 sYamaskGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_THIEF, MOVE_UNAVAILABLE, }; @@ -27157,29 +23359,23 @@ static const u16 sRunerigusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -27189,77 +23385,65 @@ static const u16 sRunerigusTeachableLearnset[] = { static const u16 sTirtougaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sCarracostaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TIRTOUGA @@ -27273,30 +23457,24 @@ static const u16 sArchenTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -27308,32 +23486,26 @@ static const u16 sArcheopsTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARCHEN @@ -27342,59 +23514,47 @@ static const u16 sArcheopsTeachableLearnset[] = { static const u16 sTrubbishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGarbodorTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TRUBBISH @@ -27404,81 +23564,69 @@ static const u16 sZoruaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sZoroarkTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -27487,65 +23635,53 @@ static const u16 sZoruaHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CALM_MIND, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sZoroarkHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -27558,30 +23694,24 @@ static const u16 sMinccinoTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -27590,35 +23720,29 @@ static const u16 sCinccinoTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MINCCINO @@ -27628,40 +23752,34 @@ static const u16 sGothitaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -27669,86 +23787,74 @@ static const u16 sGothoritaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sGothitelleTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOTHITA @@ -27758,40 +23864,34 @@ static const u16 sSolosisTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_TOXIC, MOVE_DREAM_EATER, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -27799,90 +23899,78 @@ static const u16 sDuosionTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_TOXIC, MOVE_DREAM_EATER, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sReuniclusTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_DREAM_EATER, MOVE_ENDURE, MOVE_EXPLOSION, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FLASH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SOLOSIS @@ -27892,31 +23980,25 @@ static const u16 sDucklettTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -27924,32 +24006,26 @@ static const u16 sSwannaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DUCKLETT @@ -27959,28 +24035,22 @@ static const u16 sVanilliteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -27988,28 +24058,22 @@ static const u16 sVanillishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -28017,29 +24081,23 @@ static const u16 sVanilluxeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VANILLITE @@ -28047,71 +24105,59 @@ static const u16 sVanilluxeTeachableLearnset[] = { #if P_FAMILY_DEERLING static const u16 sDeerlingTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSawsbuckTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEERLING @@ -28122,31 +24168,25 @@ static const u16 sEmolgaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_EMOLGA @@ -28155,59 +24195,47 @@ static const u16 sEmolgaTeachableLearnset[] = { static const u16 sKarrablastTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sEscavalierTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_COUNTER, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KARRABLAST @@ -28215,62 +24243,50 @@ static const u16 sEscavalierTeachableLearnset[] = { #if P_FAMILY_FOONGUS static const u16 sFoongusTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sAmoongussTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FOONGUS @@ -28281,37 +24297,31 @@ static const u16 sFrillishTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -28320,38 +24330,32 @@ static const u16 sJellicentTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FRILLISH @@ -28360,38 +24364,32 @@ static const u16 sJellicentTeachableLearnset[] = { static const u16 sAlomomolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ALOMOMOLA @@ -28401,31 +24399,25 @@ static const u16 sJoltikTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -28433,32 +24425,26 @@ static const u16 sGalvantulaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JOLTIK @@ -28468,29 +24454,23 @@ static const u16 sFerroseedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_TOXIC, MOVE_ENDURE, MOVE_EXPLOSION, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_FLASH, + MOVE_GIGA_DRAIN, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -28500,34 +24480,28 @@ static const u16 sFerrothornTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FERROSEED @@ -28535,77 +24509,59 @@ static const u16 sFerrothornTeachableLearnset[] = { #if P_FAMILY_KLINK static const u16 sKlinkTeachableLearnset[] = { MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sKlangTeachableLearnset[] = { MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sKlinklangTeachableLearnset[] = { MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KLINK @@ -28618,77 +24574,65 @@ static const u16 sTynamoTeachableLearnset[] = { static const u16 sEelektrikTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sEelektrossTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYNAMO @@ -28698,38 +24642,32 @@ static const u16 sElgyemTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -28737,39 +24675,33 @@ static const u16 sBeheeyemTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ELGYEM @@ -28779,34 +24711,28 @@ static const u16 sLitwickTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -28814,34 +24740,28 @@ static const u16 sLampentTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -28849,35 +24769,29 @@ static const u16 sChandelureTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LITWICK @@ -28887,38 +24801,32 @@ static const u16 sAxewTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -28926,81 +24834,69 @@ static const u16 sFraxureTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHaxorusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AXEW @@ -29010,41 +24906,35 @@ static const u16 sCubchooTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -29052,49 +24942,43 @@ static const u16 sBearticTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CUBCHOO @@ -29103,32 +24987,26 @@ static const u16 sBearticTeachableLearnset[] = { static const u16 sCryogonalTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRYOGONAL @@ -29136,56 +25014,44 @@ static const u16 sCryogonalTeachableLearnset[] = { #if P_FAMILY_SHELMET static const u16 sShelmetTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sAccelgorTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHELMET @@ -29196,61 +25062,49 @@ static const u16 sStunfiskTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GALARIAN_FORMS static const u16 sStunfiskGalarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_COUNTER, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SURF, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -29266,34 +25120,28 @@ static const u16 sMienfooTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29304,37 +25152,31 @@ static const u16 sMienshaoTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MIENFOO @@ -29343,153 +25185,135 @@ static const u16 sMienshaoTeachableLearnset[] = { static const u16 sDruddigonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, + MOVE_THUNDER_PUNCH, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRUDDIGON #if P_FAMILY_GOLETT static const u16 sGolettTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGolurkTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SAFEGUARD, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_ICY_WIND, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THIEF, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOLETT @@ -29502,31 +25326,25 @@ static const u16 sPawniardTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SNATCH, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29537,32 +25355,26 @@ static const u16 sBisharpTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SNATCH, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -29571,27 +25383,21 @@ static const u16 sKingambitTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_TORMENT, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, + MOVE_TORMENT, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -29601,34 +25407,28 @@ static const u16 sKingambitTeachableLearnset[] = { static const u16 sBouffalantTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BOUFFALANT @@ -29637,101 +25437,83 @@ static const u16 sBouffalantTeachableLearnset[] = { static const u16 sRuffletTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBraviaryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sBraviaryHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_FACADE, - MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FLY, + MOVE_HYPER_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -29743,35 +25525,29 @@ static const u16 sVullabyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -29779,37 +25555,31 @@ static const u16 sMandibuzzTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VULLABY @@ -29818,39 +25588,33 @@ static const u16 sMandibuzzTeachableLearnset[] = { static const u16 sHeatmorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HEATMOR @@ -29862,27 +25626,21 @@ static const u16 sDurantTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DURANT @@ -29890,108 +25648,90 @@ static const u16 sDurantTeachableLearnset[] = { #if P_FAMILY_DEINO static const u16 sDeinoTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sZweilousTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHydreigonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, + MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEINO @@ -29999,48 +25739,43 @@ static const u16 sHydreigonTeachableLearnset[] = { #if P_FAMILY_LARVESTA static const u16 sLarvestaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sVolcaronaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -30048,20 +25783,13 @@ static const u16 sVolcaronaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LARVESTA @@ -30069,40 +25797,34 @@ static const u16 sVolcaronaTeachableLearnset[] = { #if P_FAMILY_COBALION static const u16 sCobalionTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COBALION @@ -30110,40 +25832,34 @@ static const u16 sCobalionTeachableLearnset[] = { #if P_FAMILY_TERRAKION static const u16 sTerrakionTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TERRAKION @@ -30151,42 +25867,36 @@ static const u16 sTerrakionTeachableLearnset[] = { #if P_FAMILY_VIRIZION static const u16 sVirizionTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VIRIZION @@ -30195,39 +25905,33 @@ static const u16 sVirizionTeachableLearnset[] = { static const u16 sTornadusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TORNADUS @@ -30235,56 +25939,51 @@ static const u16 sTornadusTeachableLearnset[] = { #if P_FAMILY_THUNDURUS static const u16 sThundurusTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_THUNDURUS #if P_FAMILY_RESHIRAM static const u16 sReshiramTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -30293,44 +25992,38 @@ static const u16 sReshiramTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RESHIRAM #if P_FAMILY_ZEKROM static const u16 sZekromTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -30338,32 +26031,25 @@ static const u16 sZekromTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZEKROM @@ -30371,43 +26057,37 @@ static const u16 sZekromTeachableLearnset[] = { #if P_FAMILY_LANDORUS static const u16 sLandorusTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LANDORUS @@ -30416,43 +26096,37 @@ static const u16 sLandorusTeachableLearnset[] = { static const u16 sKyuremTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KYUREM @@ -30463,38 +26137,32 @@ static const u16 sKeldeoTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KELDEO @@ -30504,45 +26172,39 @@ static const u16 sMeloettaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MELOETTA @@ -30552,13 +26214,14 @@ static const u16 sGenesectTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -30566,23 +26229,16 @@ static const u16 sGenesectTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GENESECT @@ -30591,146 +26247,128 @@ static const u16 sGenesectTeachableLearnset[] = { static const u16 sChespinTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sQuilladinTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sChesnaughtTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHESPIN @@ -30741,36 +26379,30 @@ static const u16 sFennekinTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -30779,40 +26411,34 @@ static const u16 sBraixenTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -30821,44 +26447,38 @@ static const u16 sDelphoxTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FENNEKIN @@ -30868,40 +26488,34 @@ static const u16 sFroakieTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -30909,42 +26523,36 @@ static const u16 sFrogadierTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -30953,43 +26561,37 @@ static const u16 sGreninjaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BRICK_BREAK, + MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FROAKIE @@ -31000,85 +26602,73 @@ static const u16 sBunnelbyTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sDiggersbyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, + MOVE_DEFENSE_CURL, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_IRON_TAIL, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUNNELBY @@ -31087,66 +26677,54 @@ static const u16 sDiggersbyTeachableLearnset[] = { static const u16 sFletchlingTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFletchinderTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31154,36 +26732,30 @@ static const u16 sTalonflameTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULK_UP, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLETCHLING @@ -31203,33 +26775,27 @@ static const u16 sVivillonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCATTERBUG @@ -31237,78 +26803,66 @@ static const u16 sVivillonTeachableLearnset[] = { #if P_FAMILY_LITLEO static const u16 sLitleoTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPyroarTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LITLEO @@ -31318,29 +26872,23 @@ static const u16 sFlabebeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31348,31 +26896,25 @@ static const u16 sFloetteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31380,31 +26922,25 @@ static const u16 sFloetteEternalTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31412,32 +26948,26 @@ static const u16 sFlorgesTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLABEBE @@ -31445,82 +26975,70 @@ static const u16 sFlorgesTeachableLearnset[] = { #if P_FAMILY_SKIDDO static const u16 sSkiddoTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGogoatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKIDDO @@ -31529,52 +27047,47 @@ static const u16 sGogoatTeachableLearnset[] = { static const u16 sPanchamTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPangoroTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -31582,43 +27095,36 @@ static const u16 sPangoroTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_SNATCH, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PANCHAM @@ -31630,25 +27136,19 @@ static const u16 sFurfrouTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_SURF, - MOVE_TOXIC, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, + MOVE_SURF, MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FURFROU @@ -31659,38 +27159,32 @@ static const u16 sEspurrTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31700,39 +27194,33 @@ static const u16 sMeowsticMTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31742,39 +27230,33 @@ static const u16 sMeowsticFTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ESPURR @@ -31786,27 +27268,21 @@ static const u16 sHonedgeTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31816,27 +27292,21 @@ static const u16 sDoubladeTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -31846,30 +27316,24 @@ static const u16 sAegislashTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HONEDGE @@ -31879,31 +27343,25 @@ static const u16 sSpritzeeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -31911,34 +27369,28 @@ static const u16 sAromatisseTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPRITZEE @@ -31948,32 +27400,26 @@ static const u16 sSwirlixTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -31981,35 +27427,29 @@ static const u16 sSlurpuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SWIRLIX @@ -32021,36 +27461,30 @@ static const u16 sInkayTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -32060,37 +27494,31 @@ static const u16 sMalamarTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_INKAY @@ -32105,38 +27533,32 @@ static const u16 sBinacleTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -32152,39 +27574,33 @@ static const u16 sBarbaracleTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FURY_CUTTER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BINACLE @@ -32194,33 +27610,27 @@ static const u16 sSkrelpTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -32228,35 +27638,29 @@ static const u16 sDragalgeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKRELP @@ -32268,70 +27672,58 @@ static const u16 sClauncherTeachableLearnset[] = { MOVE_CUT, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sClawitzerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLAUNCHER @@ -32342,35 +27734,29 @@ static const u16 sHelioptileTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -32379,42 +27765,36 @@ static const u16 sHelioliskTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HELIOPTILE @@ -32423,69 +27803,57 @@ static const u16 sHelioliskTeachableLearnset[] = { static const u16 sTyruntTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sTyrantrumTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYRUNT @@ -32494,89 +27862,77 @@ static const u16 sTyrantrumTeachableLearnset[] = { static const u16 sAmauraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sAurorusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_AMAURA @@ -32585,45 +27941,39 @@ static const u16 sAurorusTeachableLearnset[] = { static const u16 sHawluchaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLY, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HAWLUCHA @@ -32635,72 +27985,60 @@ static const u16 sDedenneTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEDENNE #if P_FAMILY_CARBINK static const u16 sCarbinkTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CARBINK @@ -32708,179 +28046,149 @@ static const u16 sCarbinkTeachableLearnset[] = { #if P_FAMILY_GOOMY static const u16 sGoomyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sSliggooTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGoodraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_PUNCH, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sSliggooHisuiTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGoodraHisuiTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -32892,33 +28200,27 @@ static const u16 sKlefkiTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KLEFKI @@ -32929,35 +28231,29 @@ static const u16 sPhantumpTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -32967,37 +28263,31 @@ static const u16 sTrevenantTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PHANTUMP @@ -33007,37 +28297,31 @@ static const u16 sPumpkabooTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; @@ -33045,38 +28329,32 @@ static const u16 sGourgeistTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_THIEF, MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PUMPKABOO @@ -33085,103 +28363,85 @@ static const u16 sGourgeistTeachableLearnset[] = { static const u16 sBergmiteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sAvaluggTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SURF, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SURF, MOVE_SWAGGER, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #if P_HISUIAN_FORMS static const u16 sAvaluggHisuiTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -33195,115 +28455,97 @@ static const u16 sNoibatTeachableLearnset[] = { MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sNoivernTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NOIBAT #if P_FAMILY_XERNEAS static const u16 sXerneasTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_XERNEAS @@ -33311,112 +28553,94 @@ static const u16 sXerneasTeachableLearnset[] = { #if P_FAMILY_YVELTAL static const u16 sYveltalTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_YVELTAL #if P_FAMILY_ZYGARDE static const u16 sZygardeTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZYGARDE #if P_FAMILY_DIANCIE static const u16 sDiancieTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DIANCIE @@ -33426,46 +28650,40 @@ static const u16 sHoopaConfinedTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -33473,90 +28691,78 @@ static const u16 sHoopaUnboundTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HOOPA #if P_FAMILY_VOLCANION static const u16 sVolcanionTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VOLCANION @@ -33567,29 +28773,23 @@ static const u16 sRowletTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -33598,29 +28798,23 @@ static const u16 sDartrixTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -33629,31 +28823,25 @@ static const u16 sDecidueyeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -33664,29 +28852,23 @@ static const u16 sDecidueyeHisuiTeachableLearnset[] = { MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -33695,105 +28877,87 @@ static const u16 sDecidueyeHisuiTeachableLearnset[] = { #if P_FAMILY_LITTEN static const u16 sLittenTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULK_UP, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sTorracatTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULK_UP, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sIncineroarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LITTEN @@ -33804,100 +28968,82 @@ static const u16 sPopplioTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sBrionneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sPrimarinaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POPPLIO @@ -33909,26 +29055,20 @@ static const u16 sPikipekTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -33938,27 +29078,21 @@ static const u16 sTrumbeakTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -33968,30 +29102,24 @@ static const u16 sToucannonTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_PSYCH_UP, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PIKIPEK @@ -34000,73 +29128,61 @@ static const u16 sToucannonTeachableLearnset[] = { static const u16 sYungoosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sGumshoosTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_YUNGOOS @@ -34076,26 +29192,20 @@ static const u16 sGrubbinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -34103,27 +29213,21 @@ static const u16 sCharjabugTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -34131,31 +29235,25 @@ static const u16 sVikavoltTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GRUBBIN @@ -34163,80 +29261,68 @@ static const u16 sVikavoltTeachableLearnset[] = { #if P_FAMILY_CRABRAWLER static const u16 sCrabrawlerTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICE_PUNCH, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCrabominableTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRABRAWLER @@ -34247,31 +29333,25 @@ static const u16 sOricorioTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ORICORIO @@ -34282,30 +29362,24 @@ static const u16 sCutieflyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -34314,32 +29388,26 @@ static const u16 sRibombeeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CUTIEFLY @@ -34347,141 +29415,117 @@ static const u16 sRibombeeTeachableLearnset[] = { #if P_FAMILY_ROCKRUFF static const u16 sRockruffTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLycanrocMiddayTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLycanrocMidnightTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_IRON_TAIL, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sLycanrocDuskTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROCKRUFF @@ -34490,30 +29534,24 @@ static const u16 sLycanrocDuskTeachableLearnset[] = { static const u16 sWishiwashiTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WISHIWASHI @@ -34523,62 +29561,50 @@ static const u16 sMareanieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sToxapexTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAREANIE @@ -34586,68 +29612,56 @@ static const u16 sToxapexTeachableLearnset[] = { #if P_FAMILY_MUDBRAY static const u16 sMudbrayTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_MEGA_KICK, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMudsdaleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_SUNNY_DAY, - MOVE_TOXIC, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_HYPER_BEAM, MOVE_MEGA_KICK, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUDBRAY @@ -34657,60 +29671,48 @@ static const u16 sDewpiderTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sAraquanidTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DEWPIDER @@ -34720,26 +29722,20 @@ static const u16 sFomantisTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -34749,28 +29745,22 @@ static const u16 sLurantisTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FOMANTIS @@ -34779,60 +29769,48 @@ static const u16 sLurantisTeachableLearnset[] = { static const u16 sMorelullTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sShiinoticTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLASH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MORELULL @@ -34842,69 +29820,57 @@ static const u16 sSalanditTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSalazzleTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SALANDIT @@ -34915,77 +29881,65 @@ static const u16 sStuffulTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TAUNT, - MOVE_TOXIC, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBewearTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STUFFUL @@ -34995,27 +29949,21 @@ static const u16 sBounsweetTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -35023,27 +29971,21 @@ static const u16 sSteeneeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -35051,30 +29993,24 @@ static const u16 sTsareenaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BOUNSWEET @@ -35085,30 +30021,24 @@ static const u16 sComfeyTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COMFEY @@ -35116,44 +30046,38 @@ static const u16 sComfeyTeachableLearnset[] = { #if P_FAMILY_ORANGURU static const u16 sOranguruTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ORANGURU @@ -35162,43 +30086,37 @@ static const u16 sOranguruTeachableLearnset[] = { static const u16 sPassimianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SEISMIC_TOSS, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PASSIMIAN @@ -35206,29 +30124,23 @@ static const u16 sPassimianTeachableLearnset[] = { #if P_FAMILY_WIMPOD static const u16 sWimpodTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_WATERFALL, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_TOXIC, + MOVE_WATERFALL, MOVE_UNAVAILABLE, }; @@ -35238,41 +30150,35 @@ static const u16 sGolisopodTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DEFENSE_CURL, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, + MOVE_FURY_CUTTER, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_FURY_CUTTER, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WIMPOD @@ -35282,65 +30188,53 @@ static const u16 sSandygastTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sPalossandTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SLUDGE_BOMB, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SANDYGAST @@ -35348,22 +30242,21 @@ static const u16 sPalossandTeachableLearnset[] = { #if P_FAMILY_PYUKUMUKU static const u16 sPyukumukuTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_COUNTER, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_HAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, MOVE_SAFEGUARD, + MOVE_SLEEP_TALK, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TOXIC, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PYUKUMUKU @@ -35371,74 +30264,62 @@ static const u16 sPyukumukuTeachableLearnset[] = { #if P_FAMILY_TYPE_NULL static const u16 sTypeNullTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSilvallyTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TYPE_NULL @@ -35447,37 +30328,31 @@ static const u16 sSilvallyTeachableLearnset[] = { static const u16 sMiniorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MINIOR @@ -35485,36 +30360,30 @@ static const u16 sMiniorTeachableLearnset[] = { #if P_FAMILY_KOMALA static const u16 sKomalaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, + MOVE_DOUBLE_TEAM, + MOVE_EARTHQUAKE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_HYPER_BEAM, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KOMALA @@ -35522,39 +30391,33 @@ static const u16 sKomalaTeachableLearnset[] = { #if P_FAMILY_TURTONATOR static const u16 sTurtonatorTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TURTONATOR @@ -35562,32 +30425,26 @@ static const u16 sTurtonatorTeachableLearnset[] = { #if P_FAMILY_TOGEDEMARU static const u16 sTogedemaruTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOGEDEMARU @@ -35597,37 +30454,31 @@ static const u16 sMimikyuTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MIMIKYU @@ -35640,11 +30491,12 @@ static const u16 sBruxishTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -35652,25 +30504,18 @@ static const u16 sBruxishTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRUXISH @@ -35683,42 +30528,36 @@ static const u16 sDrampaTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRAMPA @@ -35730,30 +30569,24 @@ static const u16 sDhelmiseTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DHELMISE @@ -35762,124 +30595,106 @@ static const u16 sDhelmiseTeachableLearnset[] = { static const u16 sJangmoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sHakamoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sKommoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_JANGMO_O @@ -35889,38 +30704,32 @@ static const u16 sTapuKokoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_KOKO @@ -35929,34 +30738,28 @@ static const u16 sTapuKokoTeachableLearnset[] = { static const u16 sTapuLeleTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_LELE @@ -35967,37 +30770,31 @@ static const u16 sTapuBuluTeachableLearnset[] = { MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MEGA_PUNCH, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_BULU @@ -36008,35 +30805,29 @@ static const u16 sTapuFiniTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAPU_FINI @@ -36051,44 +30842,38 @@ static const u16 sCosmoemTeachableLearnset[] = { }; static const u16 sSolgaleoTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -36097,107 +30882,89 @@ static const u16 sLunalaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_DREAM_EATER, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_DREAM_EATER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_COSMOG #if P_FAMILY_NIHILEGO static const u16 sNihilegoTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, + MOVE_SWAGGER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NIHILEGO #if P_FAMILY_BUZZWOLE static const u16 sBuzzwoleTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DOUBLE_TEAM, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BUZZWOLE @@ -36207,28 +30974,22 @@ static const u16 sPheromosaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PHEROMOSA @@ -36237,64 +30998,52 @@ static const u16 sPheromosaTeachableLearnset[] = { static const u16 sXurkitreeTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_XURKITREE #if P_FAMILY_CELESTEELA static const u16 sCelesteelaTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWAGGER, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CELESTEELA @@ -36306,57 +31055,45 @@ static const u16 sKartanaTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_TOXIC, MOVE_ENDURE, MOVE_FURY_CUTTER, - MOVE_MIMIC, + MOVE_GIGA_DRAIN, + MOVE_PROTECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KARTANA #if P_FAMILY_GUZZLORD static const u16 sGuzzlordTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHOCK_WAVE, - MOVE_SLUDGE_BOMB, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, + MOVE_SHOCK_WAVE, MOVE_SLEEP_TALK, + MOVE_SLUDGE_BOMB, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GUZZLORD @@ -36364,51 +31101,47 @@ static const u16 sGuzzlordTeachableLearnset[] = { #if P_FAMILY_NECROZMA static const u16 sNecrozmaTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NECROZMA #if P_FAMILY_MAGEARNA static const u16 sMagearnaTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -36416,25 +31149,17 @@ static const u16 sMagearnaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -36445,58 +31170,46 @@ static const u16 sMarshadowTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DOUBLE_TEAM, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SNATCH, - MOVE_THIEF, - MOVE_TOXIC, MOVE_COUNTER, + MOVE_DOUBLE_TEAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, + MOVE_SNATCH, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MARSHADOW #if P_FAMILY_POIPOLE static const u16 sPoipoleTeachableLearnset[] = { + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -36504,60 +31217,48 @@ static const u16 sNaganadelTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POIPOLE #if P_FAMILY_STAKATAKA static const u16 sStakatakaTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STAKATAKA @@ -36566,34 +31267,28 @@ static const u16 sStakatakaTeachableLearnset[] = { static const u16 sBlacephalonTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BLACEPHALON @@ -36605,87 +31300,69 @@ static const u16 sZeraoraTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SNATCH, + MOVE_SNORE, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZERAORA #if P_FAMILY_MELTAN static const u16 sMeltanTeachableLearnset[] = { + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMelmetalTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DYNAMIC_PUNCH, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MELTAN @@ -36693,95 +31370,77 @@ static const u16 sMelmetalTeachableLearnset[] = { #if P_FAMILY_GROOKEY static const u16 sGrookeyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sThwackeyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sRillaboomTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GROOKEY @@ -36789,87 +31448,69 @@ static const u16 sRillaboomTeachableLearnset[] = { #if P_FAMILY_SCORBUNNY static const u16 sScorbunnyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_OVERHEAT, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, + MOVE_FLAMETHROWER, MOVE_MEGA_KICK, - MOVE_MIMIC, + MOVE_OVERHEAT, + MOVE_PROTECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; static const u16 sRabootTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_OVERHEAT, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, + MOVE_FLAMETHROWER, MOVE_MEGA_KICK, - MOVE_MIMIC, + MOVE_OVERHEAT, + MOVE_PROTECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; static const u16 sCinderaceTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_FACADE, - MOVE_FIRE_BLAST, - MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_OVERHEAT, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SUNNY_DAY, - MOVE_TAUNT, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FIRE_BLAST, MOVE_FIRE_PUNCH, + MOVE_FLAMETHROWER, + MOVE_HYPER_BEAM, MOVE_MEGA_KICK, - MOVE_MIMIC, MOVE_MUD_SLAP, + MOVE_OVERHEAT, + MOVE_PROTECT, + MOVE_REST, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCORBUNNY @@ -36879,26 +31520,20 @@ static const u16 sSobbleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -36906,26 +31541,20 @@ static const u16 sDrizzileTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -36934,34 +31563,28 @@ static const u16 sInteleonTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, + MOVE_SWIFT, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SOBBLE @@ -36969,60 +31592,48 @@ static const u16 sInteleonTeachableLearnset[] = { #if P_FAMILY_SKWOVET static const u16 sSkwovetTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BULLET_SEED, - MOVE_DIG, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_THIEF, MOVE_BODY_SLAM, + MOVE_BULLET_SEED, MOVE_COUNTER, MOVE_DEFENSE_CURL, + MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_IRON_TAIL, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sGreedentTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_COUNTER, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SKWOVET @@ -37031,82 +31642,64 @@ static const u16 sGreedentTeachableLearnset[] = { static const u16 sRookideeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sCorvisquireTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sCorviknightTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULK_UP, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_STEEL_WING, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STEEL_WING, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROOKIDEE @@ -37119,52 +31712,40 @@ static const u16 sBlipbugTeachableLearnset[] = { static const u16 sDottlerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, }; static const u16 sOrbeetleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BLIPBUG @@ -37173,47 +31754,35 @@ static const u16 sOrbeetleTeachableLearnset[] = { static const u16 sNickitTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sThievulTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NICKIT @@ -37222,45 +31791,33 @@ static const u16 sThievulTeachableLearnset[] = { static const u16 sGossifleurTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sEldegossTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOSSIFLEUR @@ -37268,21 +31825,15 @@ static const u16 sEldegossTeachableLearnset[] = { #if P_FAMILY_WOOLOO static const u16 sWoolooTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_PROTECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -37290,24 +31841,18 @@ static const u16 sWoolooTeachableLearnset[] = { static const u16 sDubwoolTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_HYPER_BEAM, MOVE_MEGA_KICK, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, @@ -37318,60 +31863,48 @@ static const u16 sDubwoolTeachableLearnset[] = { #if P_FAMILY_CHEWTLE static const u16 sChewtleTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIVE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sDrednawTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWORDS_DANCE, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHEWTLE @@ -37380,23 +31913,17 @@ static const u16 sDrednawTeachableLearnset[] = { static const u16 sYamperTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -37405,24 +31932,18 @@ static const u16 sBoltundTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -37431,90 +31952,72 @@ static const u16 sBoltundTeachableLearnset[] = { #if P_FAMILY_ROLYCOLY static const u16 sRolycolyTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sCarkolTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sCoalossalTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROLYCOLY @@ -37531,107 +32034,83 @@ static const u16 sFlappleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sAppletunTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sDipplinTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sHydrappleTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -37640,50 +32119,38 @@ static const u16 sHydrappleTeachableLearnset[] = { #if P_FAMILY_SILICOBRA static const u16 sSilicobraTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sSandacondaTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SILICOBRA @@ -37694,27 +32161,21 @@ static const u16 sCramorantTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SURF, MOVE_THIEF, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CRAMORANT @@ -37724,24 +32185,18 @@ static const u16 sArrokudaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_DIVE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -37750,26 +32205,20 @@ static const u16 sBarraskewdaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_DIVE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARROKUDA @@ -37777,90 +32226,72 @@ static const u16 sBarraskewdaTeachableLearnset[] = { #if P_FAMILY_TOXEL static const u16 sToxelTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sToxtricityAmpedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FIRE_PUNCH, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sToxtricityLowKeyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_FIRE_PUNCH, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, + MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOXEL @@ -37868,46 +32299,34 @@ static const u16 sToxtricityLowKeyTeachableLearnset[] = { #if P_FAMILY_SIZZLIPEDE static const u16 sSizzlipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, MOVE_DEFENSE_CURL, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_PROTECT, + MOVE_REST, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sCentiskorchTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROLLOUT, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SIZZLIPEDE @@ -37915,58 +32334,46 @@ static const u16 sCentiskorchTeachableLearnset[] = { #if P_FAMILY_CLOBBOPUS static const u16 sClobbopusTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIVE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_WATERFALL, - MOVE_BODY_SLAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_ICE_PUNCH, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_TAUNT, + MOVE_WATERFALL, MOVE_UNAVAILABLE, }; static const u16 sGrapploctTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DIVE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_TAUNT, - MOVE_WATERFALL, - MOVE_BODY_SLAM, MOVE_ENDURE, + MOVE_FACADE, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, + MOVE_TAUNT, + MOVE_WATERFALL, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CLOBBOPUS @@ -37974,48 +32381,36 @@ static const u16 sGrapploctTeachableLearnset[] = { #if P_FAMILY_SINISTEA static const u16 sSinisteaTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sPolteageistTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SINISTEA @@ -38024,26 +32419,20 @@ static const u16 sPolteageistTeachableLearnset[] = { static const u16 sHatennaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -38052,26 +32441,20 @@ static const u16 sHatennaTeachableLearnset[] = { static const u16 sHattremTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -38080,28 +32463,22 @@ static const u16 sHattremTeachableLearnset[] = { static const u16 sHattereneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, @@ -38112,90 +32489,72 @@ static const u16 sHattereneTeachableLearnset[] = { #if P_FAMILY_IMPIDIMP static const u16 sImpidimpTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, MOVE_ENDURE, + MOVE_FACADE, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REFLECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, MOVE_UNAVAILABLE, }; static const u16 sMorgremTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, MOVE_ENDURE, + MOVE_FACADE, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REFLECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_WAVE, + MOVE_TORMENT, MOVE_UNAVAILABLE, }; static const u16 sGrimmsnarlTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TORMENT, - MOVE_BODY_SLAM, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, + MOVE_LIGHT_SCREEN, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REFLECT, + MOVE_REST, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_THIEF, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IMPIDIMP @@ -38203,73 +32562,55 @@ static const u16 sGrimmsnarlTeachableLearnset[] = { #if P_FAMILY_MILCERY static const u16 sMilceryTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sAlcremieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, MOVE_PSYCH_UP, + MOVE_REST, + MOVE_SAFEGUARD, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MILCERY #if P_FAMILY_FALINKS static const u16 sFalinksTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, MOVE_COUNTER, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_HYPER_BEAM, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -38278,25 +32619,19 @@ static const u16 sFalinksTeachableLearnset[] = { #if P_FAMILY_PINCURCHIN static const u16 sPincurchinTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -38305,19 +32640,13 @@ static const u16 sPincurchinTeachableLearnset[] = { #if P_FAMILY_SNOM static const u16 sSnomTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; @@ -38325,26 +32654,20 @@ static const u16 sFrosmothTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -38353,28 +32676,22 @@ static const u16 sFrosmothTeachableLearnset[] = { #if P_FAMILY_STONJOURNER static const u16 sStonjournerTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_STONJOURNER @@ -38383,31 +32700,25 @@ static const u16 sStonjournerTeachableLearnset[] = { static const u16 sEiscueTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_EISCUE @@ -38415,53 +32726,41 @@ static const u16 sEiscueTeachableLearnset[] = { #if P_FAMILY_INDEEDEE static const u16 sIndeedeeMTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sIndeedeeFTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -38472,28 +32771,22 @@ static const u16 sMorpekoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_TORMENT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_TORMENT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MORPEKO @@ -38501,65 +32794,53 @@ static const u16 sMorpekoTeachableLearnset[] = { #if P_FAMILY_CUFANT static const u16 sCufantTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sCopperajahTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_STRENGTH, - MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_STRENGTH, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CUFANT @@ -38567,34 +32848,28 @@ static const u16 sCopperajahTeachableLearnset[] = { #if P_FAMILY_DRACOZOLT static const u16 sDracozoltTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -38604,33 +32879,27 @@ static const u16 sDracozoltTeachableLearnset[] = { #if P_FAMILY_ARCTOZOLT static const u16 sArctozoltTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_IRON_TAIL, + MOVE_MEGA_KICK, + MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SURF, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -38639,28 +32908,22 @@ static const u16 sArctozoltTeachableLearnset[] = { #if P_FAMILY_DRACOVISH static const u16 sDracovishTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIVE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, + MOVE_WATERFALL, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRACOVISH @@ -38668,29 +32931,23 @@ static const u16 sDracovishTeachableLearnset[] = { #if P_FAMILY_ARCTOVISH static const u16 sArctovishTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_HAIL, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SURF, + MOVE_WATERFALL, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARCTOVISH @@ -38698,66 +32955,54 @@ static const u16 sArctovishTeachableLearnset[] = { #if P_FAMILY_DURALUDON static const u16 sDuraludonTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWORDS_DANCE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sArchaludonTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, + MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -38768,18 +33013,12 @@ static const u16 sArchaludonTeachableLearnset[] = { static const u16 sDreepyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -38788,70 +33027,58 @@ static const u16 sDreepyTeachableLearnset[] = { static const u16 sDrakloakTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDragapultTeachableLearnset[] = { MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -38859,23 +33086,17 @@ static const u16 sDragapultTeachableLearnset[] = { #if P_FAMILY_ZACIAN static const u16 sZacianTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, @@ -38884,11 +33105,11 @@ static const u16 sZacianTeachableLearnset[] = { #if P_FAMILY_ZAMAZENTA static const u16 sZamazentaTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -38896,19 +33117,13 @@ static const u16 sZamazentaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -38916,31 +33131,25 @@ static const u16 sZamazentaTeachableLearnset[] = { #if P_FAMILY_ETERNATUS static const u16 sEternatusTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SNORE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ETERNATUS @@ -38949,31 +33158,25 @@ static const u16 sEternatusTeachableLearnset[] = { static const u16 sKubfuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROCK_SMASH, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, @@ -38982,37 +33185,31 @@ static const u16 sKubfuTeachableLearnset[] = { static const u16 sUrshifuSingleStrikeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DIG, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -39020,40 +33217,34 @@ static const u16 sUrshifuSingleStrikeTeachableLearnset[] = { static const u16 sUrshifuRapidStrikeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_SMASH, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_WATERFALL, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_DYNAMIC_PUNCH, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, MOVE_ICE_PUNCH, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, + MOVE_WATERFALL, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KUBFU @@ -39061,68 +33252,56 @@ static const u16 sUrshifuRapidStrikeTeachableLearnset[] = { #if P_FAMILY_ZARUDE static const u16 sZarudeTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_IRON_TAIL, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_BODY_SLAM, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_FOCUS_PUNCH, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, + MOVE_IRON_TAIL, MOVE_MEGA_KICK, MOVE_MEGA_PUNCH, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZARUDE #if P_FAMILY_REGIELEKI static const u16 sRegielekiTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_THUNDER, - MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -39130,25 +33309,19 @@ static const u16 sRegielekiTeachableLearnset[] = { #if P_FAMILY_REGIDRAGO static const u16 sRegidragoTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -39157,54 +33330,42 @@ static const u16 sRegidragoTeachableLearnset[] = { #if P_FAMILY_GLASTRIER static const u16 sGlastrierTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_TORMENT, MOVE_BODY_SLAM, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, + MOVE_ROAR, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TORMENT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GLASTRIER #if P_FAMILY_SPECTRIER static const u16 sSpectrierTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, MOVE_SWIFT, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SPECTRIER @@ -39213,29 +33374,23 @@ static const u16 sSpectrierTeachableLearnset[] = { static const u16 sCalyrexTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -39243,75 +33398,63 @@ static const u16 sCalyrexTeachableLearnset[] = { #if P_FUSION_FORMS static const u16 sCalyrexIceTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HAIL, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_ICE_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_TORMENT, - MOVE_BODY_SLAM, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_GIGA_DRAIN, + MOVE_HAIL, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_REFLECT, + MOVE_REST, + MOVE_ROAR, + MOVE_SAFEGUARD, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_TORMENT, MOVE_UNAVAILABLE, }; static const u16 sCalyrexShadowTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SAFEGUARD, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_SOLAR_BEAM, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_BODY_SLAM, MOVE_DOUBLE_EDGE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_GIGA_DRAIN, + MOVE_HYPER_BEAM, + MOVE_LIGHT_SCREEN, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_REFLECT, + MOVE_REST, + MOVE_SAFEGUARD, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, MOVE_SNORE, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, MOVE_SWIFT, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FUSION_FORMS @@ -39319,29 +33462,23 @@ static const u16 sCalyrexShadowTeachableLearnset[] = { #if P_FAMILY_ENAMORUS static const u16 sEnamorusTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_TORMENT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ENAMORUS @@ -39349,44 +33486,32 @@ static const u16 sEnamorusTeachableLearnset[] = { #if P_FAMILY_SPRIGATITO static const u16 sSprigatitoTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_TAUNT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWIFT, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; static const u16 sFloragatoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_TAUNT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWIFT, + MOVE_TAUNT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -39396,27 +33521,21 @@ static const u16 sMeowscaradaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -39424,75 +33543,57 @@ static const u16 sMeowscaradaTeachableLearnset[] = { #if P_FAMILY_FUECOCO static const u16 sFuecocoTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sCrocalorTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sSkeledirgeTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FUECOCO @@ -39500,42 +33601,30 @@ static const u16 sSkeledirgeTeachableLearnset[] = { #if P_FAMILY_QUAXLY static const u16 sQuaxlyTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sQuaxwellTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -39543,172 +33632,130 @@ static const u16 sQuaquavalTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_TAUNT, - MOVE_WATER_PULSE, MOVE_COUNTER, MOVE_ENDURE, + MOVE_FACADE, + MOVE_HYPER_BEAM, MOVE_ICY_WIND, MOVE_MEGA_KICK, - MOVE_MIMIC, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_QUAXLY #if P_FAMILY_LECHONK static const u16 sLechonkTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sOinkologneTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_LECHONK #if P_FAMILY_TAROUNTULA static const u16 sTarountulaTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_COUNTER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sSpidopsTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TAROUNTULA #if P_FAMILY_NYMBLE static const u16 sNymbleTeachableLearnset[] = { + MOVE_COUNTER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sLokixTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_THIEF, MOVE_COUNTER, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_NYMBLE @@ -39716,47 +33763,35 @@ static const u16 sLokixTeachableLearnset[] = { #if P_FAMILY_PAWMI static const u16 sPawmiTeachableLearnset[] = { MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sPawmoTeachableLearnset[] = { MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -39766,30 +33801,24 @@ static const u16 sPawmotTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, + MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -39801,26 +33830,20 @@ static const u16 sTandemausTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -39828,76 +33851,58 @@ static const u16 sMausholdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, - MOVE_WATER_PULSE, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TANDEMAUS #if P_FAMILY_FIDOUGH static const u16 sFidoughTeachableLearnset[] = { - MOVE_DIG, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, MOVE_BODY_SLAM, + MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sDachsbunTeachableLearnset[] = { - MOVE_DIG, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, MOVE_BODY_SLAM, + MOVE_DIG, MOVE_DOUBLE_EDGE, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_HYPER_BEAM, MOVE_MUD_SLAP, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, + MOVE_ROAR, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FIDOUGH @@ -39905,66 +33910,48 @@ static const u16 sDachsbunTeachableLearnset[] = { #if P_FAMILY_SMOLIV static const u16 sSmolivTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sDollivTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sArbolivaTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_UNAVAILABLE, }; @@ -39973,103 +33960,79 @@ static const u16 sArbolivaTeachableLearnset[] = { #if P_FAMILY_SQUAWKABILLY static const u16 sSquawkabillyTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SQUAWKABILLY #if P_FAMILY_NACLI static const u16 sNacliTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sNaclstackTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROCK_SLIDE, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sGarganaclTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -40077,48 +34040,36 @@ static const u16 sGarganaclTeachableLearnset[] = { #if P_FAMILY_CHARCADET static const u16 sCharcadetTeachableLearnset[] = { + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sArmarougeTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; @@ -40126,77 +34077,59 @@ static const u16 sCeruledgeTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHARCADET #if P_FAMILY_TADBULB static const u16 sTadbulbTeachableLearnset[] = { - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ENDURE, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sBelliboltTeachableLearnset[] = { - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ENDURE, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TADBULB @@ -40204,43 +34137,31 @@ static const u16 sBelliboltTeachableLearnset[] = { #if P_FAMILY_WATTREL static const u16 sWattrelTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sKilowattrelTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -40248,51 +34169,39 @@ static const u16 sKilowattrelTeachableLearnset[] = { #if P_FAMILY_MASCHIFF static const u16 sMaschiffTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sMabosstiffTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MASCHIFF @@ -40300,57 +34209,45 @@ static const u16 sMabosstiffTeachableLearnset[] = { #if P_FAMILY_SHROODLE static const u16 sShroodleTeachableLearnset[] = { MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sGrafaiaiTeachableLearnset[] = { MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, + MOVE_SWAGGER, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SHROODLE @@ -40358,46 +34255,34 @@ static const u16 sGrafaiaiTeachableLearnset[] = { #if P_FAMILY_BRAMBLIN static const u16 sBramblinTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_THIEF, MOVE_DEFENSE_CURL, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_FACADE, + MOVE_GIGA_DRAIN, + MOVE_PROTECT, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sBrambleghastTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_DEFENSE_CURL, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROLLOUT, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_THIEF, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRAMBLIN @@ -40405,82 +34290,64 @@ static const u16 sBrambleghastTeachableLearnset[] = { #if P_FAMILY_TOEDSCOOL static const u16 sToedscoolTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_FRUSTRATION, + MOVE_ENDURE, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, + MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; static const u16 sToedscruelTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_FRUSTRATION, + MOVE_ENDURE, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, + MOVE_SWIFT, MOVE_TAUNT, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TOEDSCOOL #if P_FAMILY_KLAWF static const u16 sKlawfTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KLAWF @@ -40488,107 +34355,83 @@ static const u16 sKlawfTeachableLearnset[] = { #if P_FAMILY_CAPSAKID static const u16 sCapsakidTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sScovillainTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CAPSAKID #if P_FAMILY_RELLOR static const u16 sRellorTeachableLearnset[] = { + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_SLUDGE_BOMB, - MOVE_THIEF, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_ROLLOUT, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SLUDGE_BOMB, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sRabscaTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_DEFENSE_CURL, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RELLOR @@ -40596,137 +34439,107 @@ static const u16 sRabscaTeachableLearnset[] = { #if P_FAMILY_FLITTLE static const u16 sFlittleTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sEspathraTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SUNNY_DAY, - MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWIFT, + MOVE_THIEF, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLITTLE #if P_FAMILY_TINKATINK static const u16 sTinkatinkTeachableLearnset[] = { + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sTinkatuffTeachableLearnset[] = { MOVE_BRICK_BREAK, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sTinkatonTeachableLearnset[] = { MOVE_BRICK_BREAK, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_THIEF, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -40736,49 +34549,37 @@ static const u16 sTinkatonTeachableLearnset[] = { static const u16 sWiglettTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sWugtrioTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIG, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WIGLETT @@ -40786,29 +34587,23 @@ static const u16 sWugtrioTeachableLearnset[] = { #if P_FAMILY_BOMBIRDIER static const u16 sBombirdierTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BOMBIRDIER @@ -40816,116 +34611,92 @@ static const u16 sBombirdierTeachableLearnset[] = { #if P_FAMILY_FINIZEN static const u16 sFinizenTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_DIVE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_ICE_BEAM, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SURF, - MOVE_WATERFALL, - MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_COUNTER, + MOVE_DIVE, MOVE_ENDURE, + MOVE_FACADE, + MOVE_ICE_BEAM, MOVE_ICY_WIND, - MOVE_MIMIC, + MOVE_PROTECT, MOVE_PSYCH_UP, + MOVE_RAIN_DANCE, + MOVE_REST, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SURF, MOVE_SWIFT, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sPalafinTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIVE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SURF, + MOVE_SWIFT, MOVE_TAUNT, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FINIZEN #if P_FAMILY_VAROOM static const u16 sVaroomTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; static const u16 sRevavroomTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, + MOVE_SWAGGER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VAROOM @@ -40933,110 +34704,86 @@ static const u16 sRevavroomTeachableLearnset[] = { #if P_FAMILY_CYCLIZAR static const u16 sCyclizarTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CYCLIZAR #if P_FAMILY_ORTHWORM static const u16 sOrthwormTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ORTHWORM #if P_FAMILY_GLIMMET static const u16 sGlimmetTeachableLearnset[] = { + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sGlimmoraTeachableLearnset[] = { + MOVE_ENDURE, + MOVE_EXPLOSION, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GLIMMET @@ -41044,50 +34791,38 @@ static const u16 sGlimmoraTeachableLearnset[] = { #if P_FAMILY_GREAVARD static const u16 sGreavardTeachableLearnset[] = { MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; static const u16 sHoundstoneTeachableLearnset[] = { MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GREAVARD @@ -41097,25 +34832,19 @@ static const u16 sFlamigoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MEGA_KICK, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_WATER_PULSE, - MOVE_ENDURE, - MOVE_MEGA_KICK, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLAMIGO @@ -41123,50 +34852,38 @@ static const u16 sFlamigoTeachableLearnset[] = { #if P_FAMILY_CETODDLE static const u16 sCetoddleTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sCetitanTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CETODDLE @@ -41174,110 +34891,86 @@ static const u16 sCetitanTeachableLearnset[] = { #if P_FAMILY_VELUZA static const u16 sVeluzaTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_VELUZA #if P_FAMILY_DONDOZO static const u16 sDondozoTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIVE, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DONDOZO #if P_FAMILY_TATSUGIRI static const u16 sTatsugiriTeachableLearnset[] = { + MOVE_COUNTER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SURF, MOVE_TAUNT, MOVE_WATER_PULSE, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TATSUGIRI #if P_FAMILY_GREAT_TUSK static const u16 sGreatTuskTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DEFENSE_CURL, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_ROLLOUT, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GREAT_TUSK @@ -41285,69 +34978,57 @@ static const u16 sGreatTuskTeachableLearnset[] = { #if P_FAMILY_SCREAM_TAIL static const u16 sScreamTailTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SCREAM_TAIL #if P_FAMILY_BRUTE_BONNET static const u16 sBruteBonnetTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_BRUTE_BONNET @@ -41355,24 +35036,18 @@ static const u16 sBruteBonnetTeachableLearnset[] = { #if P_FAMILY_FLUTTER_MANE static const u16 sFlutterManeTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ENDURE, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -41381,54 +35056,42 @@ static const u16 sFlutterManeTeachableLearnset[] = { #if P_FAMILY_SLITHER_WING static const u16 sSlitherWingTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SLITHER_WING #if P_FAMILY_SANDY_SHOCKS static const u16 sSandyShocksTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWIFT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -41436,27 +35099,21 @@ static const u16 sSandyShocksTeachableLearnset[] = { #if P_FAMILY_IRON_TREADS static const u16 sIronTreadsTeachableLearnset[] = { - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_THUNDER, MOVE_BODY_SLAM, MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, - MOVE_MIMIC, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_HYPER_BEAM, MOVE_MUD_SLAP, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_ROLLOUT, + MOVE_SANDSTORM, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_THUNDER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_TREADS @@ -41464,59 +35121,47 @@ static const u16 sIronTreadsTeachableLearnset[] = { #if P_FAMILY_IRON_BUNDLE static const u16 sIronBundleTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_BUNDLE #if P_FAMILY_IRON_HANDS static const u16 sIronHandsTeachableLearnset[] = { - MOVE_BRICK_BREAK, - MOVE_EARTHQUAKE, - MOVE_FACADE, - MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, - MOVE_THUNDER, - MOVE_THUNDERBOLT, MOVE_BODY_SLAM, + MOVE_BRICK_BREAK, MOVE_DOUBLE_EDGE, + MOVE_EARTHQUAKE, MOVE_ENDURE, + MOVE_FACADE, MOVE_FIRE_PUNCH, + MOVE_FOCUS_PUNCH, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, MOVE_ROCK_SLIDE, + MOVE_ROCK_TOMB, MOVE_SEISMIC_TOSS, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_THUNDER, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_UNAVAILABLE, }; @@ -41524,55 +35169,43 @@ static const u16 sIronHandsTeachableLearnset[] = { #if P_FAMILY_IRON_JUGULIS static const u16 sIronJugulisTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_JUGULIS #if P_FAMILY_IRON_MOTH static const u16 sIronMothTeachableLearnset[] = { + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_MOTH @@ -41580,38 +35213,32 @@ static const u16 sIronMothTeachableLearnset[] = { #if P_FAMILY_IRON_THORNS static const u16 sIronThornsTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, + MOVE_FIRE_PUNCH, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWORDS_DANCE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -41621,23 +35248,17 @@ static const u16 sIronThornsTeachableLearnset[] = { #if P_FAMILY_FRIGIBAX static const u16 sFrigibaxTeachableLearnset[] = { MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_DIG, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -41645,24 +35266,18 @@ static const u16 sFrigibaxTeachableLearnset[] = { static const u16 sArctibaxTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -41670,27 +35285,21 @@ static const u16 sArctibaxTeachableLearnset[] = { static const u16 sBaxcaliburTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -41698,44 +35307,32 @@ static const u16 sBaxcaliburTeachableLearnset[] = { #if P_FAMILY_GIMMIGHOUL static const u16 sGimmighoulTeachableLearnset[] = { - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, + MOVE_ENDURE, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_THIEF, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sGholdengoTeachableLearnset[] = { + MOVE_ENDURE, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -41744,28 +35341,22 @@ static const u16 sGholdengoTeachableLearnset[] = { #if P_FAMILY_WO_CHIEN static const u16 sWoChienTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BULLET_SEED, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WO_CHIEN @@ -41775,61 +35366,48 @@ static const u16 sChienPaoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, MOVE_BRICK_BREAK, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHIEN_PAO #if P_FAMILY_TING_LU static const u16 sTingLuTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, + MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TING_LU #if P_FAMILY_CHI_YU static const u16 sChiYuTeachableLearnset[] = { + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -41837,15 +35415,10 @@ static const u16 sChiYuTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_SWAGGER, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_CHI_YU @@ -41853,31 +35426,25 @@ static const u16 sChiYuTeachableLearnset[] = { #if P_FAMILY_ROARING_MOON static const u16 sRoaringMoonTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_ROCK_SLIDE, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ROARING_MOON @@ -41888,32 +35455,26 @@ static const u16 sIronValiantTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_PSYCHIC, - MOVE_REFLECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SKILL_SWAP, - MOVE_TAUNT, - MOVE_THUNDERBOLT, MOVE_ENDURE, MOVE_FIRE_PUNCH, MOVE_FURY_CUTTER, + MOVE_HYPER_BEAM, MOVE_ICE_PUNCH, MOVE_ICY_WIND, + MOVE_LIGHT_SCREEN, MOVE_METRONOME, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_PSYCHIC, MOVE_PSYCH_UP, + MOVE_REFLECT, + MOVE_REST, + MOVE_SHADOW_BALL, + MOVE_SKILL_SWAP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THUNDERBOLT, MOVE_THUNDER_PUNCH, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, @@ -41922,66 +35483,54 @@ static const u16 sIronValiantTeachableLearnset[] = { #if P_FAMILY_KORAIDON static const u16 sKoraidonTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_MUD_SLAP, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_KORAIDON #if P_FAMILY_MIRAIDON static const u16 sMiraidonTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, + MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWORDS_DANCE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -41989,29 +35538,23 @@ static const u16 sMiraidonTeachableLearnset[] = { #if P_FAMILY_WALKING_WAKE static const u16 sWalkingWakeTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SUNNY_DAY, MOVE_SURF, + MOVE_SWIFT, MOVE_WATERFALL, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WALKING_WAKE @@ -42021,24 +35564,18 @@ static const u16 sIronLeavesTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SOLAR_BEAM, - MOVE_TAUNT, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_LEAVES @@ -42046,76 +35583,58 @@ static const u16 sIronLeavesTeachableLearnset[] = { #if P_FAMILY_POLTCHAGEIST static const u16 sPoltchageistTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_FRUSTRATION, + MOVE_ENDURE, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, }; static const u16 sSinistchaTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_FRUSTRATION, + MOVE_ENDURE, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, + MOVE_PSYCH_UP, MOVE_REFLECT, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, - MOVE_SOLAR_BEAM, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_PSYCH_UP, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_POLTCHAGEIST #if P_FAMILY_OKIDOGI static const u16 sOkidogiTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, + MOVE_COUNTER, MOVE_DIG, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, + MOVE_FIRE_PUNCH, MOVE_FOCUS_PUNCH, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICE_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, MOVE_TAUNT, MOVE_THIEF, - MOVE_TOXIC, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_FIRE_PUNCH, - MOVE_ICE_PUNCH, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_THUNDER_PUNCH, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_OKIDOGI @@ -42123,29 +35642,23 @@ static const u16 sOkidogiTeachableLearnset[] = { #if P_FAMILY_MUNKIDORI static const u16 sMunkidoriTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, + MOVE_METRONOME, + MOVE_MUD_SLAP, MOVE_PROTECT, MOVE_PSYCHIC, + MOVE_PSYCH_UP, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, MOVE_SHADOW_BALL, + MOVE_SLEEP_TALK, MOVE_SLUDGE_BOMB, + MOVE_SWIFT, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, - MOVE_ENDURE, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, - MOVE_SWIFT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MUNKIDORI @@ -42155,30 +35668,24 @@ static const u16 sFezandipitiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLY, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, + MOVE_ICY_WIND, MOVE_LIGHT_SCREEN, MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SLUDGE_BOMB, - MOVE_TAUNT, - MOVE_THIEF, - MOVE_TOXIC, - MOVE_ENDURE, - MOVE_ICY_WIND, - MOVE_MIMIC, MOVE_PSYCH_UP, + MOVE_REST, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SLUDGE_BOMB, MOVE_SWAGGER, MOVE_SWIFT, MOVE_SWORDS_DANCE, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FEZANDIPITI @@ -42187,82 +35694,64 @@ static const u16 sFezandipitiTeachableLearnset[] = { static const u16 sOgerponTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, + MOVE_COUNTER, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_COUNTER, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_OGERPON #if P_FAMILY_GOUGING_FIRE static const u16 sGougingFireTeachableLearnset[] = { + MOVE_BODY_SLAM, + MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, - MOVE_SUNNY_DAY, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GOUGING_FIRE #if P_FAMILY_RAGING_BOLT static const u16 sRagingBoltTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -42271,51 +35760,39 @@ static const u16 sRagingBoltTeachableLearnset[] = { #if P_FAMILY_IRON_BOULDER static const u16 sIronBoulderTeachableLearnset[] = { MOVE_AERIAL_ACE, + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, + MOVE_COUNTER, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SECRET_POWER, - MOVE_TAUNT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, + MOVE_TAUNT, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_BOULDER #if P_FAMILY_IRON_CROWN static const u16 sIronCrownTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, + MOVE_ENDURE, MOVE_FACADE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; @@ -42323,20 +35800,21 @@ static const u16 sIronCrownTeachableLearnset[] = { #if P_FAMILY_TERAPAGOS static const u16 sTerapagosTeachableLearnset[] = { + MOVE_BODY_SLAM, MOVE_CALM_MIND, + MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, + MOVE_ENDURE, MOVE_FACADE, MOVE_FLAMETHROWER, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_RETURN, MOVE_ROAR, - MOVE_SECRET_POWER, + MOVE_ROCK_SLIDE, + MOVE_SLEEP_TALK, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, @@ -42344,68 +35822,21 @@ static const u16 sTerapagosTeachableLearnset[] = { MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_WATER_PULSE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_ENDURE, - MOVE_MIMIC, - MOVE_ROCK_SLIDE, - MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TERAPAGOS #if P_FAMILY_PECHARUNT static const u16 sPecharuntTeachableLearnset[] = { - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_PROTECT, - MOVE_REST, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SHADOW_BALL, - MOVE_SLUDGE_BOMB, - MOVE_TOXIC, MOVE_DEFENSE_CURL, MOVE_ENDURE, - MOVE_MIMIC, + MOVE_PROTECT, + MOVE_REST, MOVE_ROLLOUT, + MOVE_SHADOW_BALL, MOVE_SLEEP_TALK, - MOVE_SUBSTITUTE, + MOVE_SLUDGE_BOMB, + MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PECHARUNT - -const u16 gTutorMoves[] = { - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DEFENSE_CURL, - MOVE_DOUBLE_EDGE, - MOVE_DREAM_EATER, - MOVE_DYNAMIC_PUNCH, - MOVE_ENDURE, - MOVE_EXPLOSION, - MOVE_FIRE_PUNCH, - MOVE_FURY_CUTTER, - MOVE_ICE_PUNCH, - MOVE_ICY_WIND, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, - MOVE_MIMIC, - MOVE_MUD_SLAP, - MOVE_PSYCH_UP, - MOVE_ROCK_SLIDE, - MOVE_ROLLOUT, - MOVE_SEISMIC_TOSS, - MOVE_SLEEP_TALK, - MOVE_SNORE, - MOVE_SOFT_BOILED, - MOVE_SUBSTITUTE, - MOVE_SWAGGER, - MOVE_SWIFT, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_PUNCH, - MOVE_THUNDER_WAVE, - MOVE_UNAVAILABLE, -}; diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 26484e0231..9a28f13a54 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -290,6 +290,9 @@ static EWRAM_DATA u16 sLastSelectedPokemon = 0; static EWRAM_DATA u8 sPokeBallRotation = 0; static EWRAM_DATA struct PokedexListItem *sPokedexListItem = NULL; //Pokedex Plus HGSS_Ui +#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_ALL_MACHINES) +EWRAM_DATA static u16 sStatsMoves[MOVES_COUNT_TOTAL] = {0}; +EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_ALL_MACHINES] = {0}; struct SearchOptionText @@ -406,7 +409,8 @@ struct PokedexView u8 categoryIconSpriteId; //Physical/Special/Status category u8 numEggMoves; u8 numLevelUpMoves; - u8 numTeachableMoves; + u8 numTMHMMoves; + u8 numTutorMoves; u8 numPreEvolutions; struct PokemonStats sPokemonStats; struct EvoScreenData sEvoScreenData; @@ -4867,7 +4871,7 @@ static void Task_LoadStatsScreen(u8 taskId) sPokedexView->movesTotal = 0; sPokedexView->numEggMoves = 0; sPokedexView->numLevelUpMoves = 0; - sPokedexView->numTeachableMoves = 0; + sPokedexView->numTMHMMoves = 0; if (CalculateMoves()) gMain.state++; break; @@ -5055,15 +5059,87 @@ static void PrintStatsScreen_DestroyMoveItemIcon(u8 taskId) DestroySprite(&gSprites[gTasks[taskId].data[3]]); //Destroy item icon } +static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *numTutorMoves) +{ + u16 i, move; + bool8 isTMMove[MOVES_COUNT] = {0}; + const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); + + // TM Moves + if (HGSS_SORT_TMS_BY_NUM) + { + for (i = 0; i < NUM_ALL_MACHINES; i++) + { + move = GetTMHMMoveId(i + 1); + if (move != MOVE_NONE && CanLearnTeachableMove(species, move)) + { + isTMMove[move] = TRUE; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(i + 1); + (*numTMHMMoves)++; + sStatsMoves[movesTotal] = move; + movesTotal++; + } + } + } + else + { + for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) + { + move = teachableLearnset[i]; + for (u16 j = 0; j < NUM_ALL_MACHINES; j++) + { + if (GetTMHMMoveId(j + 1) == move) + { + isTMMove[move] = TRUE; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(j + 1); + (*numTMHMMoves)++; + sStatsMoves[movesTotal] = move; + movesTotal++; + break; + } + } + } + } + + // Tutor Moves +#if P_TUTOR_MOVES_ARRAY + for (i = 0; gTutorMoves[i] != MOVE_UNAVAILABLE; i++) + { + move = gTutorMoves[i]; + if (!isTMMove[move] && CanLearnTeachableMove(species, move)) + { + sStatsMoves[movesTotal] = move; + movesTotal++; + (*numTutorMoves)++; + } + } +#else + for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) + { + move = teachableLearnset[i]; + if (!isTMMove[move] && CanLearnTeachableMove(species, move)) + { + sStatsMoves[movesTotal] = move; + movesTotal++; + (*numTutorMoves)++; + } + } +#endif + return movesTotal; +} + static bool8 CalculateMoves(void) { u16 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); u16 statsMovesEgg[EGG_MOVES_ARRAY_COUNT] = {0}; + u16 statsMovesLevelUp[MAX_LEVEL_UP_MOVES] = {0}; u8 numEggMoves = 0; u8 numLevelUpMoves = 0; - u8 numTeachableMoves = 0; + u8 numTMHMMoves = 0; + u8 numTutorMoves = 0; + u16 movesTotal = 0; u8 i; // Mega and Gmax Pokémon don't have distinct learnsets from their base form; so use base species for calculation @@ -5085,98 +5161,57 @@ static bool8 CalculateMoves(void) numEggMoves = GetEggMovesBySpecies(species, statsMovesEgg); } + for (i = 0; i < numEggMoves; i++) + { + sStatsMoves[movesTotal] = statsMovesEgg[i]; + movesTotal++; + } + // Level up moves - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - for (i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) - numLevelUpMoves++; + numLevelUpMoves = GetLevelUpMovesBySpecies(species, statsMovesLevelUp); + for (i = 0; i < numLevelUpMoves; i++) + { + sStatsMoves[movesTotal] = statsMovesLevelUp[i]; + movesTotal++; + } // TM and Tutor moves - const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); - for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) - numTeachableMoves++; + movesTotal = AddTMTutorMoves(species, movesTotal, &numTMHMMoves, &numTutorMoves); sPokedexView->numEggMoves = numEggMoves; sPokedexView->numLevelUpMoves = numLevelUpMoves; - sPokedexView->numTeachableMoves = numTeachableMoves; - sPokedexView->movesTotal = (numEggMoves + numLevelUpMoves + numTeachableMoves); + sPokedexView->numTMHMMoves = numTMHMMoves; + sPokedexView->numTutorMoves = numTutorMoves; + sPokedexView->movesTotal = movesTotal; return TRUE; } -static u16 GetSelectedMove(u32 species, u32 selected) -{ - if (selected < sPokedexView->numEggMoves) - { - if (!HGSS_SHOW_EGG_MOVES_FOR_EVOS) - return GetSpeciesEggMoves(species)[selected]; - u16 preSpecies = species; - while (GetSpeciesPreEvolution(preSpecies) != SPECIES_NONE) - preSpecies = GetSpeciesPreEvolution(preSpecies); - return GetSpeciesEggMoves(preSpecies)[selected]; - } - selected -= sPokedexView->numEggMoves; - if (selected < sPokedexView->numLevelUpMoves) - return GetSpeciesLevelUpLearnset(species)[selected].move; - selected -= sPokedexView->numLevelUpMoves; - if (selected < sPokedexView->numTeachableMoves) - return GetSpeciesTeachableLearnset(species)[selected]; - return MOVE_NONE; //It should never get here but it allows us to visually see errors -} - static void PrintStatsScreen_Moves_Top(u8 taskId) { + u8 numEggMoves = sPokedexView->numEggMoves; + u8 numLevelUpMoves = sPokedexView->numLevelUpMoves; + u8 numTMHMMoves = sPokedexView->numTMHMMoves; + u8 numTutorMoves = sPokedexView->numTutorMoves; + u16 movesTotal = sPokedexView->movesTotal; + u16 selected = sPokedexView->moveSelected; + u8 level; u8 moves_x = 5; u8 moves_y = 3; + u16 move; + u16 item; + + u16 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); + + //Move + move = sStatsMoves[selected]; - u32 item = ITEM_MASTER_BALL; - u32 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); - u32 selected = sPokedexView->moveSelected; - u32 move = GetSelectedMove(species, selected); //Moves selected from move max ConvertIntToDecimalStringN(gStringVar1, (selected+1), STR_CONV_MODE_RIGHT_ALIGN, 3); - ConvertIntToDecimalStringN(gStringVar2, sPokedexView->movesTotal, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, movesTotal, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar1, sText_Stats_MoveSelectedMax); PrintStatsScreenTextSmallWhite(WIN_STATS_MOVES_TOP, gStringVar1, moves_x-1, moves_y+1); - //Calculate and retrieve correct move from the arrays - if (selected < sPokedexView->numEggMoves) - { - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); - item = ITEM_LUCKY_EGG; - } - else if (selected < (sPokedexView->numLevelUpMoves + sPokedexView->numEggMoves)) - { - u32 level = GetSpeciesLevelUpLearnset(species)[selected - sPokedexView->numEggMoves].level; - ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEFT_ALIGN, 3); //Move learn lvl - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, sText_Stats_MoveLevel, moves_x + 113, moves_y + 3); //Level text - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 14); //Print level - item = ITEM_RARE_CANDY; - } - else if (move) - { - u32 TMHMItemId = ITEM_NONE; - for (u32 i = 0; i < NUM_ALL_MACHINES; i++) - { - if (move == GetTMHMMoveId(i + 1)) - TMHMItemId = GetTMHMItemId(i + 1); - } - if (TMHMItemId) - { - CopyItemName(TMHMItemId, gStringVar1); //TM name - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 9); - item = TMHMItemId; - } - else - { - PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); - item = ITEM_TEACHY_TV; - } - } - else - { - StringCopy(gStringVar4, gText_CommunicationError); - } - //Move name StringCopy(gStringVar3, GetMoveName(move)); StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 20); @@ -5194,6 +5229,37 @@ static void PrintStatsScreen_Moves_Top(u8 taskId) SetSpriteInvisibility(0, TRUE); } + //Calculate and retrieve correct move from the arrays + if (selected < numEggMoves) + { + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); + item = ITEM_LUCKY_EGG; + } + else if (selected < (numEggMoves + numLevelUpMoves)) + { + level = GetSpeciesLevelUpLearnset(species)[(selected-numEggMoves)].level; + ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEFT_ALIGN, 3); //Move learn lvl + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, sText_Stats_MoveLevel, moves_x + 113, moves_y + 3); //Level text + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 14); //Print level + item = ITEM_RARE_CANDY; + } + else if (selected < (numEggMoves + numLevelUpMoves + numTMHMMoves)) + { + CopyItemName(sStatsMovesTMHM_ID[(selected-numEggMoves-numLevelUpMoves)], gStringVar1); //TM name + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gStringVar1, moves_x + 113, moves_y + 9); + item = sStatsMovesTMHM_ID[(selected-numEggMoves-numLevelUpMoves)]; + } + else if (selected < (numEggMoves + numLevelUpMoves + numTMHMMoves + numTutorMoves)) + { + PrintStatsScreenTextSmall(WIN_STATS_MOVES_TOP, gText_ThreeDashes, moves_x + 113, moves_y + 9); + item = ITEM_TEACHY_TV; + } + else + { + StringCopy(gStringVar4, gText_CommunicationError); + item = ITEM_MASTER_BALL; + } + //Egg/TM/Level/Tutor Item Icon gTasks[taskId].data[3] = AddItemIconSprite(ITEM_TAG, ITEM_TAG, item); gSprites[gTasks[taskId].data[3]].x2 = 203; @@ -5204,11 +5270,13 @@ static void PrintStatsScreen_Moves_Top(u8 taskId) static void PrintStatsScreen_Moves_Description(u8 taskId) { + u16 selected = sPokedexView->moveSelected; + u16 move; u8 moves_x = 5; u8 moves_y = 5; - u32 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); - u32 move = GetSelectedMove(species, sPokedexView->moveSelected); + //Move + move = sStatsMoves[selected]; //Move description if (gTasks[taskId].data[5] == 0) @@ -5227,7 +5295,6 @@ static void PrintStatsScreen_Moves_BottomText(u8 taskId) { u8 moves_x = 8; u8 moves_y = 3; - if (gTasks[taskId].data[5] == 0) { PrintStatsScreenTextSmall(WIN_STATS_MOVES_BOTTOM, gText_Power, moves_x, moves_y); @@ -5244,14 +5311,15 @@ static void PrintStatsScreen_Moves_Bottom(u8 taskId) { u8 moves_x = 8; u8 moves_y = 3; - + u8 selected = sPokedexView->moveSelected; + u16 move; //Contest u8 contest_effectValue; u8 contest_appeal = 0; u8 contest_jam = 0; - u32 species = NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum); - u32 move = GetSelectedMove(species, sPokedexView->moveSelected); + //Move + move = sStatsMoves[selected]; //Power + Accuracy if (gTasks[taskId].data[5] == 0) diff --git a/src/pokemon.c b/src/pokemon.c index e241cf3d03..08ca51ee65 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -95,6 +95,9 @@ EWRAM_DATA static u8 sTriedEvolving = 0; EWRAM_DATA u16 gFollowerSteps = 0; #include "data/abilities.h" +#if P_TUTOR_MOVES_ARRAY +#include "data/tutor_moves.h" +#endif // P_TUTOR_MOVES_ARRAY // Used in an unreferenced function in RS. // Unreferenced here and in FRLG. @@ -5578,17 +5581,89 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon) } } +static const u16 sUniversalMoves[] = +{ + MOVE_BIDE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, + MOVE_MIMIC, + MOVE_NATURAL_GIFT, + MOVE_RAGE, + MOVE_RETURN, + MOVE_SECRET_POWER, + MOVE_SUBSTITUTE, + MOVE_TERA_BLAST, +}; + u8 CanLearnTeachableMove(u16 species, u16 move) { - const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); if (species == SPECIES_EGG) - return FALSE; - for (u32 i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) { - if (teachableLearnset[i] == move) - return TRUE; + return FALSE; + } + else if (species == SPECIES_MEW) + { + switch (move) + { + case MOVE_BADDY_BAD: + case MOVE_BOUNCY_BUBBLE: + case MOVE_BUZZY_BUZZ: + case MOVE_DRAGON_ASCENT: + case MOVE_FLOATY_FALL: + case MOVE_FREEZY_FROST: + case MOVE_GLITZY_GLOW: + case MOVE_RELIC_SONG: + case MOVE_SAPPY_SEED: + case MOVE_SECRET_SWORD: + case MOVE_SIZZLY_SLIDE: + case MOVE_SPARKLY_SWIRL: + case MOVE_SPLISHY_SPLASH: + case MOVE_VOLT_TACKLE: + case MOVE_ZIPPY_ZAP: + return FALSE; + default: + return TRUE; + } + } + else + { + u32 i, j; + const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); + for (i = 0; i < ARRAY_COUNT(sUniversalMoves); i++) + { + if (sUniversalMoves[i] == move) + { + if (!gSpeciesInfo[species].tmIlliterate) + { + if (move == MOVE_TERA_BLAST && GET_BASE_SPECIES_ID(species) == SPECIES_TERAPAGOS) + return FALSE; + if (GET_BASE_SPECIES_ID(species) == SPECIES_PYUKUMUKU && (move == MOVE_HIDDEN_POWER || move == MOVE_RETURN || move == MOVE_FRUSTRATION)) + return FALSE; + return TRUE; + } + else + { + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + + if (P_TM_LITERACY < GEN_6) + return FALSE; + + for (j = 0; j < MAX_LEVEL_UP_MOVES && learnset[j].move != LEVEL_UP_MOVE_END; j++) + { + if (learnset[j].move == move) + return TRUE; + } + return FALSE; + } + } + } + for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) + { + if (teachableLearnset[i] == move) + return TRUE; + } + return FALSE; } - return FALSE; } u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) diff --git a/tools/learnset_helpers/make_teachables.py b/tools/learnset_helpers/make_teachables.py index d8c79adf94..6f3b186b68 100644 --- a/tools/learnset_helpers/make_teachables.py +++ b/tools/learnset_helpers/make_teachables.py @@ -33,14 +33,14 @@ import typing CONFIG_ENABLED_PAT = re.compile(r"#define P_LEARNSET_HELPER_TEACHABLE\s+(?P[^ ]*)") -ALPHABETICAL_ORDER_ENABLED_PAT = re.compile(r"#define HGSS_SORT_TMS_BY_NUM\s+(?P[^ ]*)") -TM_LITTERACY_PAT = re.compile(r"#define P_TM_LITERACY\s+GEN_(?P[^ ]*)") +INCFILE_HAS_TUTOR_PAT = re.compile(r"special ChooseMonForMoveTutor") +INCFILE_MOVE_PAT = re.compile(r"setvar VAR_0x8005, (MOVE_.*)") TMHM_MACRO_PAT = re.compile(r"F\((\w+)\)") +UNIVERSAL_MOVES_PAT = re.compile(r"static const u16 sUniversalMoves\[\]\s*=\s*{((.|\n)*?)\n};") TEACHABLE_ARRAY_DECL_PAT = re.compile(r"(?Pstatic const u16 s(?P\w+)TeachableLearnset\[\]) = {[\s\S]*?};") -MOVE_TUTOR_ARRAY_DECL_PAT = re.compile(r"(?Pconst u16 gTutorMoves\[\] = {)[\s\S]*? MOVE_UNAVAILABLE,") SNAKIFY_PAT = re.compile(r"(?!^)([A-Z]+)") -TUTOR_ARRAY_ENABLED_PAT = re.compile(r"#define\s+POKEDEX_PLUS_HGSS\s+(?P[^ ]*)") -POKEMON_TEACHING_TYPE_PAT = re.compile(r"\{[\s\S]*?(.teachingType\s*=\s*(?P[A-Z_]+),[\s\S]*?)?\.teachableLearnset\s*=\s*s(?P\w+?)TeachableLearnset[\s\S]*?\}") +TUTOR_ARRAY_ENABLED_PAT = re.compile(r"#define\s+P_TUTOR_MOVES_ARRAY\s+(?P[^ ]*)") + def enabled() -> bool: """ @@ -51,6 +51,22 @@ def enabled() -> bool: cfg_defined = CONFIG_ENABLED_PAT.search(cfg_pokemon) return cfg_defined is not None and cfg_defined.group("cfg_val") in ("TRUE", "1") + +def extract_repo_tutors() -> typing.Generator[str, None, None]: + """ + Yield MOVE constants which are *likely* assigned to a move tutor. This isn't + foolproof, but it's suitable. + """ + for inc_fname in chain(glob.glob("./data/scripts/*.inc"), glob.glob("./data/maps/*/scripts.inc")): + with open(inc_fname, "r") as inc_fp: + incfile = inc_fp.read() + if not INCFILE_HAS_TUTOR_PAT.search(incfile): + continue + + for move in INCFILE_MOVE_PAT.finditer(incfile): + yield move.group(1) + + def extract_repo_tms() -> typing.Generator[str, None, None]: """ Yield MOVE constants assigned to a TM or HM in the user's repo. @@ -64,37 +80,22 @@ def extract_repo_tms() -> typing.Generator[str, None, None]: for match in match_it: yield f"MOVE_{match.group(1)}" -def extract_repo_teaching_types() -> dict[str, str]: - species_teaching_types = {} - for families_fname in sorted(glob.glob("src/data/pokemon/species_info/gen_*_families.h")): - with open(families_fname, "r") as family_fp: - family_file = family_fp.read() - for pokemon in POKEMON_TEACHING_TYPE_PAT.finditer(family_file): - if pokemon.group("teaching_type"): - species_teaching_types[pokemon.group("name")] = pokemon.group("teaching_type") - else: - species_teaching_types[pokemon.group("name")] = "DEFAULT_LEARNING" - return species_teaching_types -def extract_tm_litteracy_config() -> bool: - config = False - with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: - cfg_pokemon = cfg_pokemon_fp.read() - cfg_defined = TM_LITTERACY_PAT.search(cfg_pokemon) - if cfg_defined: - cfg_val = cfg_defined.group("cfg_val") - if ((cfg_val == "LATEST") or (int(cfg_val) > 6)): - config = True - return config +def extract_repo_universals() -> list[str]: + """ + Return a list of MOVE constants which are deemed to be universal and can + thus be learned by any species. + """ + with open("./src/pokemon.c", "r") as pokemon_fp: + if match := UNIVERSAL_MOVES_PAT.search(pokemon_fp.read()): + return list(filter(lambda s: s, map(lambda s: s.strip(), match.group(1).split(',')))) + return list() -def prepare_output(all_learnables: dict[str, set[str]], tms: list[str], tutors: list[str], special_movesets, header: str) -> str: + +def prepare_output(all_learnables: dict[str, set[str]], repo_teachables: set[str], header: str) -> str: """ Build the file content for teachable_learnsets.h. """ - - repo_teaching_types = extract_repo_teaching_types() - tm_litteracy_config = extract_tm_litteracy_config() - with open("./src/data/pokemon/teachable_learnsets.h", "r") as teachables_fp: old = teachables_fp.read() @@ -114,22 +115,13 @@ def prepare_output(all_learnables: dict[str, set[str]], tms: list[str], tutors: cursor = match_e + 1 continue - if repo_teaching_types[species.group("name")] == "ALL_TEACHABLES": - learnables = filter(lambda m: m not in special_movesets["signatureTeachables"], tms + tutors) - elif repo_teaching_types[species.group("name")] == "TM_ILLITERATE": - learnables = all_learnables[species_upper] - if not tm_litteracy_config: - learnables = filter(lambda m: m not in special_movesets["universalMoves"], learnables) - else: - learnables = all_learnables[species_upper] + special_movesets["universalMoves"] + if species_upper == "MEW": + new += old[cursor:match_e + 1] # copy the original content and skip. + cursor = match_e + 1 + continue - part1 = list(filter(lambda m: m in learnables, tms)) - part2 = list(filter(lambda m: m in learnables, tutors)) - repo_species_teachables = part1 + part2 - if species_upper == "TERAPAGOS": - repo_species_teachables = filter(lambda m: m != "MOVE_TERA_BLAST", repo_species_teachables) + repo_species_teachables = filter(lambda m: m in repo_teachables, all_learnables[species_upper]) - repo_species_teachables = list(dict.fromkeys(repo_species_teachables)) new += old[cursor:match_b] new += "\n".join([ f"{species.group('decl')} = {{", @@ -138,23 +130,39 @@ def prepare_output(all_learnables: dict[str, set[str]], tms: list[str], tutors: ]) cursor = match_e + 1 - tutors_array = MOVE_TUTOR_ARRAY_DECL_PAT.search(old) - match_b, match_e = tutors_array.span() - new += old[cursor:match_b] - new += "\n".join([ - f"{tutors_array.group('decl')}", - f" {joinpat.join(chain(sorted(tutors)))}," - f"\n MOVE_UNAVAILABLE,\n" - ]) - cursor = match_e + 1 - new += old[cursor:] return new +def create_tutor_moves_array(tutors: list[str]) -> None: + """ + Generate gTutorMoves[] if P_TUTOR_MOVES_ARRAY is enabled. + """ + # Check if the config is enabled + with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = TUTOR_ARRAY_ENABLED_PAT.search(cfg_pokemon) + if not (cfg_defined and cfg_defined.group("cfg_val") in ("TRUE", "1")): + return + + # If enabled, generate the tutor moves array + header = dedent("""\ + // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py + // Set the config P_TUTOR_MOVES_ARRAY in include/config/pokemon.h to TRUE to enable this array! + + const u16 gTutorMoves[] = { + """) + + lines = [f" {move}," for move in sorted(tutors)] + lines.append(" MOVE_UNAVAILABLE\n};\n") + + with open("./src/data/tutor_moves.h", "w") as f: + f.write(header + "\n".join(lines)) + + def prepare_header(h_align: int, tmshms: list[str], tutors: list[str], universals: list[str]) -> str: - universals_title = "Near-universal moves found in data/special_movesets.json:" + universals_title = "Near-universal moves found from sUniversalMoves:" tmhm_title = "TM/HM moves found in \"include/constants/tms_hms.h\":" tutor_title = "Tutor moves found from map scripts:" h_align = max(h_align, len(universals_title), len(tmhm_title), len(tutor_title)) @@ -196,38 +204,30 @@ def main(): quit(1) SOURCE_LEARNSETS_JSON = pathlib.Path(sys.argv[1]) - SOURCE_TUTORS_JSON = pathlib.Path(sys.argv[2]) assert SOURCE_LEARNSETS_JSON.exists(), f"{SOURCE_LEARNSETS_JSON=} does not exist" assert SOURCE_LEARNSETS_JSON.is_file(), f"{SOURCE_LEARNSETS_JSON=} is not a file" - assert SOURCE_TUTORS_JSON.exists(), f"{SOURCE_TUTORS_JSON=} does not exist" - assert SOURCE_TUTORS_JSON.is_file(), f"{SOURCE_TUTORS_JSON=} is not a file" - + repo_universals = extract_repo_universals() repo_tms = list(extract_repo_tms()) - order_alphabetically = False + repo_tutors = list(extract_repo_tutors()) + repo_teachables = set(filter( + lambda move: move not in set(repo_universals), + chain(repo_tms, repo_tutors) + )) - with open("./include/config/pokedex_plus_hgss.h", "r") as cfg_pokemon_fp: - cfg_pokemon = cfg_pokemon_fp.read() - cfg_defined = ALPHABETICAL_ORDER_ENABLED_PAT.search(cfg_pokemon) - if cfg_defined is None or cfg_defined.group("cfg_val") in ("FALSE", "0"): - repo_tms = sorted(repo_tms) + create_tutor_moves_array(repo_tutors) - with open(SOURCE_TUTORS_JSON, "r") as fp: - repo_tutors = json.load(fp) - - with open("src/data/pokemon/special_movesets.json", "r") as file: - special_movesets = json.load(file) - - h_align = max(map(lambda move: len(move), chain(special_movesets["universalMoves"], repo_tms, repo_tutors))) + 2 - header = prepare_header(h_align, repo_tms, repo_tutors, special_movesets["universalMoves"]) + h_align = max(map(lambda move: len(move), chain(repo_universals, repo_teachables))) + 2 + header = prepare_header(h_align, repo_tms, repo_tutors, repo_universals) with open(SOURCE_LEARNSETS_JSON, "r") as source_fp: all_learnables = json.load(source_fp) - content = prepare_output(all_learnables, repo_tms, repo_tutors, special_movesets, header) + content = prepare_output(all_learnables, repo_teachables, header) with open("./src/data/pokemon/teachable_learnsets.h", "w") as teachables_fp: teachables_fp.write(content) + if __name__ == "__main__": main() diff --git a/tools/learnset_helpers/make_tutors.py b/tools/learnset_helpers/make_tutors.py deleted file mode 100644 index 2ef3790dd8..0000000000 --- a/tools/learnset_helpers/make_tutors.py +++ /dev/null @@ -1,68 +0,0 @@ -from itertools import chain - -import glob -import json -import pathlib -import re -import sys -import typing - -CONFIG_ENABLED_PAT = re.compile(r"#define P_LEARNSET_HELPER_TEACHABLE\s+(?P[^ ]*)") -INCFILE_HAS_TUTOR_PAT = re.compile(r"special ChooseMonForMoveTutor") -INCFILE_MOVE_PAT = re.compile(r"setvar VAR_0x8005, (MOVE_.*)") - -def enabled() -> bool: - """ - Check if the user has explicitly enabled this opt-in helper. - """ - with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: - cfg_pokemon = cfg_pokemon_fp.read() - cfg_defined = CONFIG_ENABLED_PAT.search(cfg_pokemon) - return cfg_defined is not None and cfg_defined.group("cfg_val") in ("TRUE", "1") - -def extract_repo_tutors() -> typing.Generator[str, None, None]: - """ - Yield MOVE constants which are *likely* assigned to a move tutor. This isn't - foolproof, but it's suitable. - """ - for inc_fname in chain(glob.glob("./data/scripts/*.inc"), glob.glob("./data/maps/*/scripts.inc")): - with open(inc_fname, "r") as inc_fp: - incfile = inc_fp.read() - if not INCFILE_HAS_TUTOR_PAT.search(incfile): - continue - - for move in INCFILE_MOVE_PAT.finditer(incfile): - yield move.group(1) - - -def dump_output(file, data): - with open(file, "w") as fp: - fp.write(data) - -def main(): - if not enabled(): - quit() - - if len(sys.argv) < 2: - print("Missing required arguments", file=sys.stderr) - print(__doc__, file=sys.stderr) - quit(1) - - OUTPUT_FILE = pathlib.Path(sys.argv[1]) - - assert OUTPUT_FILE.parent.exists(), f"parent of {OUTPUT_FILE=} does not exist" - - new_tutors = json.dumps(sorted(list(extract_repo_tutors())), indent=2) - if OUTPUT_FILE.exists() and OUTPUT_FILE.is_file(): - with open(OUTPUT_FILE, "r") as fp: - old_tutors = fp.read() - else: - dump_output(OUTPUT_FILE, new_tutors) - return - - if new_tutors != old_tutors: - dump_output(OUTPUT_FILE, new_tutors) - - -if __name__ == "__main__": - main() From fb660061abf9c2d669c4e43114dfc6f02b336a6f Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Thu, 23 Oct 2025 18:06:29 +0200 Subject: [PATCH 090/183] Converts some defines to enums and name unnamed enums (#8019) --- include/battle_anim.h | 3 +- include/battle_setup.h | 7 +- include/battle_transition.h | 9 ++- include/battle_util.h | 9 ++- include/constants/field_specials.h | 120 +++++++++++++++++------------ include/field_specials.h | 2 +- src/battle_anim_status_effects.c | 2 +- src/battle_anim_utility_funcs.c | 2 +- src/battle_setup.c | 19 +++-- src/battle_transition.c | 2 +- src/battle_util.c | 18 ++--- src/field_special_scene.c | 4 +- src/field_specials.c | 29 ++++--- 13 files changed, 130 insertions(+), 96 deletions(-) diff --git a/include/battle_anim.h b/include/battle_anim.h index 7cef5445da..2c8631e899 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -211,7 +211,8 @@ u8 GetSubstituteSpriteDefault_Y(u8 battler); #define STAT_ANIM_MULTIPLE_MINUS1 57 #define STAT_ANIM_MULTIPLE_MINUS2 58 -enum { +enum StatAnimPal +{ STAT_ANIM_PAL_ATK, STAT_ANIM_PAL_DEF, STAT_ANIM_PAL_ACC, diff --git a/include/battle_setup.h b/include/battle_setup.h index aa01178d8d..b667a2ad8b 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -1,6 +1,7 @@ #ifndef GUARD_BATTLE_SETUP_H #define GUARD_BATTLE_SETUP_H +#include "battle_transition.h" #include "gym_leader_rematch.h" #define REMATCHES_COUNT 5 @@ -61,9 +62,9 @@ void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); void StartRegiBattle(void); enum BattleEnvironments BattleSetup_GetEnvironmentId(void); -u8 GetWildBattleTransition(void); -u8 GetTrainerBattleTransition(void); -u8 GetSpecialBattleTransition(s32 id); +enum BattleTransition GetWildBattleTransition(void); +enum BattleTransition GetTrainerBattleTransition(void); +enum BattleTransition GetSpecialBattleTransition(enum BattleTransitionGroup id); void ChooseStarter(void); void ResetTrainerOpponentIds(void); void SetMapVarsToTrainerA(void); diff --git a/include/battle_transition.h b/include/battle_transition.h index 8bc80dc642..fcfe42fde8 100644 --- a/include/battle_transition.h +++ b/include/battle_transition.h @@ -10,7 +10,8 @@ void GetBg0TilesDst(u16 **tilemap, u16 **tileset); extern const struct SpritePalette gSpritePalette_Pokeball; -enum { +enum MugshotColor +{ MUGSHOT_COLOR_NONE, MUGSHOT_COLOR_PURPLE, MUGSHOT_COLOR_GREEN, @@ -20,7 +21,8 @@ enum { MUGSHOT_COLOR_COUNT }; -enum { +enum BattleTransition +{ B_TRANSITION_BLUR, B_TRANSITION_SWIRL, B_TRANSITION_SHUFFLE, @@ -63,7 +65,8 @@ enum { }; // IDs for GetSpecialBattleTransition -enum { +enum BattleTransitionGroup +{ B_TRANSITION_GROUP_B_TOWER, B_TRANSITION_GROUP_B_DOME = 3, B_TRANSITION_GROUP_B_PALACE, diff --git a/include/battle_util.h b/include/battle_util.h index 7dc639c300..281ce2c33b 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -40,7 +40,8 @@ enum MoveAbsorbed MOVE_ABSORBED_BY_BOOST_FLASH_FIRE, }; -enum { +enum AbilityEffect +{ ABILITYEFFECT_ON_SWITCHIN, ABILITYEFFECT_ENDTURN, ABILITYEFFECT_MOVE_END_ATTACKER, @@ -253,7 +254,7 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility); bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, u32 moveType, enum FunctionCallOption option); -u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); +u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability); @@ -311,13 +312,13 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method); bool32 DoBattlersShareType(u32 battler1, u32 battler2); bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId); u32 GetBattlerVisualSpecies(u32 battler); -bool32 TryClearIllusion(u32 battler, u32 caseID); +bool32 TryClearIllusion(u32 battler, enum AbilityEffect caseID); u32 GetIllusionMonSpecies(u32 battler); struct Pokemon *GetIllusionMonPtr(u32 battler); void ClearIllusionMon(u32 battler); u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pokemon *partnerMon, u32 battler); bool32 SetIllusionMon(struct Pokemon *mon, u32 battler); -u32 TryImmunityAbilityHealStatus(u32 battler, u32 caseID); +u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID); bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler); enum DamageCategory GetBattleMoveCategory(u32 move); void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, u32 move); diff --git a/include/constants/field_specials.h b/include/constants/field_specials.h index 72966adeb8..6973f9e14f 100644 --- a/include/constants/field_specials.h +++ b/include/constants/field_specials.h @@ -2,65 +2,80 @@ #define GUARD_CONSTANTS_FIELD_SPECIALS_H // PC Locations -#define PC_LOCATION_OTHER 0 -#define PC_LOCATION_BRENDANS_HOUSE 1 -#define PC_LOCATION_MAYS_HOUSE 2 +enum PCLocation +{ + PC_LOCATION_OTHER, + PC_LOCATION_BRENDANS_HOUSE, + PC_LOCATION_MAYS_HOUSE, +}; // SS Tidal Locations -#define SS_TIDAL_LOCATION_CURRENTS 0 -#define SS_TIDAL_LOCATION_SLATEPORT 1 -#define SS_TIDAL_LOCATION_LILYCOVE 2 -#define SS_TIDAL_LOCATION_ROUTE124 3 -#define SS_TIDAL_LOCATION_ROUTE131 4 +enum SSTidalLocation +{ + SS_TIDAL_LOCATION_CURRENTS, + SS_TIDAL_LOCATION_SLATEPORT, + SS_TIDAL_LOCATION_LILYCOVE, + SS_TIDAL_LOCATION_ROUTE124, + SS_TIDAL_LOCATION_ROUTE131, +}; -#define SS_TIDAL_BOARD_SLATEPORT 1 -#define SS_TIDAL_DEPART_SLATEPORT 2 -#define SS_TIDAL_HALFWAY_LILYCOVE 3 -#define SS_TIDAL_LAND_LILYCOVE 4 -#define SS_TIDAL_BOARD_LILYCOVE 5 -#define SS_TIDAL_DEPART_LILYCOVE 6 -#define SS_TIDAL_HALFWAY_SLATEPORT 7 -#define SS_TIDAL_LAND_SLATEPORT 8 -#define SS_TIDAL_EXIT_CURRENTS_RIGHT 9 -#define SS_TIDAL_EXIT_CURRENTS_LEFT 10 +enum SSTidalState +{ + SS_TIDAL_BOARD_SLATEPORT = 1, + SS_TIDAL_DEPART_SLATEPORT, + SS_TIDAL_HALFWAY_LILYCOVE, + SS_TIDAL_LAND_LILYCOVE, + SS_TIDAL_BOARD_LILYCOVE, + SS_TIDAL_DEPART_LILYCOVE, + SS_TIDAL_HALFWAY_SLATEPORT, + SS_TIDAL_LAND_SLATEPORT, + SS_TIDAL_EXIT_CURRENTS_RIGHT, + SS_TIDAL_EXIT_CURRENTS_LEFT, +}; #define SS_TIDAL_MAX_STEPS 205 // Scrollable Multichoice Menus -#define SCROLL_MULTI_NONE 0 -#define SCROLL_MULTI_GLASS_WORKSHOP_VENDOR 1 -#define SCROLL_MULTI_POKEMON_FAN_CLUB_RATER 2 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1 3 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2 4 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR 5 -#define SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR 6 -#define SCROLL_MULTI_BERRY_POWDER_VENDOR 7 -#define SCROLL_MULTI_BF_RECEPTIONIST 8 -#define SCROLL_MULTI_BF_MOVE_TUTOR_1 9 -#define SCROLL_MULTI_BF_MOVE_TUTOR_2 10 -#define SCROLL_MULTI_SS_TIDAL_DESTINATION 11 -#define SCROLL_MULTI_BATTLE_TENT_RULES 12 +enum ScrollMulti +{ + SCROLL_MULTI_NONE, + SCROLL_MULTI_GLASS_WORKSHOP_VENDOR, + SCROLL_MULTI_POKEMON_FAN_CLUB_RATER, + SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1, + SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2, + SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR, + SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR, + SCROLL_MULTI_BERRY_POWDER_VENDOR, + SCROLL_MULTI_BF_RECEPTIONIST, + SCROLL_MULTI_BF_MOVE_TUTOR_1, + SCROLL_MULTI_BF_MOVE_TUTOR_2, + SCROLL_MULTI_SS_TIDAL_DESTINATION, + SCROLL_MULTI_BATTLE_TENT_RULES, +}; #define MAX_SCROLL_MULTI_ON_SCREEN 6 #define MAX_SCROLL_MULTI_LENGTH 16 // Dept Store Floor Numbers -#define DEPT_STORE_FLOORNUM_B4F 0 -#define DEPT_STORE_FLOORNUM_B3F 1 -#define DEPT_STORE_FLOORNUM_B2F 2 -#define DEPT_STORE_FLOORNUM_B1F 3 -#define DEPT_STORE_FLOORNUM_1F 4 -#define DEPT_STORE_FLOORNUM_2F 5 -#define DEPT_STORE_FLOORNUM_3F 6 -#define DEPT_STORE_FLOORNUM_4F 7 -#define DEPT_STORE_FLOORNUM_5F 8 -#define DEPT_STORE_FLOORNUM_6F 9 -#define DEPT_STORE_FLOORNUM_7F 10 -#define DEPT_STORE_FLOORNUM_8F 11 -#define DEPT_STORE_FLOORNUM_9F 12 -#define DEPT_STORE_FLOORNUM_10F 13 -#define DEPT_STORE_FLOORNUM_11F 14 -#define DEPT_STORE_FLOORNUM_ROOFTOP 15 +enum DeptStoreFloorNumber +{ + DEPT_STORE_FLOORNUM_B4F, + DEPT_STORE_FLOORNUM_B3F, + DEPT_STORE_FLOORNUM_B2F, + DEPT_STORE_FLOORNUM_B1F, + DEPT_STORE_FLOORNUM_1F, + DEPT_STORE_FLOORNUM_2F, + DEPT_STORE_FLOORNUM_3F, + DEPT_STORE_FLOORNUM_4F, + DEPT_STORE_FLOORNUM_5F, + DEPT_STORE_FLOORNUM_6F, + DEPT_STORE_FLOORNUM_7F, + DEPT_STORE_FLOORNUM_8F, + DEPT_STORE_FLOORNUM_9F, + DEPT_STORE_FLOORNUM_10F, + DEPT_STORE_FLOORNUM_11F, + DEPT_STORE_FLOORNUM_ROOFTOP, +}; // Lilycove Pokémon Trainer Fan Club #define NUM_TRAINER_FAN_CLUB_MEMBERS 8 @@ -81,10 +96,13 @@ #define FANCOUNTER_USED_BATTLE_TOWER 3 // Return values for DoDeoxysRockInteraction -#define DEOXYS_ROCK_FAILED 0 -#define DEOXYS_ROCK_PROGRESSED 1 -#define DEOXYS_ROCK_SOLVED 2 -#define DEOXYS_ROCK_COMPLETE 3 +enum DeoxysRockResult +{ + DEOXYS_ROCK_FAILED, + DEOXYS_ROCK_PROGRESSED, + DEOXYS_ROCK_SOLVED, + DEOXYS_ROCK_COMPLETE, +}; enum { OPEN_PARTY_SCREEN, diff --git a/include/field_specials.h b/include/field_specials.h index 50afecf2fb..c6bc40143f 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -19,7 +19,7 @@ bool32 ShouldDoScottBattleFrontierCall(void); bool32 ShouldDoRoxanneCall(void); bool32 ShouldDoRivalRayquazaCall(void); bool32 CountSSTidalStep(u16 delta); -u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y); +enum SSTidalLocation GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y); void ShowScrollableMultichoice(void); void FrontierGamblerSetWonOrLost(bool8 won); u8 TryGainNewFanFromCounter(u8 incrementId); diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index b70f481d6c..f27d7da0ea 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -530,7 +530,7 @@ static void AnimTask_FrozenIceCube_Step4(u8 taskId) void AnimTask_StatsChange(u8 taskId) { bool16 goesDown = FALSE; - s16 animStatId = 0; + enum StatAnimPal animStatId = 0; bool16 sharply = FALSE; switch (gBattleSpritesDataPtr->animationData->animArg) diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 54b9f949ba..54aa3e14aa 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -480,7 +480,7 @@ static void StatsChangeAnimation_Step2(u8 taskId) AnimLoadCompressedBgTilemapHandleContest(&animBgData, gStatAnim_Decrease_Tilemap, FALSE); AnimLoadCompressedBgGfx(animBgData.bgId, gStatAnim_Gfx, animBgData.tilesOffset); - switch (sAnimStatsChangeData->aAnimStatId) + switch ((enum StatAnimPal)sAnimStatsChangeData->aAnimStatId) { case STAT_ANIM_PAL_ATK: LoadPalette(gStatAnim_Attack_Pal, BG_PLTT_ID(animBgData.paletteId), PLTT_SIZE_4BPP); diff --git a/src/battle_setup.c b/src/battle_setup.c index f5925d86d7..0e50cc5e68 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -54,7 +54,8 @@ #include "constants/weather.h" #include "fishing.h" -enum { +enum TransitionType +{ TRANSITION_TYPE_NORMAL, TRANSITION_TYPE_CAVE, TRANSITION_TYPE_FLASH, @@ -260,7 +261,7 @@ static void Task_BattleStart(u8 taskId) } } -static void CreateBattleStartTask(u8 transition, u16 song) +static void CreateBattleStartTask(enum BattleTransition transition, u16 song) { u8 taskId = CreateTask(Task_BattleStart, 1); @@ -533,7 +534,7 @@ void StartGroudonKyogreBattle(void) void StartRegiBattle(void) { - u8 transitionId; + enum BattleTransition transitionId; u16 species; LockPlayerFieldControls(); @@ -686,7 +687,7 @@ enum BattleEnvironments BattleSetup_GetEnvironmentId(void) return BATTLE_ENVIRONMENT_PLAIN; } -static u8 GetBattleTransitionTypeByMap(void) +static enum TransitionType GetBattleTransitionTypeByMap(void) { u16 tileBehavior; s16 x, y; @@ -749,7 +750,7 @@ static u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons) return sum; } -u8 GetWildBattleTransition(void) +enum BattleTransition GetWildBattleTransition(void) { u8 transitionType = GetBattleTransitionTypeByMap(); u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); @@ -771,7 +772,7 @@ u8 GetWildBattleTransition(void) } } -u8 GetTrainerBattleTransition(void) +enum BattleTransition GetTrainerBattleTransition(void) { u8 minPartyCount = 1; u8 transitionType; @@ -814,7 +815,7 @@ u8 GetTrainerBattleTransition(void) } #define RANDOM_TRANSITION(table) (table[Random() % ARRAY_COUNT(table)]) -u8 GetSpecialBattleTransition(s32 id) +enum BattleTransition GetSpecialBattleTransition(enum BattleTransitionGroup id) { u16 var; u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); @@ -832,6 +833,8 @@ u8 GetSpecialBattleTransition(s32 id) return RANDOM_TRANSITION(sBattleTransitionTable_BattlePyramid); case B_TRANSITION_GROUP_B_DOME: return RANDOM_TRANSITION(sBattleTransitionTable_BattleDome); + default: + break; } if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS) @@ -849,6 +852,8 @@ u8 GetSpecialBattleTransition(s32 id) return RANDOM_TRANSITION(sBattleTransitionTable_BattlePyramid); case B_TRANSITION_GROUP_B_DOME: return RANDOM_TRANSITION(sBattleTransitionTable_BattleDome); + default: + break; } if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS) diff --git a/src/battle_transition.c b/src/battle_transition.c index 114248b93d..2b28bf7dc7 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -2280,7 +2280,7 @@ static bool8 Mugshot_SetGfx(struct Task *task) s16 i, j; u16 *tilemap, *tileset; const u16 *mugshotsMap = sMugshotsTilemap; - u8 mugshotColor = GetTrainerMugshotColorFromId(TRAINER_BATTLE_PARAM.opponentA); + enum MugshotColor mugshotColor = GetTrainerMugshotColorFromId(TRAINER_BATTLE_PARAM.opponentA); GetBg0TilesDst(&tilemap, &tileset); CpuSet(sEliteFour_Tileset, tileset, 0xF0); diff --git a/src/battle_util.c b/src/battle_util.c index 22b26e11e4..c9213275e9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3621,7 +3621,7 @@ static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 ani return 0; } -u32 AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) +u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) { u32 effect = 0; u32 moveType = 0, move = 0; @@ -9137,7 +9137,7 @@ u32 GetBattlerVisualSpecies(u32 battler) return gBattleMons[battler].species; } -bool32 TryClearIllusion(u32 battler, u32 caseID) +bool32 TryClearIllusion(u32 battler, enum AbilityEffect caseID) { if (gBattleStruct->illusion[battler].state != ILLUSION_ON) return FALSE; @@ -9181,10 +9181,10 @@ u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pok s32 partyStart=0; // Adjust party search range for Multibattles and Player vs two-trainers - if((GetBattlerSide(battler) == B_SIDE_PLAYER && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + if ((GetBattlerSide(battler) == B_SIDE_PLAYER && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) || (GetBattlerSide(battler) == B_SIDE_OPPONENT && (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS))) { - if((GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) || (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT)) + if ((GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) || (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT)) { partyEnd = 3; partyStart = 0; @@ -9242,7 +9242,7 @@ bool32 SetIllusionMon(struct Pokemon *mon, u32 battler) return FALSE; } -u32 TryImmunityAbilityHealStatus(u32 battler, u32 caseID) +u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) { u32 effect = 0; switch (GetBattlerAbilityIgnoreMoldBreaker(battler)) @@ -9309,28 +9309,28 @@ u32 TryImmunityAbilityHealStatus(u32 battler, u32 caseID) { case 1: // status cleared gBattleMons[battler].status1 = 0; - if(caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); else BattleScriptCall(BattleScript_AbilityCuredStatus); break; case 2: // get rid of confusion RemoveConfusionStatus(battler); - if(caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); else BattleScriptCall(BattleScript_AbilityCuredStatus); break; case 3: // get rid of infatuation gBattleMons[battler].volatiles.infatuation = 0; - if(caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); else BattleScriptCall(BattleScript_AbilityCuredStatus); break; case 4: // get rid of taunt gDisableStructs[battler].tauntTimer = 0; - if(caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) + if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); else BattleScriptCall(BattleScript_AbilityCuredStatus); diff --git a/src/field_special_scene.c b/src/field_special_scene.c index ccb15f02b4..6c66b50f8b 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -34,7 +34,7 @@ #define BOX3_Y_OFFSET 0 // porthole states -enum +enum PortholeState { INIT_PORTHOLE, IDLE_CHECK, @@ -300,7 +300,7 @@ void Task_HandlePorthole(u8 taskId) u16 *cruiseState = GetVarPointer(VAR_SS_TIDAL_STATE); struct WarpData *location = &gSaveBlock1Ptr->location; - switch (data[0]) + switch ((enum PortholeState)data[0]) { case INIT_PORTHOLE: // finish fading before making porthole finish. if (!gPaletteFade.active) diff --git a/src/field_specials.c b/src/field_specials.c index 3e2ff4c4e4..183abbd35c 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -122,14 +122,14 @@ static void Task_MoveElevator(u8); static void MoveElevatorWindowLights(u16, bool8); static void Task_MoveElevatorWindowLights(u8); static void Task_ShowScrollableMultichoice(u8); -static void FillFrontierExchangeCornerWindowAndItemIcon(u16, u16); -static void ShowBattleFrontierTutorWindow(u8, u16); +static void FillFrontierExchangeCornerWindowAndItemIcon(enum ScrollMulti, u16); +static void ShowBattleFrontierTutorWindow(enum ScrollMulti, u16); static void InitScrollableMultichoice(void); static void ScrollableMultichoice_ProcessInput(u8); static void ScrollableMultichoice_UpdateScrollArrows(u8); static void ScrollableMultichoice_MoveCursor(s32, bool8, struct ListMenu *); -static void HideFrontierExchangeCornerItemIcon(u16, u16); -static void ShowBattleFrontierTutorMoveDescription(u8, u16); +static void HideFrontierExchangeCornerItemIcon(enum ScrollMulti, u16); +static void ShowBattleFrontierTutorMoveDescription(enum ScrollMulti, u16); static void CloseScrollableMultichoice(u8); static void ScrollableMultichoice_RemoveScrollArrows(u8); static void Task_ScrollableMultichoice_WaitReturnToList(u8); @@ -314,10 +314,11 @@ bool32 CountSSTidalStep(u16 delta) return TRUE; } -u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) +enum SSTidalLocation GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) { u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); - switch (*GetVarPointer(VAR_SS_TIDAL_STATE)) + + switch ((enum SSTidalState)(*GetVarPointer(VAR_SS_TIDAL_STATE))) { case SS_TIDAL_BOARD_SLATEPORT: case SS_TIDAL_LAND_SLATEPORT: @@ -1781,7 +1782,7 @@ static const u16 sElevatorWindowTiles_Descending[ELEVATOR_WINDOW_HEIGHT][ELEVATO void SetDeptStoreFloor(void) { - u8 deptStoreFloor; + enum DeptStoreFloorNumber deptStoreFloor; switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F): @@ -2294,7 +2295,7 @@ void ShowScrollableMultichoice(void) struct Task *task = &gTasks[taskId]; task->tScrollMultiId = gSpecialVar_0x8004; - switch (gSpecialVar_0x8004) + switch ((enum ScrollMulti)gSpecialVar_0x8004) { case SCROLL_MULTI_NONE: task->tMaxItemsOnScreen = 1; @@ -2989,7 +2990,7 @@ void CloseFrontierExchangeCornerItemIconWindow(void) RemoveWindow(sFrontierExchangeCorner_ItemIconWindowId); } -static void FillFrontierExchangeCornerWindowAndItemIcon(u16 menu, u16 selection) +static void FillFrontierExchangeCornerWindowAndItemIcon(enum ScrollMulti menu, u16 selection) { #include "data/battle_frontier/battle_frontier_exchange_corner.h" @@ -3032,6 +3033,8 @@ static void FillFrontierExchangeCornerWindowAndItemIcon(u16 menu, u16 selection) AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_HoldItemsDescriptions[selection], 0, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_HoldItems[selection]); break; + default: + break; } } } @@ -3050,7 +3053,7 @@ static void ShowFrontierExchangeCornerItemIcon(u16 item) } } -static void HideFrontierExchangeCornerItemIcon(u16 menu, u16 unused) +static void HideFrontierExchangeCornerItemIcon(enum ScrollMulti menu, u16 unused) { if (sScrollableMultichoice_ItemSpriteId != MAX_SPRITES) { @@ -3063,6 +3066,8 @@ static void HideFrontierExchangeCornerItemIcon(u16 menu, u16 unused) // This makes sure deleting the icon will not clear palettes in use by object events FieldEffectFreeGraphicsResources(&gSprites[sScrollableMultichoice_ItemSpriteId]); break; + default: + break; } sScrollableMultichoice_ItemSpriteId = MAX_SPRITES; } @@ -3073,7 +3078,7 @@ void BufferBattleFrontierTutorMoveName(void) StringCopy(gStringVar1, GetMoveName(gSpecialVar_0x8005)); } -static void ShowBattleFrontierTutorWindow(u8 menu, u16 selection) +static void ShowBattleFrontierTutorWindow(enum ScrollMulti menu, u16 selection) { static const struct WindowTemplate sBattleFrontierTutor_WindowTemplate = { @@ -3097,7 +3102,7 @@ static void ShowBattleFrontierTutorWindow(u8 menu, u16 selection) } } -static void ShowBattleFrontierTutorMoveDescription(u8 menu, u16 selection) +static void ShowBattleFrontierTutorMoveDescription(enum ScrollMulti menu, u16 selection) { static const u8 *const sBattleFrontier_TutorMoveDescriptions1[] = { From fbd702e3a403b252ce6856955ad4e2c6aeb10843 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Thu, 23 Oct 2025 20:14:38 +0200 Subject: [PATCH 091/183] Some more documentation and cleanup (#8020) --- include/battle.h | 4 +-- include/battle_controllers.h | 2 +- include/constants/battle.h | 9 ++++--- include/field_name_box.h | 1 - include/pokemon.h | 2 +- include/test/battle.h | 2 +- src/battle_controllers.c | 48 ++++++++++++++++++------------------ src/battle_main.c | 2 +- src/battle_script_commands.c | 2 +- src/battle_util.c | 4 +-- src/pokemon.c | 2 +- src/type_icons.c | 2 +- test/test_runner_battle.c | 2 +- 13 files changed, 42 insertions(+), 40 deletions(-) diff --git a/include/battle.h b/include/battle.h index 758ed7a453..ad32a9e632 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1185,7 +1185,7 @@ static inline u32 GetBattlerSide(u32 battler) return GetBattlerPosition(battler) & BIT_SIDE; } -static inline u32 IsOnPlayerSide(u32 battler) +static inline bool32 IsOnPlayerSide(u32 battler) { return GetBattlerSide(battler) == B_SIDE_PLAYER; } @@ -1206,7 +1206,7 @@ static inline struct Pokemon* GetBattlerMon(u32 battler) return !IsOnPlayerSide(battler) ? &gEnemyParty[index] : &gPlayerParty[index]; } -static inline struct Pokemon *GetSideParty(u32 side) +static inline struct Pokemon *GetSideParty(enum BattleSide side) { return side == B_SIDE_PLAYER ? gPlayerParty : gEnemyParty; } diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 681ee519f4..4f83f8eee9 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -364,7 +364,7 @@ void BtlController_HandleSpriteInvisibility(u32 battler); bool32 TwoPlayerIntroMons(u32 battlerId); // Double battle with both player pokemon active. bool32 TwoOpponentIntroMons(u32 battlerId); // Double battle with both opponent pokemon active. void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u16 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler)); -void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay); +void BtlController_HandleDrawPartyStatusSummary(u32 battler, enum BattleSide side, bool32 considerDelay); void BtlController_HandleHidePartyStatusSummary(u32 battler); void BtlController_HandleBattleAnimation(u32 battler); diff --git a/include/constants/battle.h b/include/constants/battle.h index b47b1a99da..1f65e2a8f2 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -45,9 +45,12 @@ enum BattlerId #define BATTLE_OPPOSITE(id) ((id) ^ BIT_SIDE) #define BATTLE_PARTNER(id) ((id) ^ BIT_FLANK) -#define B_SIDE_PLAYER 0 -#define B_SIDE_OPPONENT 1 -#define NUM_BATTLE_SIDES 2 +enum BattleSide +{ + B_SIDE_PLAYER = 0, + B_SIDE_OPPONENT = 1, + NUM_BATTLE_SIDES = 2, +}; #define B_FLANK_LEFT 0 #define B_FLANK_RIGHT 1 diff --git a/include/field_name_box.h b/include/field_name_box.h index f139cd21dc..dc990c8592 100644 --- a/include/field_name_box.h +++ b/include/field_name_box.h @@ -13,7 +13,6 @@ void DestroyNamebox(void); void FillNamebox(void); void DrawNamebox(u32 windowId, u32 tileNum, bool32 copyToVram); void ClearNamebox(u32 windowId, bool32 copyToVram); -void SetSpeakerName(const u8 *name); u32 GetNameboxWidth(void); void TrySpawnAndShowNamebox(const u8 *speaker, u32 tileNum); diff --git a/include/pokemon.h b/include/pokemon.h index 08313fb95b..a72cc83b6c 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -885,7 +885,7 @@ u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove); void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv); void TrySpecialOverworldEvo(void); bool32 SpeciesHasGenderDifferences(u16 species); -bool32 TryFormChange(u32 monId, u32 side, enum FormChanges method); +bool32 TryFormChange(u32 monId, enum BattleSide side, enum FormChanges method); void TryToSetBattleFormChangeMoves(struct Pokemon *mon, enum FormChanges method); u32 GetMonFriendshipScore(struct Pokemon *pokemon); u32 GetMonAffectionHearts(struct Pokemon *pokemon); diff --git a/include/test/battle.h b/include/test/battle.h index ad36cd4f99..78e6de34bb 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -888,7 +888,7 @@ struct moveWithPP { void SetFlagForTest(u32 sourceLine, u16 flagId); void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value); void ClearFlagAfterTest(void); -void OpenPokemon(u32 sourceLine, u32 side, u32 species); +void OpenPokemon(u32 sourceLine, enum BattleSide side, u32 species); void ClosePokemon(u32 sourceLine); void RNGSeed_(u32 sourceLine, rng_value_t seed); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 9818879e7b..8adfbd4880 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -168,36 +168,36 @@ static void InitBtlControllersInternal(void) if (isLink) { if (isDouble && isMulti && !isMaster) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToLinkPartner; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToLinkPartner; else - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayer; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToPlayer; if (!isDouble || !isMulti || !isMaster) { - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToLinkOpponent; - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayer; - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToLinkOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToLinkOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayer; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToLinkOpponent; } else { - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToOpponent; - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToLinkPartner; - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToLinkPartner; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToOpponent; } } else { // Player 1 if (isRecorded) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToRecordedPlayer; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToRecordedPlayer; else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToSafari; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToSafari; else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToWally; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToWally; else if (isAIvsAI) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayerPartner; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToPlayerPartner; else - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToPlayer; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToPlayer; // Opponent 1 bool32 isOpponent1Recorded; @@ -207,25 +207,25 @@ static void InitBtlControllersInternal(void) isOpponent1Recorded = isRecorded && isRecordedLink; if (isOpponent1Recorded) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToRecordedOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToRecordedOpponent; else - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_1]] = SetControllerToOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToOpponent; // Player 2 if (isInGamePartner) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayerPartner; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayerPartner; else if (isRecorded) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToRecordedPlayer; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToRecordedPlayer; else if (isAIvsAI) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayerPartner; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayerPartner; else - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_2]] = SetControllerToPlayer; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayer; // Opponent 2 if (isInGamePartner || !isRecorded || isMulti || !isRecordedLink) - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToOpponent; else - gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_3]] = SetControllerToRecordedOpponent; + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToRecordedOpponent; } bool32 bufferPartyOrders; @@ -2676,7 +2676,7 @@ bool32 TwoOpponentIntroMons(u32 battler) // Double battle with both opponent pok void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u16 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler)) { u8 paletteNum, taskId; - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]); if (side == B_SIDE_PLAYER) @@ -2802,7 +2802,7 @@ static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) #undef sBattlerId -void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay) +void BtlController_HandleDrawPartyStatusSummary(u32 battler, enum BattleSide side, bool32 considerDelay) { if (gBattleResources->bufferA[battler][1] != 0 && IsOnPlayerSide(battler)) { @@ -3005,7 +3005,7 @@ void BtlController_HandleSwitchInSoundAndEnd(u32 battler) void BtlController_HandleSwitchInShowHealthbox(u32 battler) { - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim && (side == B_SIDE_PLAYER || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)) { diff --git a/src/battle_main.c b/src/battle_main.c index 4591b7575f..382c846bb5 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5603,7 +5603,7 @@ static void HandleEndTurn_FinishBattle(void) | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_FRONTIER))) { - for (u32 side = 0; side < NUM_BATTLE_SIDES; side++) + for (enum BattleSide side = 0; side < NUM_BATTLE_SIDES; side++) { struct Pokemon *party = GetSideParty(side); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8180bb9fbf..1e72e2e339 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5673,7 +5673,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) return FALSE; u32 effect = FALSE; - u32 side = GetBattlerSide(gBattlerTarget); + enum BattleSide side = GetBattlerSide(gBattlerTarget); switch (moveEffect) { case EFFECT_KNOCK_OFF: diff --git a/src/battle_util.c b/src/battle_util.c index c9213275e9..b3c1c7941c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3300,7 +3300,7 @@ bool32 ChangeTypeBasedOnTerrain(u32 battler) return TRUE; } -static inline u8 GetSideFaintCounter(u32 side) +static inline u8 GetSideFaintCounter(enum BattleSide side) { return (side == B_SIDE_PLAYER) ? gBattleResults.playerFaintCounter : gBattleResults.opponentFaintCounter; } @@ -9554,7 +9554,7 @@ void TryRestoreHeldItems(void) bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) { - u8 stealerSide = GetBattlerSide(battlerStealing); + enum BattleSide stealerSide = GetBattlerSide(battlerStealing); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) return FALSE; diff --git a/src/pokemon.c b/src/pokemon.c index 08ca51ee65..b2712f6470 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6865,7 +6865,7 @@ bool32 SpeciesHasGenderDifferences(u16 species) return FALSE; } -bool32 TryFormChange(u32 monId, u32 side, enum FormChanges method) +bool32 TryFormChange(u32 monId, enum BattleSide side, enum FormChanges method) { struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; diff --git a/src/type_icons.c b/src/type_icons.c index ba13f86027..08a30c2d5f 100644 --- a/src/type_icons.c +++ b/src/type_icons.c @@ -415,7 +415,7 @@ static void CreateSpriteAndSetTypeSpriteAttributes(u32 type, u32 x, u32 y, u32 p static bool32 ShouldFlipTypeIcon(bool32 useDoubleBattleCoords, u32 position, u32 typeId) { - bool32 side = (useDoubleBattleCoords) ? B_SIDE_OPPONENT : B_SIDE_PLAYER; + enum BattleSide side = (useDoubleBattleCoords) ? B_SIDE_OPPONENT : B_SIDE_PLAYER; if (GetBattlerSide(GetBattlerAtPosition(position)) != side) return FALSE; diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 9eba3e1901..55b1caabfa 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -1552,7 +1552,7 @@ void ClearFlagAfterTest(void) } } -void OpenPokemon(u32 sourceLine, u32 side, u32 species) +void OpenPokemon(u32 sourceLine, enum BattleSide side, u32 species) { s32 i, data; u8 *partySize; From 5348de4abbb4bdbaee35dc66a5f7a02e1514d04d Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Thu, 23 Oct 2025 21:29:33 +0200 Subject: [PATCH 092/183] Banned species list (#8003) --- data/event_scripts.s | 1 + .../scripts.inc | 12 +- .../scripts.inc | 11 +- .../scripts.inc | 12 +- .../scripts.inc | 12 +- .../scripts.inc | 12 +- .../scripts.inc | 37 +-- data/scripts/battle_frontier.inc | 13 + include/frontier_util.h | 1 + include/list_menu.h | 5 +- include/strings.h | 3 + src/frontier_util.c | 226 +++++++++++++++--- src/list_menu.c | 46 ++-- src/strings.c | 3 + 14 files changed, 311 insertions(+), 83 deletions(-) create mode 100644 data/scripts/battle_frontier.inc diff --git a/data/event_scripts.s b/data/event_scripts.s index 2fd8a0a151..8d3a06e69e 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1159,3 +1159,4 @@ EventScript_VsSeekerChargingDone:: .include "data/text/save.inc" .include "data/text/birch_speech.inc" .include "data/scripts/dexnav.inc" + .include "data/scripts/battle_frontier.inc" diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc index 7969ca9eb7..fdcd609bc8 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc @@ -182,10 +182,14 @@ BattleFrontier_BattleArenaLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattleArenaLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge BattleFrontier_BattleArenaLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge BattleFrontier_BattleArenaLobby_EventScript_CancelChallengeSaveFailed:: @@ -409,7 +413,9 @@ BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLvOpen: .string "different kinds of POKéMON.\p" .string "They also must not hold the same\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsEnd: .string "When you have made your preparations,\n" .string "please do return.$" @@ -423,9 +429,7 @@ BattleFrontier_BattleArenaLobby_Text_NotEnoughValidMonsLv50: .string "must all be Level 50 or lower.\p" .string "They also must not hold the same\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "When you have made your preparations,\n" - .string "please do return.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleArenaLobby_Text_GuideYouToArena: .string "I shall now guide you to\n" diff --git a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc index cf6510189c..f3522ccfb6 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc @@ -210,10 +210,14 @@ BattleFrontier_BattleDomeLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattleDomeLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleDomeLobby_EventScript_EndCancelChallenge BattleFrontier_BattleDomeLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleDomeLobby_EventScript_EndCancelChallenge BattleFrontier_BattleDomeLobby_EventScript_CancelChallengeSaveFailed:: @@ -486,7 +490,9 @@ BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLvOpen: .string "You don't have three eligible POKéMON.\p" .string "Also, the POKéMON must be holding\n" .string "different kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsEnd: .string "Please come see me when you are ready.$" BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLv50: @@ -496,8 +502,7 @@ BattleFrontier_BattleDomeLobby_Text_NotEnoughValidMonsLv50: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleDomeLobby_Text_ShowYouToBattleDome: .string "I will now show you to\n" diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc index d80eaa49c2..9ef4479f2e 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc @@ -202,10 +202,14 @@ BattleFrontier_BattlePalaceLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattlePalaceLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePalaceLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePalaceLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePalaceLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePalaceLobby_EventScript_CancelChallengeSaveFailed:: @@ -427,7 +431,9 @@ BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLv50: .string "Level 50 or lower.\p" .string "They also must not be holding\n" .string "the same kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsEnd: .string "Come back when you have made\n" .string "your preparations.$" @@ -439,9 +445,7 @@ BattleFrontier_BattlePalaceLobby_Text_NotEnoughValidMonsLvOpen: .string "different kinds of POKéMON.\p" .string "They also must not be holding\n" .string "the same kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Come back when you have made\n" - .string "your preparations.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattlePalaceLobby_Text_NowSelectThreeMons: .string "Good. Now, you must select your\n" diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index 6e72a30ec0..db00673550 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -172,10 +172,14 @@ BattleFrontier_BattlePikeLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattlePikeLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePikeLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePikeLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePikeLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePikeLobby_EventScript_CancelChallengeSaveFailed:: @@ -315,7 +319,9 @@ BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLv50: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsEnd: .string "Please come see me when\n" .string "you are ready…$" @@ -327,9 +333,7 @@ BattleFrontier_BattlePikeLobby_Text_NotEnoughValidMonsLvOpen: .string "POKéMON to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when\n" - .string "you are ready…$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattlePikeLobby_Text_PleaseChooseThreeMons: .string "Please choose the three POKéMON\n" diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc index a8f949ca58..75f3c37cd8 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc @@ -184,10 +184,14 @@ BattleFrontier_BattlePyramidLobby_EventScript_NotEnoughValidMons:: BattleFrontier_BattlePyramidLobby_EventScript_NotEnoughValidMonsLv50:: msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLv50, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePyramidLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePyramidLobby_EventScript_NotEnoughValidMonsLvOpen:: msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLvOpen, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattlePyramidLobby_EventScript_EndCancelChallenge BattleFrontier_BattlePyramidLobby_EventScript_CancelChallengeSaveFailed:: @@ -573,9 +577,7 @@ BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLvOpen: .string "POKéMON qualified for the challenge.\p" .string "Please also remember to take all\n" .string "items from your POKéMON.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "When you are ready, please have\n" - .string "a word with me.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLv50: .string "A slight problem, adventurer!\p" @@ -585,7 +587,9 @@ BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsLv50: .string "and each no higher than Level 50.\p" .string "Please also remember to take all\n" .string "items from your POKéMON.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattlePyramidLobby_Text_NotEnoughValidMonsEnd: .string "When you are ready, please have\n" .string "a word with me.$" diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index 945335f7b7..3240683f95 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -543,16 +543,22 @@ BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50:: case FRONTIER_MODE_SINGLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Singles case FRONTIER_MODE_DOUBLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Doubles msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Multis, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Singles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Singles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLv50Doubles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Doubles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end @@ -561,16 +567,22 @@ BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpen:: case FRONTIER_MODE_SINGLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenSingles case FRONTIER_MODE_DOUBLES, BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenDoubles msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenMultis, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenSingles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenSingles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end BattleFrontier_BattleTowerLobby_EventScript_NotEnoughValidMonsLvOpenDoubles:: msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenDoubles, MSGBOX_DEFAULT + call BattleFrontier_ShowCaughtBannedSpecies + msgbox BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd, MSGBOX_DEFAULT goto BattleFrontier_BattleTowerLobby_EventScript_EndCancelChallenge end @@ -1083,7 +1095,9 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" + .string "EGGS{STR_VAR_1}.$" + +BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsEnd: .string "Please come see me when you are ready.$" @ Unused @@ -1094,8 +1108,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpen: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Singles: .string "Excuse me!\p" @@ -1104,8 +1117,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Singles: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenSingles: .string "Excuse me!\p" @@ -1114,8 +1126,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenSingles: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Doubles: .string "Excuse me!\p" @@ -1124,8 +1135,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Doubles: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenDoubles: .string "Excuse me!\p" @@ -1134,8 +1144,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenDoubles: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Multis: .string "Excuse me!\p" @@ -1144,8 +1153,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLv50Multis: .string "of Level 50 or less to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenMultis: .string "Excuse me!\p" @@ -1154,8 +1162,7 @@ BattleFrontier_BattleTowerLobby_Text_NotEnoughValidMonsLvOpenMultis: .string "to enter.\p" .string "They also must be holding different\n" .string "kinds of items.\p" - .string "EGGS{STR_VAR_1} ineligible.\p" - .string "Please come see me when you are ready.$" + .string "EGGS{STR_VAR_1}.$" BattleFrontier_BattleTowerLobby_Text_WelcomSingleBattle: .string "Where the talents of TRAINERS\n" diff --git a/data/scripts/battle_frontier.inc b/data/scripts/battle_frontier.inc new file mode 100644 index 0000000000..cbfd1ac5ee --- /dev/null +++ b/data/scripts/battle_frontier.inc @@ -0,0 +1,13 @@ +BattleFrontier_ShowCaughtBannedSpecies:: + goto_if_eq VAR_0x8005, 0, BattleFrontier_ShowCaughtBannedSpeciesEnd + msgbox BattleFrontier_DoYouWantToSeeTheListOfCaughtBannedSpecies, MSGBOX_YESNO + goto_if_eq VAR_RESULT, NO, BattleFrontier_ShowCaughtBannedSpeciesEnd + callnative ShowBattleFrontierCaughtBannedSpecies + waitstate +BattleFrontier_ShowCaughtBannedSpeciesEnd: + return + + +BattleFrontier_DoYouWantToSeeTheListOfCaughtBannedSpecies: + .string "Do you want to see the list of\n" + .string "POKéMON species you can't bring?$" diff --git a/include/frontier_util.h b/include/frontier_util.h index 5494aa5f0b..cd99f7a181 100644 --- a/include/frontier_util.h +++ b/include/frontier_util.h @@ -25,5 +25,6 @@ u8 GetFrontierBrainMonNature(u8 monId); u8 GetFrontierBrainMonEvs(u8 monId, u8 evStatId); s32 GetFronterBrainSymbol(void); void ClearEnemyPartyAfterChallenge(void); +void ShowBattleFrontierCaughtBannedSpecies(void); #endif // GUARD_FRONTIER_UTIL_H diff --git a/include/list_menu.h b/include/list_menu.h index 184b9c416f..8d472320d6 100644 --- a/include/list_menu.h +++ b/include/list_menu.h @@ -76,8 +76,9 @@ struct ListMenuTemplate u8 lettersSpacing:3; u8 itemVerticalPadding:3; u8 scrollMultiple:2; // x40, x80 = xC0 - u8 fontId:6; // x1, x2, x4, x8, x10, x20 = x3F - u8 cursorKind:2; // x40, x80 + u8 fontId:5; // x1, x2, x4, x8, x10 = x1F + u8 cursorKind:2; // x20, x40 + u8 isDynamic:1; //Dynamic list doesn't store all items in memory but load them from ROM when necessary }; struct ListMenu diff --git a/include/strings.h b/include/strings.h index a9cddee25b..0b4227125a 100644 --- a/include/strings.h +++ b/include/strings.h @@ -942,6 +942,9 @@ extern const u8 gText_FrontierFacilityClearStreak[]; extern const u8 gText_FrontierFacilityRoomsCleared[]; extern const u8 gText_FrontierFacilityKOsStreak[]; extern const u8 gText_FrontierFacilityFloorsCleared[]; +extern const u8 gText_FrontierFacilityTotalCaughtSpeciesBanned[]; +extern const u8 gText_FrontierFacilityIncluding[]; +extern const u8 gText_FrontierFacilityAreInelegible[]; // Battle Tower. extern const u8 BattleFrontier_BattleTowerMultiPartnerRoom_Text_Apprentice1Intro[]; diff --git a/src/frontier_util.c b/src/frontier_util.c index 8fcf1221f3..50f0c67167 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -38,6 +38,7 @@ #include "constants/items.h" #include "constants/event_objects.h" #include "party_menu.h" +#include "list_menu.h" struct FrontierBrainMon { @@ -93,6 +94,9 @@ static void ShowArenaResultsWindow(void); static void ShowPyramidResultsWindow(void); static void ShowLinkContestResultsWindow(void); static void CopyFrontierBrainText(bool8 playerWonText); +static u16 *MakeCaughtBannesSpeciesList(u32 totalBannedSpecies); +static void PrintBannedSpeciesName(u8 windowId, u32 itemId, u8 y); +static void Task_BannedSpeciesWindowInput(u8 taskId); // battledBit: Flags to change the conversation when the Frontier Brain is encountered for a battle // First bit is has battled them before and not won yet, second bit is has battled them and won (obtained a Symbol) @@ -784,6 +788,58 @@ static const u8 *const sHallFacilityToRecordsText[] = [RANKING_HALL_TOWER_LINK] = gText_FrontierFacilityWinStreak, }; + +#define BANNED_SPECIES_SHOWN 6 + +static const struct ListMenuTemplate sCaughtBannedSpeciesListTemplate = +{ + .items = NULL, + .isDynamic = TRUE, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = PrintBannedSpeciesName, + .maxShowed = BANNED_SPECIES_SHOWN, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 1, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 1, + .itemVerticalPadding = 0, + .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, + .fontId = FONT_NORMAL, + .cursorKind = 0 +}; + +static const struct WindowTemplate sBannedSpeciesWindowTemplateMain = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 12, + .height = 2 * BANNED_SPECIES_SHOWN, + .paletteNum = 15, + .baseBlock = 1, +}; + +#define TAG_LIST_ARROWS 5425 + +static const struct ScrollArrowsTemplate sCaughtBannedSpeciesScrollArrowsTemplate = +{ + .firstArrowType = SCROLL_ARROW_UP, + .firstX = 56, + .firstY = 8, + .secondArrowType = SCROLL_ARROW_DOWN, + .secondX = 56, + .secondY = 104, + .fullyUpThreshold = 0, + .fullyDownThreshold = 0, + .tileTag = TAG_LIST_ARROWS, + .palTag = TAG_LIST_ARROWS, + .palNum = 0, +}; + // code void CallFrontierUtilFunc(void) { @@ -1943,21 +1999,18 @@ static void CheckBattleTypeFlag(void) gSpecialVar_Result = FALSE; } -#define SPECIES_PER_LINE 3 - static void AppendCaughtBannedMonSpeciesName(u16 species, u8 count, s32 numBannedMonsCaught) { - if (numBannedMonsCaught == count) + if (count == 1) + ; + else if (numBannedMonsCaught == count) StringAppend(gStringVar1, gText_SpaceAndSpace); else if (numBannedMonsCaught > count) StringAppend(gStringVar1, gText_CommaSpace); - if ((count % SPECIES_PER_LINE) == 0) - { - if (count == SPECIES_PER_LINE) - StringAppend(gStringVar1, gText_NewLine); - else - StringAppend(gStringVar1, gText_LineBreak); - } + if (count == 3) + StringAppend(gStringVar1, gText_NewLine2); + else if (count == 6) + StringAppend(gStringVar1, gText_LineBreak); StringAppend(gStringVar1, GetSpeciesName(species)); } @@ -2053,46 +2106,60 @@ static void CheckPartyIneligibility(void) if (numEligibleMons < toChoose) { - u32 i; + u32 i, j; u32 baseSpecies = 0; u32 totalCaughtBanned = 0; - u32 caughtBanned[100] = {0}; + u32 totalPartyBanned = 0; + u32 partyBanned[PARTY_SIZE] = {0}; for (i = 0; i < NUM_SPECIES; i++) { - if (totalCaughtBanned >= ARRAY_COUNT(caughtBanned)) - break; baseSpecies = GET_BASE_SPECIES_ID(i); - if (baseSpecies == i) + if (baseSpecies == i && gSpeciesInfo[baseSpecies].isFrontierBanned) { - if (gSpeciesInfo[baseSpecies].isFrontierBanned) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(baseSpecies), FLAG_GET_CAUGHT)) + totalCaughtBanned++; + } + } + + for (i = 0; i < PARTY_SIZE; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); + if (species == SPECIES_EGG || species == SPECIES_NONE) + continue; + if (gSpeciesInfo[GET_BASE_SPECIES_ID(species)].isFrontierBanned) + { + bool32 addToList = TRUE; + for (j = 0; j < totalPartyBanned; j++) + if (partyBanned[j] == species) + addToList = FALSE; + if (addToList) { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(baseSpecies), FLAG_GET_CAUGHT)) - { - caughtBanned[totalCaughtBanned] = baseSpecies; - totalCaughtBanned++; - } + partyBanned[totalPartyBanned] = species; + totalPartyBanned++; } } } + gStringVar1[0] = EOS; gSpecialVar_0x8004 = TRUE; - for (i = 0; i < totalCaughtBanned; i++) - AppendCaughtBannedMonSpeciesName(caughtBanned[i], i+1, totalCaughtBanned); - if (totalCaughtBanned == 0) { - StringAppend(gStringVar1, gText_Space2); - StringAppend(gStringVar1, gText_Are); + StringAppend(gStringVar1, gText_FrontierFacilityAreInelegible); } else { - if (totalCaughtBanned % SPECIES_PER_LINE == SPECIES_PER_LINE - 1) - StringAppend(gStringVar1, gText_LineBreak); - else - StringAppend(gStringVar1, gText_Space2); - StringAppend(gStringVar1, gText_Are2); + ConvertIntToDecimalStringN(gStringVar2, totalCaughtBanned, STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_FrontierFacilityTotalCaughtSpeciesBanned); + StringAppend(gStringVar1, gStringVar4); } + if (totalPartyBanned > 0) + { + StringAppend(gStringVar1, gText_FrontierFacilityIncluding); + for (i = 0; i < totalPartyBanned; i++) + AppendCaughtBannedMonSpeciesName(partyBanned[i], i+1, totalPartyBanned); + } + gSpecialVar_0x8005 = totalCaughtBanned; } else { @@ -2102,8 +2169,6 @@ static void CheckPartyIneligibility(void) #undef numEligibleMons } -#undef SPECIES_PER_LINE - static void ValidateVisitingTrainer(void) { ValidateEReaderTrainer(); @@ -2649,3 +2714,98 @@ void ClearEnemyPartyAfterChallenge() ZeroEnemyPartyMons(); } } + +#define tWindowId data[0] +#define tMenuTaskId data[1] +#define tArrowTaskId data[2] +#define tScrollOffset data[3] +#define tListPointerElemId 4 + +static u16 *MakeCaughtBannesSpeciesList(u32 totalBannedSpecies) +{ + u32 count = 0; + u16 *list = AllocZeroed(sizeof(u16) * totalBannedSpecies); + for (u32 i = 0; i < NUM_SPECIES; i++) + { + u32 baseSpecies = GET_BASE_SPECIES_ID(i); + if (baseSpecies == i && gSpeciesInfo[baseSpecies].isFrontierBanned) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(baseSpecies), FLAG_GET_CAUGHT)) + { + list[count] = i; + count++; + } + } + } + return list; +} + +static void PrintBannedSpeciesName(u8 windowId, u32 itemId, u8 y) +{ + u8 colors[3] = { + sCaughtBannedSpeciesListTemplate.fillValue, + sCaughtBannedSpeciesListTemplate.cursorPal, + sCaughtBannedSpeciesListTemplate.cursorShadowPal + }; + u16 *list = (u16 *) GetWordTaskArg(gSpecialVar_0x8006, tListPointerElemId); + AddTextPrinterParameterized4(windowId, + sCaughtBannedSpeciesListTemplate.fontId, + sCaughtBannedSpeciesListTemplate.item_X, y, + sCaughtBannedSpeciesListTemplate.lettersSpacing, 0, colors, TEXT_SKIP_DRAW, + GetSpeciesName(list[itemId])); +} + +void ShowBattleFrontierCaughtBannedSpecies(void) +{ + u8 windowId; + struct ListMenuTemplate listTemplate = sCaughtBannedSpeciesListTemplate; + u32 totalCaughtBanned = gSpecialVar_0x8005; + listTemplate.totalItems = totalCaughtBanned; + + // create window + LoadMessageBoxAndBorderGfx(); + windowId = AddWindow(&sBannedSpeciesWindowTemplateMain); + DrawStdWindowFrame(windowId, FALSE); + listTemplate.windowId = windowId; + + u16 *listItems = MakeCaughtBannesSpeciesList(totalCaughtBanned); + u32 inputTaskId = CreateTask(Task_BannedSpeciesWindowInput, 3); + gTasks[inputTaskId].tWindowId = windowId; + gSpecialVar_0x8006 = inputTaskId; + SetWordTaskArg(inputTaskId, tListPointerElemId, (u32)listItems); + u32 menuTaskId = ListMenuInit(&listTemplate, 0, 0); + gTasks[inputTaskId].tMenuTaskId = menuTaskId; + gTasks[inputTaskId].tArrowTaskId = TASK_NONE; + if (listTemplate.totalItems > listTemplate.maxShowed) + { + gTempScrollArrowTemplate = sCaughtBannedSpeciesScrollArrowsTemplate; + gTempScrollArrowTemplate.fullyDownThreshold = listTemplate.totalItems - listTemplate.maxShowed; + gTasks[inputTaskId].tArrowTaskId = AddScrollIndicatorArrowPair(&gTempScrollArrowTemplate, (u16 *)&gTasks[inputTaskId].tScrollOffset); + } + + // draw everything + CopyWindowToVram(windowId, COPYWIN_FULL); +} + +static void Task_BannedSpeciesWindowInput(u8 taskId) +{ + ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); + ListMenuGetScrollAndRow(gTasks[taskId].tMenuTaskId, (u16 *)&gTasks[taskId].tScrollOffset, NULL); + if (JOY_NEW(B_BUTTON)) + { + ScriptContext_Enable(); + if (gTasks[taskId].tArrowTaskId < TASK_NONE) + RemoveScrollIndicatorArrowPair(gTasks[taskId].tArrowTaskId); + Free((struct ListItem *)(GetWordTaskArg(taskId, tListPointerElemId))); + DestroyListMenuTask(gTasks[taskId].tMenuTaskId, NULL, NULL); + ClearStdWindowAndFrame(gTasks[taskId].tWindowId, TRUE); + RemoveWindow(gTasks[taskId].tWindowId); + DestroyTask(taskId); + } +} + +#undef tWindowId +#undef tMenuTaskId +#undef tArrowTaskId +#undef tScrollOffset +#undef tListPointerElemId diff --git a/src/list_menu.c b/src/list_menu.c index 124d39ba43..6b8db8dafc 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -392,7 +392,10 @@ s32 ListMenu_ProcessInput(u8 listTaskId) if (JOY_NEW(A_BUTTON)) { - return list->template.items[list->scrollOffset + list->selectedRow].id; + if (list->template.isDynamic) + return list->scrollOffset + list->selectedRow; + else + return list->template.items[list->scrollOffset + list->selectedRow].id; } else if (JOY_NEW(B_BUTTON)) { @@ -612,7 +615,6 @@ static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOff s32 i; u8 x, y; u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; - for (i = 0; i < count; i++) { if (list->template.items[startIndex].id != LIST_HEADER) @@ -621,10 +623,16 @@ static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOff x = list->template.header_X; y = (yOffset + i) * yMultiplier + list->template.upText_Y; - if (list->template.itemPrintFunc != NULL) - list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].id, y); - - ListMenuPrint(list, list->template.items[startIndex].name, x, y); + if (list->template.isDynamic) + { + list->template.itemPrintFunc(list->template.windowId, startIndex, y); + } + else + { + if (list->template.itemPrintFunc != NULL) + list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].id, y); + ListMenuPrint(list, list->template.items[startIndex].name, x, y); + } startIndex++; } } @@ -711,7 +719,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow != 0) { selectedRow--; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -725,7 +733,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow > newRow) { selectedRow--; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -747,7 +755,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow < list->template.maxShowed - 1) { selectedRow++; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -761,7 +769,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow < newRow) { selectedRow++; - if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) + if (list->template.isDynamic || list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -825,16 +833,26 @@ bool8 ListMenuChangeSelectionFull(struct ListMenu *list, bool32 updateCursor, bo oldSelectedRow = list->selectedRow; cursorCount = 0; selectionChange = 0; + for (i = 0; i < count; i++) { - do + if (list->template.isDynamic) { u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown); selectionChange |= ret; - if (ret != 2) - break; cursorCount++; - } while (list->template.items[list->scrollOffset + list->selectedRow].id == LIST_HEADER); + } + else + { + do + { + u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown); + selectionChange |= ret; + if (ret != 2) + break; + cursorCount++; + } while (list->template.items[list->scrollOffset + list->selectedRow].id == LIST_HEADER); + } } if (updateCursor) diff --git a/src/strings.c b/src/strings.c index fd92b31e92..372af24456 100644 --- a/src/strings.c +++ b/src/strings.c @@ -972,6 +972,9 @@ ALIGNED(4) const u8 gText_FrontierFacilityRoomsCleared[] = _("Rooms cleared: {ST ALIGNED(4) const u8 gText_FrontierFacilityKOsStreak[] = _("KOs in a row: {STR_VAR_2}"); ALIGNED(4) const u8 gText_FrontierFacilityFloorsCleared[] = _("Floors cleared: {STR_VAR_2}"); ALIGNED(4) const u8 gText_123Dot[][3] = {_("1."), _("2."), _("3.")}; +const u8 gText_FrontierFacilityTotalCaughtSpeciesBanned[] = _(" and {STR_VAR_2} of the POKéMON species\nyou caught are inelegible"); +const u8 gText_FrontierFacilityIncluding[] = _(".\pThese include "); +const u8 gText_FrontierFacilityAreInelegible[] = _(" are inelegible"); const u8 gText_SavingDontTurnOff2[] = _("SAVING…\nDON'T TURN OFF THE POWER."); const u8 gText_BlenderMaxSpeedRecord[] = _("BERRY BLENDER\nMAXIMUM SPEED RECORD!"); From 95c2a6e2b6aed8e1849b68c5804c3484b608f125 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Fri, 24 Oct 2025 14:00:23 +0100 Subject: [PATCH 093/183] Multibattle testing system (#7257) Co-authored-by: hedara90 <90hedara@gmail.com> Co-authored-by: Martin Griffin --- docs/tutorials/how_to_testing_system.md | 32 +- include/battle.h | 2 +- include/battle_controllers.h | 4 + include/constants/battle.h | 13 +- include/recorded_battle.h | 4 +- include/test/battle.h | 156 +++++++++- include/test/test_runner_battle.h | 6 + src/battle_ai_main.c | 22 +- src/battle_controller_opponent.c | 38 ++- src/battle_controller_player.c | 48 +-- src/battle_controller_player_partner.c | 12 +- src/battle_controller_recorded_opponent.c | 21 +- src/battle_controller_recorded_partner.c | 269 +++++++++++++++++ src/battle_controller_recorded_player.c | 76 +++-- src/battle_controllers.c | 39 ++- src/battle_main.c | 10 +- src/battle_message.c | 77 ++++- src/battle_script_commands.c | 7 +- src/battle_tower.c | 22 +- src/recorded_battle.c | 12 +- test/battle/ai/ai_doubles.c | 32 +- test/battle/ai/ai_multi.c | 127 ++++++++ test/battle/ai/ai_switching.c | 244 ++++++++++++++++ test/battle/damage_formula.c | 104 ++++++- test/battle/end_turn_effects.c | 89 +++++- test/battle/move.c | 44 +++ test/battle/switch_in_abilities.c | 121 ++++++++ test/test_runner_battle.c | 339 +++++++++++++++++++--- 28 files changed, 1799 insertions(+), 171 deletions(-) create mode 100644 include/test/test_runner_battle.h create mode 100644 src/battle_controller_recorded_partner.c create mode 100644 test/battle/ai/ai_multi.c diff --git a/docs/tutorials/how_to_testing_system.md b/docs/tutorials/how_to_testing_system.md index b663ad54b4..53b56bd26b 100644 --- a/docs/tutorials/how_to_testing_system.md +++ b/docs/tutorials/how_to_testing_system.md @@ -164,17 +164,17 @@ ASSUMPTIONS ``` ### `SINGLE_BATTLE_TEST` -`SINGLE_BATTLE_TEST(name, results...)` and `DOUBLE_BATTLE_TEST(name, results...)` -Define single- and double- battles. The names should start with the name of the mechanic being tested so that it is easier to run all the related tests. `results` contains variable declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. -The main differences for doubles are: +`SINGLE_BATTLE_TEST(name, results...)`, `DOUBLE_BATTLE_TEST(name, results...)`, `MULTI_BATTLE_TEST(name, results...)`, `TWO_VS_ONE_BATTLE_TEST(name, results...)`, and `ONE_VS_TWO_BATTLE_TEST(name, results...)` +Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- battles. The names should start with the name of the mechanic being tested so that it is easier to run all the related tests. `results` contains variable declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. +The main differences for doubles, 2v2, 2v1, and 1v2 are: - Move targets sometimes need to be explicit. - Instead of `player` and `opponent` there is `playerLeft`, `playerRight`, `opponentLeft`, and `opponentRight`. ### `AI_SINGLE_BATTLE_TEST` -`AI_SINGLE_BATTLE_TEST(name, results...)` and `AI_DOUBLE_BATTLE_TEST(name, results...)` +`AI_SINGLE_BATTLE_TEST(name, results...)`, `AI_DOUBLE_BATTLE_TEST(name, results...)`, `AI_MULTI_BATTLE_TEST(name, results...)`, `AI_TWO_VS_ONE_BATTLE_TEST(name, results...)`, and `AI_ONE_VS_TWO_BATTLE_TEST(name, results...)` Define battles where opponent mons are controlled by AI, the same that runs when battling regular Trainers. The flags for AI should be specified by the `AI_FLAGS` command. -The rules remain the same as with the `SINGLE` and `DOUBLE` battle tests with some differences: +The rules remain the same as with the `SINGLE`, `DOUBLE`, `MULTI`, `TWO_VS_ONE`, and `ONE_VS_TWO` battle tests with some differences: - opponent's action is specified by the `EXPECT_MOVE` / `EXPECT_SEND_OUT` / `EXPECT_SWITCH` commands - we don't control what opponent actually does, instead we make sure the opponent does what we expect it to do - we still control the player's action the same way @@ -268,7 +268,7 @@ GIVEN { ``` ### `PLAYER` and `OPPONENT` -`PLAYER(species)` and `OPPONENT(species` +`PLAYER(species)` and `OPPONENT(species)` Adds the species to the player's or opponent's party respectively. The Pokémon can be further customized with the following functions: - `Gender(MON_MALE | MON_FEMALE)` @@ -285,11 +285,29 @@ For example to create a level 42 Wobbuffet that is poisoned: **Note if Speed is specified for any Pokémon then it must be specified for all Pokémon.** **Note if Moves is specified then MOVE will not automatically add moves to the moveset.** +### `MULTI_PLAYER`, `MULTI_PARTNER`, `MULTI_OPPONENT_A`, and `MULTI_OPPONENT_B` +For tests using `MULTI_BATTLE_TEST`, `AI_MULTI_BATTLE_TEST`, `TWO_VS_ONE_BATTLE_TEST`, `AI_TWO_VS_ONE_BATTLE_TEST`, `ONE_VS_TWO_BATTLE_TEST`, and `AI_ONE_VS_TWO_BATTLE_TEST`, the below must be used instead of `PLAYER(species)` and `OPPONENT(species)`. +`MULTI_PLAYER(species)`, `MULTI_PARTNER(species)`, `MULTI_OPPONENT_A(species)`, and `MULTI_OPPONENT_B(species)` +Adds the species to the player's, player partner's, opponent A's, or opponent B's party, respectively. +Pokemon can be customised as per the guidance for `PLAYER(species)` and `OPPONENT(species)`. +The functions assign the Pokémon to the party of the trainer at `B_POSITION_PLAYER_LEFT`, `B_POSITION_PLAYER_RIGHT`, `B_POSITION_OPPONENT_LEFT`, and `B_POSITION_OPPONENT_RIGHT`, respectively. +`MULTI_PLAYER(species)` and `MULTI_OPPONENT_A(species)` set Pokémon starting at party index 0, while `MULTI_PARTNER(species)` and `MULTI_OPPONENT_B(species)` set Pokémon starting at party index 3. +For `ONE_VS_TWO` tests, `MULTI_PLAYER(species)` must be used for all player-side Pokémon, and for `TWO_VS_ONE` tests, `MULTI_OPPONENT_A(species)` must be used for all opponent-side Pokémon. +All `MULTI_PLAYER(species)` Pokémon must be set before any `MULTI_PARTNER(species)` Pokémon, and all `MULTI_OPPONENT_A(species)` must be set before any `MULTI_OPPONENT_B(species)` Pokémon, else Pokémon will be set in the incorrect parties in the test. +**Note where a side in a test has two trainers, the test setup manages the assigning of correct multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A Pokémon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B Pokémon may be referenced using indexes 3, 4, and 5.** + ### `AI_FLAGS` `AI_FLAGS(flags)` -Specifies which AI flags are run during the test. Has use only for AI tests. +Specifies which AI flags are run for all battlers during the test. Has use only for AI tests. The most common combination is `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)` which is the general 'smart' AI. +### `BATTLER_AI_FLAGS` +`BATTLER_AI_FLAGS(battler, flags)` +Specifies additional AI flags to be applied to specific battlers (battler 0/1/2/3). Has use only for AI tests. +Must be used strictly after `AI_FLAGS(flags)`, which overwrites all existing flags. +Example: `BATTLER_AI_FLAGS(3, AI_FLAG_RISKY)` used after `AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)` +will set `AI_FLAG_RISKY` to only `battler3` (Opponent B), in addition to the flags set by `AI_FLAGS`. + ### `WHEN` ``` ... diff --git a/include/battle.h b/include/battle.h index ad32a9e632..14c01629ab 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1223,7 +1223,7 @@ static inline struct PartyState *GetBattlerPartyState(u32 battler) static inline bool32 IsDoubleBattle(void) { - return gBattleTypeFlags & BATTLE_TYPE_DOUBLE; + return (gBattleTypeFlags & BATTLE_TYPE_MORE_THAN_TWO_BATTLERS); } static inline bool32 IsSpreadMove(u32 moveTarget) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 4f83f8eee9..0209ccbbca 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -395,6 +395,10 @@ void HandleChooseMoveAfterDma3(u32 battler); void SetControllerToRecordedPlayer(u32 battler); void RecordedPlayerBufferExecCompleted(u32 battler); +// recorded partner controller +void SetControllerToRecordedPartner(u32 battler); +void RecordedPartnerBufferExecCompleted(u32 battler); + // opponent controller void SetControllerToOpponent(u32 battler); void OpponentBufferExecCompleted(u32 battler); diff --git a/include/constants/battle.h b/include/constants/battle.h index 1f65e2a8f2..12f34a396b 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -98,10 +98,15 @@ enum BattleSide | BATTLE_TYPE_LEGENDARY \ | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE)) -#define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) -#define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) -#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) -#define BATTLE_TYPE_HAS_AI (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER | BATTLE_TYPE_INGAME_PARTNER) +#define WILD_DOUBLE_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)))) +#define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) +#define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) +#define BATTLE_TYPE_HAS_AI (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER | BATTLE_TYPE_INGAME_PARTNER) +#define BATTLE_TYPE_MORE_THAN_TWO_BATTLERS (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_TWO_OPPONENTS) + +// Multibattle test composite flags +#define BATTLE_MULTI_TEST (BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) +#define BATTLE_TWO_VS_ONE_TEST (BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI) // Battle Outcome defines #define B_OUTCOME_WON 1 diff --git a/include/recorded_battle.h b/include/recorded_battle.h index faf966109f..787cf4606c 100644 --- a/include/recorded_battle.h +++ b/include/recorded_battle.h @@ -27,7 +27,7 @@ struct RecordedBattleSave u8 frontierBrainSymbol; u8 battleScene:1; u8 textSpeed:3; - u64 AI_scripts; + u64 AI_scripts[MAX_BATTLERS_COUNT]; u8 recordMixFriendName[PLAYER_NAME_LENGTH + 1]; u8 recordMixFriendClass; u8 apprenticeId; @@ -81,7 +81,7 @@ u8 GetBattleSceneInRecordedBattle(void); u8 GetTextSpeedInRecordedBattle(void); void RecordedBattle_CopyBattlerMoves(u32 battler); void RecordedBattle_CheckMovesetChanges(u8 mode); -u64 GetAiScriptsInRecordedBattle(void); +u64 GetAiScriptsInRecordedBattle(u32 battler); void RecordedBattle_SetPlaybackFinished(void); bool8 RecordedBattle_CanStopPlayback(void); void GetRecordedBattleRecordMixFriendName(u8 *dst); diff --git a/include/test/battle.h b/include/test/battle.h index 78e6de34bb..4e779f0f0f 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -194,21 +194,22 @@ * ASSUME(GetMoveEffect(MOVE_POISON_STING) == EFFECT_POISON_HIT); * } * - * SINGLE_BATTLE_TEST(name, results...) and DOUBLE_BATTLE_TEST(name, results...) - * Define single- and double- battles. The names should start with the - * name of the mechanic being tested so that it is easier to run all the - * related tests. results contains variable declarations to be placed - * into the results array which is available in PARAMETRIZEd tests. - * The main differences for doubles are: + * SINGLE_BATTLE_TEST(name, results...), DOUBLE_BATTLE_TEST(name, results...), MULTI_BATTLE_TEST(name, results...), + * TWO_VS_ONE_BATTLE_TEST(name, results...), and ONE_VS_TWO_BATTLE_TEST(name, results...) + * Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- battles. The names should start with + * the name of the mechanic being tested so that it is easier to run all the related tests. results contains variable + * declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. + * The main differences for doubles, 2v2, 2v1, and 1v2 are: * - Move targets sometimes need to be explicit. * - Instead of player and opponent there is playerLeft, playerRight, * opponentLeft, and opponentRight. * - * AI_SINGLE_BATTLE_TEST(name, results...) and AI_DOUBLE_BATTLE_TEST(name, results...) + * AI_SINGLE_BATTLE_TEST(name, results...), AI_DOUBLE_BATTLE_TEST(name, results...), + * AI_MULTI_BATTLE_TEST(name, results...), AI_TWO_VS_ONE_BATTLE_TEST(name, results...), and AI_ONE_VS_TWO_BATTLE_TEST(name, results...) * Define battles where opponent mons are controlled by AI, the same that runs * when battling regular Trainers. The flags for AI should be specified by * the AI_FLAGS command. - * The rules remain the same as with the SINGLE and DOUBLE battle tests + * The rules remain the same as with the SINGLE, DOUBLE, MULTI, TWO_VS_ONE, and ONE_VS_TWO battle tests with some differences: * with some differences: * - opponent's action is specified by the EXPECT_MOVE(s) / EXPECT_SEND_OUT / EXPECT_SWITCH commands * - we don't control what opponent actually does, instead we make sure the opponent does what we expect it to do @@ -333,10 +334,39 @@ * Note if Moves is specified then MOVE will not automatically add moves * to the moveset. * + * For tests using MULTI_BATTLE_TEST, AI_MULTI_BATTLE_TEST, TWO_VS_ONE_BATTLE_TEST, + * AI_TWO_VS_ONE_BATTLE_TEST, ONE_VS_TWO_BATTLE_TEST, and AI_ONE_VS_TWO_BATTLE_TEST, + * the below must be used instead of PLAYER(species) and OPPONENT(species). + * MULTI_PLAYER(species), MULTI_PARTNER(species), MULTI_OPPONENT_A(species), and + * MULTI_OPPONENT_B(species) Adds the species to the player's, player partner's, + * opponent A's, or opponent B's party, respectively. + * Pokemon can be customised as per the guidance for PLAYER(species) and OPPONENT(species). + * The functions assign the Pokémon to the party of the trainer at B_POSITION_PLAYER_LEFT, + * B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_LEFT, and B_POSITION_OPPONENT_RIGHT, respectively. + * MULTI_PLAYER(species) and MULTI_OPPONENT_A(species) set Pokémon starting at party index 0, + * while MULTI_PARTNER(species) and MULTI_OPPONENT_B(species) set Pokémon starting at party + * index 3. + * For ONE_VS_TWO tests, MULTI_PLAYER(species) must be used for all player-side Pokémon, + * and for TWO_VS_ONE tests, MULTI_OPPONENT_A(species) must be used for all opponent-side + * Pokémon. + * All MULTI_PLAYER(species) Pokémon must be set before any MULTI_PARTNER(species) Pokémon, + * and all MULTI_OPPONENT_A(species) must be set before any MULTI_OPPONENT_B(species) Pokémon, + * else Pokémon will be set in the incorrect parties in the test. + * Note where a side in a test has two trainers, the test setup manages the assigning of correct + * multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A + * Pokémon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B + * Pokémon may be referenced using indexes 3, 4, and 5. + * * AI_FLAGS - * Specifies which AI flags are run during the test. Has use only for AI tests. + * Specifies which AI flags are run for all battlers during the test. Has use only for AI tests. * The most common combination is AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT) * which is the general 'smart' AI. + * + * BATTLER_AI_FLAGS + * Specifies additional AI flags to be applied to specific battlers (battler 0/1/2/3). Has use only for AI tests. + * Must be used strictly after AI_FLAGS(flags), which overwrites all existing flags. + * Example: BATTLER_AI_FLAGS(3, AI_FLAG_RISKY) used after AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT) + * will set AI_FLAG_RISKY to only battler3 (Opponent B), in addition to the flags set by AI_FLAGS. * * WHEN * Contains the choices that battlers make during the battle. @@ -537,10 +567,13 @@ #define MAX_QUEUED_EVENTS 30 #define MAX_EXPECTED_ACTIONS 10 -enum { BATTLE_TEST_SINGLES, BATTLE_TEST_DOUBLES, BATTLE_TEST_WILD, BATTLE_TEST_AI_SINGLES, BATTLE_TEST_AI_DOUBLES }; +enum { BATTLE_TEST_SINGLES, BATTLE_TEST_DOUBLES, BATTLE_TEST_WILD, BATTLE_TEST_AI_SINGLES, BATTLE_TEST_AI_DOUBLES, BATTLE_TEST_MULTI, BATTLE_TEST_AI_MULTI, BATTLE_TEST_TWO_VS_ONE, BATTLE_TEST_AI_TWO_VS_ONE, BATTLE_TEST_ONE_VS_TWO, BATTLE_TEST_AI_ONE_VS_TWO }; typedef void (*SingleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *); typedef void (*DoubleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); +typedef void (*MultiBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); +typedef void (*TwoVsOneBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); +typedef void (*OneVsTwoBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); struct BattleTest { @@ -549,6 +582,9 @@ struct BattleTest { SingleBattleTestFunction singles; DoubleBattleTestFunction doubles; + MultiBattleTestFunction multi; + TwoVsOneBattleTestFunction two_vs_one; + OneVsTwoBattleTestFunction one_vs_two; } function; size_t resultsSize; }; @@ -688,11 +724,11 @@ struct BattleTestData u8 playerPartySize; u8 opponentPartySize; - u8 explicitMoves[NUM_BATTLE_SIDES]; + u8 explicitMoves[MAX_BATTLERS_COUNT]; bool8 hasExplicitSpeeds; - u8 explicitSpeeds[NUM_BATTLE_SIDES]; + u8 explicitSpeeds[MAX_BATTLERS_COUNT]; u16 slowerThan[NUM_BATTLE_SIDES][PARTY_SIZE]; - u8 currentSide; + u8 currentPosition; u8 currentPartyIndex; struct Pokemon *currentMon; u8 gender; @@ -767,6 +803,8 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState; #define R_APPEND_TRUE(...) __VA_OPT__(FIRST(__VA_ARGS__), TRUE RECURSIVELY(R_FOR_EACH(APPEND_COMMA_TRUE, EXCEPT_1(__VA_ARGS__)))) #define AI_TRAINER_NAME "{PKMN} TRAINER LEAF" +#define AI_TRAINER_2_NAME "{PKMN} TRAINER RED" +#define AI_PARTNER_NAME "{PKMN} TRAINER 1" /* Test */ @@ -812,6 +850,60 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState; }; \ static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + #define BATTLE_TEST_ARGS_MULTI(_name, _type, ...) \ + struct CAT(Result, __LINE__) { RECURSIVELY(R_FOR_EACH(APPEND_SEMICOLON, __VA_ARGS__)) }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); \ + __attribute__((section(".tests"), used)) static const struct Test CAT(sTest, __LINE__) = \ + { \ + .name = _name, \ + .filename = __FILE__, \ + .runner = &gBattleTestRunner, \ + .sourceLine = __LINE__, \ + .data = (void *)&(const struct BattleTest) \ + { \ + .type = _type, \ + .function = { .multi = (MultiBattleTestFunction)CAT(Test, __LINE__) }, \ + .resultsSize = sizeof(struct CAT(Result, __LINE__)), \ + }, \ + }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + +#define BATTLE_TEST_ARGS_TWO_VS_ONE(_name, _type, ...) \ + struct CAT(Result, __LINE__) { RECURSIVELY(R_FOR_EACH(APPEND_SEMICOLON, __VA_ARGS__)) }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); \ + __attribute__((section(".tests"), used)) static const struct Test CAT(sTest, __LINE__) = \ + { \ + .name = _name, \ + .filename = __FILE__, \ + .runner = &gBattleTestRunner, \ + .sourceLine = __LINE__, \ + .data = (void *)&(const struct BattleTest) \ + { \ + .type = _type, \ + .function = { .two_vs_one = (TwoVsOneBattleTestFunction)CAT(Test, __LINE__) }, \ + .resultsSize = sizeof(struct CAT(Result, __LINE__)), \ + }, \ + }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + +#define BATTLE_TEST_ARGS_ONE_VS_TWO(_name, _type, ...) \ + struct CAT(Result, __LINE__) { RECURSIVELY(R_FOR_EACH(APPEND_SEMICOLON, __VA_ARGS__)) }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); \ + __attribute__((section(".tests"), used)) static const struct Test CAT(sTest, __LINE__) = \ + { \ + .name = _name, \ + .filename = __FILE__, \ + .runner = &gBattleTestRunner, \ + .sourceLine = __LINE__, \ + .data = (void *)&(const struct BattleTest) \ + { \ + .type = _type, \ + .function = { .one_vs_two = (OneVsTwoBattleTestFunction)CAT(Test, __LINE__) }, \ + .resultsSize = sizeof(struct CAT(Result, __LINE__)), \ + }, \ + }; \ + static void CAT(Test, __LINE__)(struct CAT(Result, __LINE__) *results, const u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight) + #define SINGLE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_SINGLE(_name, BATTLE_TEST_SINGLES, __VA_ARGS__) #define WILD_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_SINGLE(_name, BATTLE_TEST_WILD, __VA_ARGS__) @@ -820,6 +912,15 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState; #define DOUBLE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_DOUBLE(_name, BATTLE_TEST_DOUBLES, __VA_ARGS__) #define AI_DOUBLE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_DOUBLE(_name, BATTLE_TEST_AI_DOUBLES, __VA_ARGS__) +#define MULTI_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_MULTI(_name, BATTLE_TEST_MULTI, __VA_ARGS__) +#define AI_MULTI_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_MULTI(_name, BATTLE_TEST_AI_MULTI, __VA_ARGS__) + +#define TWO_VS_ONE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_TWO_VS_ONE, __VA_ARGS__) +#define AI_TWO_VS_ONE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_AI_TWO_VS_ONE, __VA_ARGS__) + +#define ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_ONE_VS_TWO, __VA_ARGS__) +#define AI_ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_AI_ONE_VS_TWO, __VA_ARGS__) + /* Parametrize */ #undef PARAMETRIZE // Override test/test.h's implementation. @@ -848,13 +949,18 @@ struct moveWithPP { #define RNGSeed(seed) RNGSeed_(__LINE__, seed) #define AI_FLAGS(flags) AIFlags_(__LINE__, flags) +#define BATTLER_AI_FLAGS(battler, flags) BattlerAIFlags_(__LINE__, battler, flags) #define AI_LOG AILogScores(__LINE__) #define FLAG_SET(flagId) SetFlagForTest(__LINE__, flagId) #define WITH_CONFIG(configTag, value) TestSetConfig(__LINE__, configTag, value) -#define PLAYER(species) for (OpenPokemon(__LINE__, B_SIDE_PLAYER, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) -#define OPPONENT(species) for (OpenPokemon(__LINE__, B_SIDE_OPPONENT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define PLAYER(species) for (OpenPokemon(__LINE__, B_POSITION_PLAYER_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define OPPONENT(species) for (OpenPokemon(__LINE__, B_POSITION_OPPONENT_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_PLAYER(species) for (OpenPokemonMulti(__LINE__, B_POSITION_PLAYER_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_OPPONENT_A(species) for (OpenPokemonMulti(__LINE__, B_POSITION_OPPONENT_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_PARTNER(species) for (OpenPokemonMulti(__LINE__, B_POSITION_PLAYER_RIGHT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_OPPONENT_B(species) for (OpenPokemonMulti(__LINE__, B_POSITION_OPPONENT_RIGHT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) #define Gender(gender) Gender_(__LINE__, gender) #define Nature(nature) Nature_(__LINE__, nature) @@ -888,11 +994,13 @@ struct moveWithPP { void SetFlagForTest(u32 sourceLine, u16 flagId); void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value); void ClearFlagAfterTest(void); -void OpenPokemon(u32 sourceLine, enum BattleSide side, u32 species); +void OpenPokemon(u32 sourceLine, enum BattlerPosition position, u32 species); +void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species); void ClosePokemon(u32 sourceLine); void RNGSeed_(u32 sourceLine, rng_value_t seed); void AIFlags_(u32 sourceLine, u64 flags); +void BattlerAIFlags_(u32 sourceLine, u32 battler, u64 flags); void AILogScores(u32 sourceLine); void Gender_(u32 sourceLine, u32 gender); void Nature_(u32 sourceLine, u32 nature); @@ -923,6 +1031,22 @@ void TeraType_(u32 sourceLine, u32 teraType); void Shadow_(u32 sourceLine, bool32 isShadow); void Shiny_(u32 sourceLine, bool32 isShiny); +static inline bool8 IsMultibattleTest(void) +{ + if (TESTING) + { + if (((gBattleTypeFlags & BATTLE_MULTI_TEST) == BATTLE_MULTI_TEST) + || ((gBattleTypeFlags & BATTLE_TWO_VS_ONE_TEST) == BATTLE_TWO_VS_ONE_TEST)) + return TRUE; + else + return FALSE; + } + else + { + return FALSE; + } +} + // Created for easy use of EXPECT_MOVES, so the user can provide 1, 2, 3 or 4 moves for AI which can pass the test. struct FourMoves { diff --git a/include/test/test_runner_battle.h b/include/test/test_runner_battle.h new file mode 100644 index 0000000000..8a2c0dc64b --- /dev/null +++ b/include/test/test_runner_battle.h @@ -0,0 +1,6 @@ +#ifndef GUARD_BATTLE_TEST_RUNNER_H +#define GUARD_BATTLE_TEST_RUNNER_H + +bool8 IsMultibattleTest(void); + +#endif diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index e84d7313a6..ce7ab09768 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -182,7 +182,7 @@ static u64 GetWildAiFlags(void) return flags; } -static u64 GetAiFlags(u16 trainerId) +static u64 GetAiFlags(u16 trainerId, u32 battler) { u64 flags = 0; @@ -195,7 +195,7 @@ static u64 GetAiFlags(u16 trainerId) else { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - flags = GetAiScriptsInRecordedBattle(); + flags = GetAiScriptsInRecordedBattle(battler); else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) flags = AI_FLAG_SAFARI; else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) @@ -232,7 +232,7 @@ static u64 GetAiFlags(u16 trainerId) void BattleAI_SetupFlags(void) { if (IsAiVsAiBattle()) - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId, B_POSITION_PLAYER_LEFT); else gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = 0; // player has no AI @@ -246,8 +246,8 @@ void BattleAI_SetupFlags(void) if (IsWildMonSmart() && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER))) { // smart wild AI - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF); - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF, B_POSITION_OPPONENT_LEFT); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF, B_POSITION_OPPONENT_RIGHT); // The check is here because wild natural enemies are not symmetrical. if (B_WILD_NATURAL_ENEMIES && IsDoubleBattle()) @@ -259,20 +259,19 @@ void BattleAI_SetupFlags(void) if (IsNaturalEnemy(speciesRight, speciesLeft)) gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] |= AI_FLAG_ATTACKS_PARTNER; } - } else { - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); - if (TRAINER_BATTLE_PARAM.opponentB != 0 && TRAINER_BATTLE_PARAM.opponentB != 0xFFFF) - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA, B_POSITION_OPPONENT_LEFT); + if ((TRAINER_BATTLE_PARAM.opponentB != 0) && (TRAINER_BATTLE_PARAM.opponentB != 0xFFFF)) + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB, B_POSITION_OPPONENT_RIGHT); else gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; } if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId, B_POSITION_PLAYER_RIGHT); } else if (IsDoubleBattle() && IsAiVsAiBattle()) { @@ -280,7 +279,8 @@ void BattleAI_SetupFlags(void) } else // Assign ai flags for player for prediction { - u64 aiFlags = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA) | GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); + u64 aiFlags = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA, B_POSITION_OPPONENT_LEFT) + | GetAiFlags(TRAINER_BATTLE_PARAM.opponentB, B_POSITION_OPPONENT_RIGHT); gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = aiFlags; gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = aiFlags; } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 51322c0315..8c41359b7a 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -39,6 +39,8 @@ #include "constants/trainers.h" #include "trainer_hill.h" #include "test_runner.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" static void OpponentHandleDrawTrainerPic(u32 battler); static void OpponentHandleTrainerSlideBack(u32 battler); @@ -369,18 +371,40 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) static void OpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; - u32 trainerPicId = OpponentGetTrainerPicId(battler); - - if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) + u32 trainerPicId; + + // Sets Multibattle test opponent sprites to not be Hiker + if (IsMultibattleTest()) { - if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT) + { + trainerPicId = TRAINER_PIC_LEAF; + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + xPos = 176; + else + xPos = 200; + } + else + { + trainerPicId = TRAINER_PIC_RED; xPos = 152; - else // first mon - xPos = 200; + } } else { - xPos = 176; + trainerPicId = OpponentGetTrainerPicId(battler); + + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) + { + if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon + xPos = 152; + else // first mon + xPos = 200; + } + else + { + xPos = 176; + } } BtlController_HandleDrawTrainerPic(battler, trainerPicId, TRUE, xPos, 40, -1); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index b5a5e7abec..6b6c5a65ba 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -46,6 +46,8 @@ #include "pokemon_summary_screen.h" #include "type_icons.h" #include "pokedex.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" static void PlayerHandleLoadMonSprite(u32 battler); static void PlayerHandleDrawTrainerPic(u32 battler); @@ -1865,30 +1867,40 @@ static void PlayerHandleDrawTrainerPic(u32 battler) bool32 isFrontPic; s16 xPos, yPos; u32 trainerPicId; - - trainerPicId = PlayerGetTrainerBackPicId(); - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + if (IsMultibattleTest()) { - if ((GetBattlerPosition(battler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. - xPos = 90; - else // First mon, on the left. + trainerPicId = TRAINER_BACK_PIC_BRENDAN; + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) xPos = 32; - - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId < TRAINER_PARTNER(PARTNER_NONE)) - { - xPos = 90; - yPos = 80; - } else - { - yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; - } - + xPos = 80; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } else { - xPos = 80; - yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + trainerPicId = PlayerGetTrainerBackPicId(); + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if ((GetBattlerPosition(battler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. + xPos = 90; + else // First mon, on the left. + xPos = 32; + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId < TRAINER_PARTNER(PARTNER_NONE)) + { + xPos = 90; + yPos = 80; + } + else + { + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } + } + else + { + xPos = 80; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } } // Use front pic table for any tag battles unless your partner is Steven or a custom partner. diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 2872a83c31..6973dbbc28 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -31,6 +31,8 @@ #include "constants/songs.h" #include "constants/party_menu.h" #include "constants/trainers.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" static void PlayerPartnerHandleDrawTrainerPic(u32 battler); static void PlayerPartnerHandleTrainerSlideBack(u32 battler); @@ -204,7 +206,13 @@ static void PlayerPartnerHandleDrawTrainerPic(u32 battler) enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); - if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + if (IsMultibattleTest()) + { + trainerPicId = TRAINER_BACK_PIC_STEVEN; + xPos = 90; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } + else if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; xPos = 90; @@ -309,6 +317,8 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) gBattleStruct->AI_monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; } + if (TESTING) + TestRunner_Battle_CheckSwitch(battler, chosenMonId); BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL); BtlController_Complete(battler); } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 21ecb79801..954fdc4bc3 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -31,6 +31,8 @@ #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/trainers.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" static void RecordedOpponentHandleDrawTrainerPic(u32 battler); static void RecordedOpponentHandleTrainerSlideBack(u32 battler); @@ -273,7 +275,24 @@ static void RecordedOpponentHandleDrawTrainerPic(u32 battler) s16 xPos; u32 trainerPicId; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + // Sets Multibattle test opponent sprites to not be Hiker + if (IsMultibattleTest()) + { + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT) + { + trainerPicId = TRAINER_PIC_LEAF; + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + xPos = 176; + else + xPos = 200; + } + else + { + trainerPicId = TRAINER_PIC_RED; + xPos = 152; + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon xPos = 152; diff --git a/src/battle_controller_recorded_partner.c b/src/battle_controller_recorded_partner.c new file mode 100644 index 0000000000..d135329635 --- /dev/null +++ b/src/battle_controller_recorded_partner.c @@ -0,0 +1,269 @@ +#include "global.h" +#include "battle.h" +#include "battle_ai_main.h" +#include "battle_ai_util.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_message.h" +#include "battle_interface.h" +#include "battle_setup.h" +#include "battle_tower.h" +#include "battle_z_move.h" +#include "bg.h" +#include "data.h" +#include "item_use.h" +#include "link.h" +#include "main.h" +#include "m4a.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeball.h" +#include "pokemon.h" +#include "recorded_battle.h" +#include "reshow_battle_screen.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" +#include "test_runner.h" +#include "text.h" +#include "util.h" +#include "window.h" +#include "constants/battle_anim.h" +#include "constants/battle_partner.h" +#include "constants/songs.h" +#include "constants/party_menu.h" +#include "constants/trainers.h" + +static void RecordedPartnerHandleDrawTrainerPic(u32 battler); +static void RecordedPartnerHandleTrainerSlideBack(u32 battler); +static void RecordedPartnerHandleChooseAction(u32 battler); +static void RecordedPartnerHandleChooseMove(u32 battler); +static void RecordedPartnerHandleChoosePokemon(u32 battler); +static void RecordedPartnerHandleIntroTrainerBallThrow(u32 battler); +static void RecordedPartnerHandleDrawPartyStatusSummary(u32 battler); +static void RecordedPartnerHandleEndLinkBattle(u32 battler); +static void RecordedPartnerBufferRunCommand(u32 battler); + +static void (*const sRecordedPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = +{ + [CONTROLLER_GETMONDATA] = BtlController_HandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = BtlController_Empty, + [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = RecordedPartnerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, + [CONTROLLER_TRAINERSLIDEBACK] = RecordedPartnerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = BtlController_Empty, + [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, + [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, + [CONTROLLER_PAUSE] = BtlController_Empty, + [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty, + [CONTROLLER_CHOOSEACTION] = RecordedPartnerHandleChooseAction, + [CONTROLLER_YESNOBOX] = BtlController_Empty, + [CONTROLLER_CHOOSEMOVE] = RecordedPartnerHandleChooseMove, + [CONTROLLER_OPENBAG] = BtlController_Empty, + [CONTROLLER_CHOOSEPOKEMON] = RecordedPartnerHandleChoosePokemon, + [CONTROLLER_23] = BtlController_Empty, + [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, // Partner's player gets experience the same way as the player. + [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, + [CONTROLLER_STATUSXOR] = BtlController_Empty, + [CONTROLLER_DATATRANSFER] = BtlController_Empty, + [CONTROLLER_DMA3TRANSFER] = BtlController_Empty, + [CONTROLLER_PLAYBGM] = BtlController_Empty, + [CONTROLLER_32] = BtlController_Empty, + [CONTROLLER_TWORETURNVALUES] = BtlController_Empty, + [CONTROLLER_CHOSENMONRETURNVALUE] = BtlController_Empty, + [CONTROLLER_ONERETURNVALUE] = BtlController_Empty, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty, + [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, + [CONTROLLER_CANTSWITCH] = BtlController_Empty, + [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = BtlController_HandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = BtlController_HandleFaintingCry, + [CONTROLLER_INTROSLIDE] = BtlController_HandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedPartnerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedPartnerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = BtlController_Empty, + [CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty, + [CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty, + [CONTROLLER_ENDLINKBATTLE] = RecordedPartnerHandleEndLinkBattle, + [CONTROLLER_DEBUGMENU] = BtlController_Empty, + [CONTROLLER_TERMINATOR_NOP] = BtlController_TerminatorNop +}; + +void SetControllerToRecordedPartner(u32 battler) +{ + gBattlerControllerEndFuncs[battler] = RecordedPartnerBufferExecCompleted; + gBattlerControllerFuncs[battler] = RecordedPartnerBufferRunCommand; +} + +static void RecordedPartnerBufferRunCommand(u32 battler) +{ + if (IsBattleControllerActiveOnLocal(battler)) + { + if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPartnerBufferCommands)) + sRecordedPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); + else + BtlController_Complete(battler); + } +} + +static void Intro_WaitForHealthbox(u32 battler) +{ + bool32 finished = FALSE; + + if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + { + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) + finished = TRUE; + } + else + { + if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy + && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(battler)]].callback == SpriteCallbackDummy) + { + finished = TRUE; + } + } + + if (IsCryPlayingOrClearCrySongs()) + finished = FALSE; + + if (finished) + { + gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3; + gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd; + } +} + +void Controller_RecordedPartnerShowIntroHealthbox(u32 battler) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].ballAnimActive + && gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy + && ++gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay != 1) + { + gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0; + TryShinyAnimation(battler, GetBattlerMon(battler)); + + if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + DestroySprite(&gSprites[gBattleControllerData[BATTLE_PARTNER(battler)]]); + UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(battler)], GetBattlerMon(BATTLE_PARTNER(battler)), HEALTHBOX_ALL); + StartHealthboxSlideIn(BATTLE_PARTNER(battler)); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(battler)]); + } + + DestroySprite(&gSprites[gBattleControllerData[battler]]); + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); + StartHealthboxSlideIn(battler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); + + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + + gBattlerControllerFuncs[battler] = Intro_WaitForHealthbox; + } +} + +void RecordedPartnerBufferExecCompleted(u32 battler) +{ + gBattlerControllerFuncs[battler] = RecordedPartnerBufferRunCommand; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + u8 playerId = GetMultiplayerId(); + + PrepareBufferDataTransferLink(battler, B_COMM_CONTROLLER_IS_DONE, 4, &playerId); + gBattleResources->bufferA[battler][0] = CONTROLLER_TERMINATOR_NOP; + } + else + { + MarkBattleControllerIdleOnLocal(battler); + } +} + +// some explanation here +// in emerald it's possible to have a tag battle in the battle frontier facilities with AI +// which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it +static void RecordedPartnerHandleDrawTrainerPic(u32 battler) +{ + bool32 isFrontPic; + s16 xPos, yPos; + u32 trainerPicId; + + trainerPicId = TRAINER_BACK_PIC_STEVEN; + xPos = 90; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + + isFrontPic = FALSE; + + BtlController_HandleDrawTrainerPic(battler, trainerPicId, isFrontPic, xPos, yPos, -1); +} + +static void RecordedPartnerHandleTrainerSlideBack(u32 battler) +{ + BtlController_HandleTrainerSlideBack(battler, 35, FALSE); +} + +static void RecordedPartnerHandleChooseAction(u32 battler) +{ + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0); + BtlController_Complete(battler); +} + +static void RecordedPartnerHandleChooseMove(u32 battler) +{ + u8 moveIndex = RecordedBattle_GetBattlerAction(RECORDED_MOVE_SLOT, battler); + u8 target = RecordedBattle_GetBattlerAction(RECORDED_MOVE_TARGET, battler); + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveIndex | (target << 8)); + + BtlController_Complete(battler); +} + +static void RecordedPartnerHandleChoosePokemon(u32 battler) +{ + gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler); + gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing + BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL); + BtlController_Complete(battler); +} + +static void RecordedPartnerHandleIntroTrainerBallThrow(u32 battler) +{ + const u16 *trainerPal; + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); + + if (gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + trainerPal = gTrainerBacksprites[gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerPic].palette.data; + else if (IsAiVsAiBattle()) + trainerPal = gTrainerSprites[GetTrainerPicFromId(gPartnerTrainerId)].palette.data; + else + trainerPal = gTrainerSprites[GetFrontierTrainerFrontSpriteId(gPartnerTrainerId)].palette.data; // 2 vs 2 multi battle in Battle Frontier, load front sprite and pal. + + BtlController_HandleIntroTrainerBallThrow(battler, 0xD6F9, trainerPal, 24, Controller_RecordedPartnerShowIntroHealthbox); +} + +static void RecordedPartnerHandleDrawPartyStatusSummary(u32 battler) +{ + BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); +} + +static void RecordedPartnerHandleEndLinkBattle(u32 battler) +{ + gBattleOutcome = gBattleResources->bufferA[battler][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + BtlController_Complete(battler); + gBattlerControllerFuncs[battler] = SetBattleEndCallbacks; +} diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index c86cf4a9d5..51bfa5327b 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -28,6 +28,8 @@ #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/trainers.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" static void RecordedPlayerHandleDrawTrainerPic(u32 battler); static void RecordedPlayerHandleTrainerSlideBack(u32 battler); @@ -40,7 +42,6 @@ static void RecordedPlayerHandleStatusAnimation(u32 battler); static void RecordedPlayerHandleIntroTrainerBallThrow(u32 battler); static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler); static void RecordedPlayerHandleEndLinkBattle(u32 battler); - static void RecordedPlayerBufferRunCommand(u32 battler); static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = @@ -275,43 +276,54 @@ static void RecordedPlayerHandleDrawTrainerPic(u32 battler) s16 xPos, yPos; u32 trainerPicId; - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + // Sets Multibattle test player sprites to not be Hiker + if (IsMultibattleTest()) { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - trainerPicId = GetBattlerLinkPlayerGender(battler); - else - trainerPicId = gLinkPlayers[gRecordedBattleMultiplayerId].gender; - } - else - { - trainerPicId = gLinkPlayers[0].gender; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon - xPos = 90; - else // first mon - xPos = 32; - + trainerPicId = TRAINER_BACK_PIC_BRENDAN; if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - { - xPos = 90; - yPos = 80; - } + xPos = 32; else - { - yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; - } - - } - else - { - xPos = 80; + xPos = 80; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + trainerPicId = GetBattlerLinkPlayerGender(battler); + else + trainerPicId = gLinkPlayers[gRecordedBattleMultiplayerId].gender; + } + else + trainerPicId = gLinkPlayers[0].gender; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon + xPos = 90; + else // first mon + xPos = 32; + + // !TESTING added as otherwise first test battle sprite is positioned incorrectly + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && !TESTING) + { + xPos = 90; + yPos = 80; + } + else + { + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } + } + else + { + xPos = 80; + yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; + } + } + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && !TESTING) isFrontPic = TRUE; else isFrontPic = FALSE; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 8adfbd4880..cf55146376 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -29,6 +29,9 @@ #include "constants/abilities.h" #include "constants/item_effects.h" #include "constants/songs.h" +#include "test/battle.h" +#include "test/test.h" +#include "test/test_runner_battle.h" #include "pokemon_animation.h" static EWRAM_DATA u8 sLinkSendTaskId = 0; @@ -144,6 +147,7 @@ static void InitBtlControllersInternal(void) if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) || !isMulti + || (IsMultibattleTest()) || (!isLink && !isRecorded) || (isLink && !isDouble)) { @@ -202,7 +206,7 @@ static void InitBtlControllersInternal(void) // Opponent 1 bool32 isOpponent1Recorded; if (isDouble) - isOpponent1Recorded = (!isInGamePartner && isRecorded && !isMulti && isRecordedLink); + isOpponent1Recorded = ((!isInGamePartner && isRecorded && !isMulti && isRecordedLink) || (IsMultibattleTest() && isRecordedLink)); else isOpponent1Recorded = isRecorded && isRecordedLink; @@ -212,17 +216,35 @@ static void InitBtlControllersInternal(void) gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_1)] = SetControllerToOpponent; // Player 2 - if (isInGamePartner) + if (IsMultibattleTest() && isRecordedLink) + { + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToRecordedPartner; + } + else if (IsMultibattleTest() && isRecorded && !isRecordedLink) + { // Sets to PlayerPartner if EXPECT_XXXX used in test for partner trainer, else sets to RecordedPartner. + if (gBattleTestRunnerState->data.expectedAiActions[B_BATTLER_2][0].actionSet == TRUE) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayerPartner; + else + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToRecordedPartner; + } + else if ((isInGamePartner && !isRecorded) + || isAIvsAI) + { gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayerPartner; + } else if (isRecorded) + { gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToRecordedPlayer; - else if (isAIvsAI) - gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayerPartner; + } else + { gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_2)] = SetControllerToPlayer; + } // Opponent 2 - if (isInGamePartner || !isRecorded || isMulti || !isRecordedLink) + if (IsMultibattleTest() && isRecordedLink) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToRecordedOpponent; + else if (isInGamePartner || !isRecorded || isMulti || !isRecordedLink) gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToOpponent; else gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_3)] = SetControllerToRecordedOpponent; @@ -318,6 +340,11 @@ static inline bool32 IsControllerRecordedPlayer(u32 battler) return (gBattlerControllerEndFuncs[battler] == RecordedPlayerBufferExecCompleted); } +static inline bool32 IsControllerRecordedPartner(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == RecordedPartnerBufferExecCompleted); +} + static inline bool32 IsControllerOpponent(u32 battler) { return (gBattlerControllerEndFuncs[battler] == OpponentBufferExecCompleted); @@ -2249,6 +2276,7 @@ void BtlController_HandleSwitchInAnim(u32 battler) bool32 isPlayerSide = (IsControllerPlayer(battler) || IsControllerPlayerPartner(battler) || IsControllerRecordedPlayer(battler) + || IsControllerRecordedPartner(battler) || IsControllerLinkPartner(battler)); if (IsControllerPlayer(battler)) @@ -2541,6 +2569,7 @@ void BtlController_HandleHealthBarUpdate(u32 battler) SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, 0, hpVal); if (IsControllerPlayer(battler) || IsControllerRecordedPlayer(battler) + || IsControllerRecordedPartner(battler) || IsControllerWally(battler)) UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, 0, maxHP); TestRunner_Battle_RecordHP(battler, curHP, 0); diff --git a/src/battle_main.c b/src/battle_main.c index 382c846bb5..ba7dfa137f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -53,6 +53,7 @@ #include "string_util.h" #include "strings.h" #include "task.h" +#include "test/battle.h" #include "test_runner.h" #include "text.h" #include "trainer_pools.h" @@ -75,6 +76,7 @@ #include "constants/trainers.h" #include "constants/weather.h" #include "cable_club.h" +#include "test/test_runner_battle.h" extern const struct BgTemplate gBattleBgTemplates[]; extern const struct WindowTemplate *const gBattleWindowTemplates[]; @@ -545,10 +547,10 @@ static void CB2_InitBattleInternal(void) gReservedSpritePaletteCount = MAX_BATTLERS_COUNT; SetVBlankCallback(VBlankCB_Battle); SetUpBattleVarsAndBirchZigzagoon(); - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - SetMainCallback2(CB2_HandleStartMultiPartnerBattle); - else if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + + if ((IsMultibattleTest() && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)) SetMainCallback2(CB2_HandleStartMultiPartnerBattle); else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) SetMainCallback2(CB2_HandleStartMultiBattle); diff --git a/src/battle_message.c b/src/battle_message.c index 087c436d91..3e10ec6227 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -108,6 +108,7 @@ static const u8 sText_PkmnComeBack[] = _("{B_BUFF1}, come back!"); static const u8 sText_PkmnOkComeBack[] = _("OK, {B_BUFF1}! Come back!"); static const u8 sText_PkmnGoodComeBack[] = _("Good job, {B_BUFF1}! Come back!"); static const u8 sText_Trainer1WithdrewPkmn[] = _("{B_TRAINER1_NAME_WITH_CLASS} withdrew {B_BUFF1}!"); +static const u8 sText_Trainer2WithdrewPkmn[] = _("{B_TRAINER2_NAME_WITH_CLASS} withdrew {B_BUFF1}!"); static const u8 sText_LinkTrainer1WithdrewPkmn[] = _("{B_LINK_OPPONENT1_NAME} withdrew {B_BUFF1}!"); static const u8 sText_LinkTrainer2WithdrewPkmn[] = _("{B_LINK_SCR_TRAINER_NAME} withdrew {B_BUFF1}!"); static const u8 sText_WildPkmnPrefix[] = _("The wild "); @@ -1443,6 +1444,8 @@ static const u8 sText_TwoTrainersSentPkmn[] = _("{B_TRAINER1_NAME_WITH_CLASS} se static const u8 sText_Trainer2SentOutPkmn[] = _("{B_TRAINER2_NAME_WITH_CLASS} sent out {B_BUFF1}!"); static const u8 sText_TwoTrainersWantToBattle[] = _("You are challenged by {B_TRAINER1_NAME_WITH_CLASS} and {B_TRAINER2_NAME_WITH_CLASS}!\p"); static const u8 sText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_NAME_WITH_CLASS} sent out {B_PLAYER_MON2_NAME}! Go, {B_PLAYER_MON1_NAME}!"); +static const u8 sText_InGamePartnerSentOutPkmn2[] = _("{B_PARTNER_NAME_WITH_CLASS} sent out {B_PLAYER_MON2_NAME}!"); +static const u8 sText_InGamePartnerWithdrewPkmn2[] = _("{B_PARTNER_NAME_WITH_CLASS} withdrew {B_PLAYER_MON2_NAME}!"); const u16 gBattlePalaceFlavorTextTable[] = { @@ -2065,9 +2068,31 @@ void BufferStringBattle(enum StringID stringID, u32 battler) else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - stringPtr = sText_TwoLinkTrainersWantToBattlePause; + { + if (TESTING && gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + stringPtr = sText_Trainer1WantsToBattle; + else + stringPtr = sText_TwoTrainersWantToBattle; + } + else if (TESTING && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + stringPtr = sText_TwoTrainersWantToBattle; + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + { + stringPtr = sText_LinkTrainerWantsToBattlePause; + } + else + { + stringPtr = sText_TwoLinkTrainersWantToBattlePause; + } + } else + { stringPtr = sText_TwoLinkTrainersWantToBattle; + } } else { @@ -2153,7 +2178,9 @@ void BufferStringBattle(enum StringID stringID, u32 battler) case STRINGID_RETURNMON: // sending poke to ball msg if (IsOnPlayerSide(battler)) { - if (*(&gBattleStruct->hpScale) == 0) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerAtPosition(battler) == 2) + stringPtr = sText_InGamePartnerWithdrewPkmn2; + else if (*(&gBattleStruct->hpScale) == 0) stringPtr = sText_PkmnThatsEnough; else if (*(&gBattleStruct->hpScale) == 1 || IsDoubleBattle()) stringPtr = sText_PkmnComeBack; @@ -2173,14 +2200,27 @@ void BufferStringBattle(enum StringID stringID, u32 battler) } else { - stringPtr = sText_Trainer1WithdrewPkmn; + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + if (GetBattlerAtPosition(battler) == 1) + stringPtr = sText_Trainer1WithdrewPkmn; + else + stringPtr = sText_Trainer2WithdrewPkmn; + + } + else + { + stringPtr = sText_Trainer1WithdrewPkmn; + } } } break; case STRINGID_SWITCHINMON: // switch-in msg if (IsOnPlayerSide(gBattleScripting.battler)) { - if (*(&gBattleStruct->hpScale) == 0 || IsDoubleBattle()) + if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) && (GetBattlerAtPosition(gBattleScripting.battler) == 2)) + stringPtr = sText_InGamePartnerSentOutPkmn2; + else if (*(&gBattleStruct->hpScale) == 0 || IsDoubleBattle()) stringPtr = sText_GoPkmn2; else if (*(&gBattleStruct->hpScale) == 1) stringPtr = sText_DoItPkmn; @@ -2202,12 +2242,39 @@ void BufferStringBattle(enum StringID stringID, u32 battler) } else { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + if (TESTING && gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (gBattleScripting.battler == 1) + { + stringPtr = sText_Trainer1SentOutPkmn; + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + stringPtr = sText_Trainer2SentOutPkmn; + else + stringPtr = sText_Trainer1SentOutPkmn2; + } + } + else if (TESTING && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + if (gBattleScripting.battler == 1) + stringPtr = sText_Trainer1SentOutPkmn; + else + stringPtr = sText_Trainer2SentOutPkmn; + } + else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { stringPtr = sText_LinkTrainerMultiSentOutPkmn; + } else if (TRAINER_BATTLE_PARAM.opponentA == TRAINER_UNION_ROOM) + { stringPtr = sText_Trainer1SentOutPkmn2; + } else + { stringPtr = sText_LinkTrainerSentOutPkmn2; + } } } else diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1e72e2e339..084b37dc2d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -67,8 +67,10 @@ #include "constants/pokemon.h" #include "config/battle.h" #include "data/battle_move_effects.h" +#include "test/battle.h" #include "follower_npc.h" #include "load_save.h" +#include "test/test_runner_battle.h" // table to avoid ugly powing on gba (courtesy of doesnt) // this returns (i^2.5)/4 @@ -4831,16 +4833,14 @@ bool32 NoAliveMonsForPlayer(void) { HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP); } - // Get the number of fainted mons or eggs (not empty slots) in the first three party slots. if (i < 3 && ((GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_HP)) || GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))) ineligibleMonsCount++; } - // Get the number of inelligible slots in the saved player party. if (B_MULTI_BATTLE_WHITEOUT > GEN_3 && gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER) - && !(gBattleTypeFlags & BATTLE_TYPE_ARENA)) + && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) && !(IsMultibattleTest())) // Multibattle tests appear to not save the player party data for the check below. { for (i = 0; i < PARTY_SIZE; i++) { @@ -4893,7 +4893,6 @@ static void Cmd_checkteamslost(void) if (NoAliveMonsForPlayer()) gBattleOutcome |= B_OUTCOME_LOST; - if (NoAliveMonsForOpponent()) gBattleOutcome |= B_OUTCOME_WON; diff --git a/src/battle_tower.c b/src/battle_tower.c index 3cf63ba080..f925826a6f 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -40,6 +40,8 @@ #include "constants/trainers.h" #include "constants/event_objects.h" #include "constants/moves.h" +#include "test/battle.h" +#include "test/test_runner_battle.h" // EWRAM vars. EWRAM_DATA const struct BattleFrontierTrainer *gFacilityTrainers = NULL; @@ -3557,18 +3559,20 @@ bool32 ValidateBattleTowerRecord(u8 recordId) // unused void TrySetLinkBattleTowerEnemyPartyLevel(void) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) + if (!IsMultibattleTest()) { - s32 i; - u8 enemyLevel = SetFacilityPtrsGetLevel(); - - for (i = 0; i < PARTY_SIZE; i++) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { - u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL); - if (species) + u8 enemyLevel = SetFacilityPtrsGetLevel(); + + for (u32 i = 0; i < PARTY_SIZE; i++) { - SetMonData(&gEnemyParty[i], MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[species].growthRate][enemyLevel]); - CalculateMonStats(&gEnemyParty[i]); + u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL); + if (species) + { + SetMonData(&gEnemyParty[i], MON_DATA_EXP, &gExperienceTables[gSpeciesInfo[species].growthRate][enemyLevel]); + CalculateMonStats(&gEnemyParty[i]); + } } } } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 10db58a53c..5b61a8b4dd 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -49,7 +49,7 @@ EWRAM_DATA static u8 sFrontierPassFlag = 0; EWRAM_DATA static u8 sBattleScene = 0; EWRAM_DATA static u8 sTextSpeed = 0; EWRAM_DATA static u32 sBattleFlags = 0; -EWRAM_DATA static u64 sAI_Scripts = 0; +EWRAM_DATA static u64 sAI_Scripts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA static struct Pokemon sSavedPlayerParty[PARTY_SIZE] = {0}; EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0}; EWRAM_DATA static u16 sPlayerMonMoves[MAX_BATTLERS_COUNT / 2][MAX_MON_MOVES] = {0}; @@ -87,7 +87,7 @@ void RecordedBattle_Init(u8 mode) for (j = 0; j < BATTLER_RECORD_SIZE; j++) sBattleRecords[i][j] = 0xFF; sBattleFlags = gBattleTypeFlags; - sAI_Scripts = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; + sAI_Scripts[i] = gAiThinkingStruct->aiFlags[i]; } } } @@ -312,6 +312,7 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->playersLanguage[i] = sPlayers[i].language; battleSave->playersBattlers[i] = sPlayers[i].battler; battleSave->playersTrainerId[i] = sPlayers[i].trainerId; + battleSave->AI_scripts[i] = sAI_Scripts[i]; } battleSave->rngSeed = gRecordedBattleRngSeed; @@ -358,7 +359,6 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->frontierBrainSymbol = sFrontierBrainSymbol; battleSave->battleScene = gSaveBlock2Ptr->optionsBattleSceneOff; battleSave->textSpeed = gSaveBlock2Ptr->optionsTextSpeed; - battleSave->AI_scripts = sAI_Scripts; if (TRAINER_BATTLE_PARAM.opponentA >= TRAINER_RECORD_MIXING_FRIEND && TRAINER_BATTLE_PARAM.opponentA < TRAINER_RECORD_MIXING_APPRENTICE) { @@ -523,6 +523,7 @@ void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) gLinkPlayers[i].language = src->playersLanguage[i]; gLinkPlayers[i].id = src->playersBattlers[i]; gLinkPlayers[i].trainerId = src->playersTrainerId[i]; + sAI_Scripts[i] = src->AI_scripts[i]; if (var) ConvertInternationalString(gLinkPlayers[i].name, gLinkPlayers[i].language); @@ -539,7 +540,6 @@ void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) sFrontierBrainSymbol = src->frontierBrainSymbol; sBattleScene = src->battleScene; sTextSpeed = src->textSpeed; - sAI_Scripts = src->AI_scripts; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) sRecordMixFriendName[i] = src->recordMixFriendName[i]; @@ -786,9 +786,9 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) } } -u64 GetAiScriptsInRecordedBattle(void) +u64 GetAiScriptsInRecordedBattle(u32 battler) { - return sAI_Scripts; + return sAI_Scripts[battler]; } // Used to determine when the player is allowed to press B to end a recorded battle's playback diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 1ffd901810..82e8d9537a 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -338,7 +338,7 @@ AI_DOUBLE_BATTLE_TEST("AI will trigger its ally's Weakness Policy") } } -AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide") +AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (doubles)") { ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); @@ -363,6 +363,36 @@ AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field wit } } +AI_DOUBLE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (doubles)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + OPPONENT(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0 || battler == 3) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_EXPLOSION, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_EXPLOSION); } + } +} + AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") { ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); diff --git a/test/battle/ai/ai_multi.c b/test/battle/ai/ai_multi.c new file mode 100644 index 0000000000..ddbfdb49b0 --- /dev/null +++ b/test/battle/ai/ai_multi.c @@ -0,0 +1,127 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_MULTI_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (multi)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_OPPONENT_A(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + MULTI_OPPONENT_B(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(&gBattleMons[BATTLE_PARTNER(battler)], MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(&gBattleMons[battler], MOVE_EXPLOSION); } + } +} + +AI_ONE_VS_TWO_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (1v2)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_OPPONENT_A(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + MULTI_OPPONENT_B(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(&gBattleMons[BATTLE_PARTNER(battler)], MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(&gBattleMons[battler], MOVE_EXPLOSION); } + } +} + +// Used to test EXPECT_MOVE only on partner +AI_MULTI_BATTLE_TEST("AI partner makes sensible move selections in battle (multi)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_AURA_SPHERE); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); HP(1); } + MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); }; + } +} + +// Used to test EXPECT_MOVE only on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner makes sensible move selections in battle (2v1)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_AURA_SPHERE); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); HP(1); } + MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); }; + } +} + +AI_TWO_VS_ONE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (2v1)") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + u32 battler; + + PARAMETRIZE { aiFlags = 0; battler = 1; } + PARAMETRIZE { aiFlags = 0; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_RISKY; battler = 3; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 1; } + PARAMETRIZE { aiFlags = AI_FLAG_WILL_SUICIDE; battler = 3; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(battler, aiFlags); + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { HP(1); } + MULTI_OPPONENT_A(SPECIES_VOLTORB) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + MULTI_OPPONENT_A(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); HP(1); } + } WHEN { + if (aiFlags == 0 || battler == 3) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_ELECTRO_BALL, target: playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_EXPLOSION, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_EXPLOSION); } + } +} diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 1e10b7fc1c..f3c8cb6103 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -91,6 +91,250 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same Pokémon for 2 spo } } +// Used to test EXPECT_SWITCH only on partner +AI_MULTI_BATTLE_TEST("AI partner will not switch mid-turn into a player Pokémon (multi)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_SWITCH(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SWITCH only on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch mid-turn into a player Pokémon (2v1)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_SWITCH(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SEND_OUT only on partner +AI_MULTI_BATTLE_TEST("AI partner will not switch into a player Pokémon after fainting (multi)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_GENGAR); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); HP(1); } + MULTI_PARTNER(SPECIES_GASTLY); + MULTI_PARTNER(SPECIES_HAUNTER); + MULTI_OPPONENT_A(SPECIES_TRAPINCH) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_VIBRAVA) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Haunter!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SEND_OUT only on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player Pokémon after fainting (2v1)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_GENGAR); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); HP(1); } + MULTI_PARTNER(SPECIES_GASTLY); + MULTI_PARTNER(SPECIES_HAUNTER); + MULTI_OPPONENT_A(SPECIES_TRAPINCH) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_VIBRAVA) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Haunter!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SWITCH, EXPECT_SEND_OUT, and EXPECT_MOVE on partner +AI_MULTI_BATTLE_TEST("AI partner will not switch into a player Pokémon (multi)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); HP(1); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); }; + TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +// Used to test EXPECT_SWITCH, EXPECT_SEND_OUT, and EXPECT_MOVE on partner +AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player Pokémon (2v1)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_HAUNTER); + MULTI_PLAYER(SPECIES_RATTATA); + // No moves to damage opponents. + MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); HP(1); } + MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } + + } WHEN { + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); }; + TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); }; + } SCENE { + MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_PARTNER_NAME " sent out Rattata!"); + } + } +} + +AI_TWO_VS_ONE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spots in a 2v1 battle (all bad moves)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_RATTATA); + MULTI_PLAYER(SPECIES_RATTATA); + MULTI_PARTNER(SPECIES_KANGASKHAN); + // No moves to damage player. + MULTI_OPPONENT_A(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_A(SPECIES_HAUNTER) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_A(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_OPPONENT_A(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + } WHEN { + TURN { EXPECT_SWITCH(opponentLeft, 3); }; + } SCENE { + MESSAGE(AI_TRAINER_NAME " withdrew Gengar!"); + MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_TRAINER_NAME " withdrew Haunter!"); + MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); + } + } +} + +AI_ONE_VS_TWO_BATTLE_TEST("AI will not switch into a partner Pokémon in a 1v2 battle (all bad moves)") +{ + u32 flags; + + PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = 0; } + + PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + MULTI_PLAYER(SPECIES_RATTATA); + MULTI_PLAYER(SPECIES_KANGASKHAN); + // No moves to damage player. + MULTI_OPPONENT_A(SPECIES_HAUNTER) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_B(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } + MULTI_OPPONENT_B(SPECIES_GASTLY) { Moves(MOVE_LICK); } + MULTI_OPPONENT_B(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } + + } WHEN { + TURN { EXPECT_SWITCH(opponentRight, 5); }; + } SCENE { + MESSAGE(AI_TRAINER_2_NAME " withdrew Gengar!"); + MESSAGE(AI_TRAINER_2_NAME " sent out Raticate!"); + NONE_OF { + MESSAGE(AI_TRAINER_NAME " withdrew Haunter!"); + MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); + } + } +} + AI_SINGLE_BATTLE_TEST("AI will switch out if it has no move that affects the player") { PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); diff --git a/test/battle/damage_formula.c b/test/battle/damage_formula.c index 4a7e4ec1ef..702feaa837 100644 --- a/test/battle/damage_formula.c +++ b/test/battle/damage_formula.c @@ -118,7 +118,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Marshadow vs Mawile)") } } -DOUBLE_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move") +DOUBLE_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (double battle)") { s16 damage[6]; GIVEN { @@ -152,6 +152,108 @@ DOUBLE_BATTLE_TEST("A spread move will do correct damage to the second mon if th } } +MULTI_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (multibattle)") +{ + s16 damage[6]; + GIVEN { + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_PARTNER(SPECIES_REGIROCK); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(200); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); MOVE(playerRight, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + HP_BAR(opponentRight, captureDamage: &damage[3]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[4]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_EQ(damage[1], damage[3]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(0.75), damage[3]); + EXPECT_EQ(damage[4], damage[5]); + } +} + +TWO_VS_ONE_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (2v1)") +{ + s16 damage[6]; + GIVEN { + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_PARTNER(SPECIES_REGIROCK); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(200); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); MOVE(playerRight, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + HP_BAR(opponentRight, captureDamage: &damage[3]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[4]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_EQ(damage[1], damage[3]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(0.75), damage[3]); + EXPECT_EQ(damage[4], damage[5]); + } +} + +ONE_VS_TWO_BATTLE_TEST("A spread move will do correct damage to the second mon if the first target faints from first hit of the spread move (1v2)") +{ + s16 damage[6]; + GIVEN { + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_PLAYER(SPECIES_REGIROCK); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(200); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); MOVE(playerRight, MOVE_ROCK_SLIDE); } + TURN { MOVE(playerLeft, MOVE_ROCK_SLIDE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + HP_BAR(opponentRight, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); + HP_BAR(opponentRight, captureDamage: &damage[3]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[4]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROCK_SLIDE, playerLeft); + HP_BAR(opponentRight, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + EXPECT_EQ(damage[1], damage[3]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(0.75), damage[3]); + EXPECT_EQ(damage[4], damage[5]); + } +} + SINGLE_BATTLE_TEST("Punching Glove vs Muscle Band Damage calculation") { s16 dmgPlayer, dmgOpponent; diff --git a/test/battle/end_turn_effects.c b/test/battle/end_turn_effects.c index 51aa1e79bf..95ae96889f 100644 --- a/test/battle/end_turn_effects.c +++ b/test/battle/end_turn_effects.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -DOUBLE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly") +DOUBLE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (double battle)") { s16 healed; s16 damage; @@ -29,3 +29,90 @@ DOUBLE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly") } } + +MULTI_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (multibattle)") +{ + s16 healed; + s16 damage; + + GIVEN { + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1); } + MULTI_PARTNER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_GRASSY_TERRAIN); } + } SCENE { + MESSAGE("The opposing Wobbuffet is healed by the grassy terrain!"); + HP_BAR(opponentRight, captureDamage: &healed); + HP_BAR(opponentRight, captureDamage: &damage); + MESSAGE("The opposing Wobbuffet was hurt by the Black Sludge!"); + MESSAGE("The opposing Wynaut is healed by the grassy terrain!"); + MESSAGE("The opposing Wynaut restored a little HP using its Leftovers!"); + MESSAGE("Ekans is healed by the grassy terrain!"); + MESSAGE("Ekans's Shed Skin cured its burn problem!"); + MESSAGE("Wynaut is healed by the grassy terrain!"); + } THEN { + EXPECT_GT(0, healed); + EXPECT_GT(damage, 0); + } +} + + +TWO_VS_ONE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (2v1)") +{ + s16 healed; + s16 damage; + + GIVEN { + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1);} + MULTI_PARTNER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_GRASSY_TERRAIN); } + } SCENE { + MESSAGE("The opposing Wobbuffet is healed by the grassy terrain!"); + HP_BAR(opponentRight, captureDamage: &healed); + HP_BAR(opponentRight, captureDamage: &damage); + MESSAGE("The opposing Wobbuffet was hurt by the Black Sludge!"); + MESSAGE("The opposing Wynaut is healed by the grassy terrain!"); + MESSAGE("The opposing Wynaut restored a little HP using its Leftovers!"); + MESSAGE("Ekans is healed by the grassy terrain!"); + MESSAGE("Ekans's Shed Skin cured its burn problem!"); + MESSAGE("Wynaut is healed by the grassy terrain!"); + } THEN { + EXPECT_GT(0, healed); + EXPECT_GT(damage, 0); + } +} + + +ONE_VS_TWO_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (1v2)") +{ + s16 healed; + s16 damage; + + GIVEN { + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1);} + MULTI_PLAYER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_GRASSY_TERRAIN); } + } SCENE { + MESSAGE("The opposing Wobbuffet is healed by the grassy terrain!"); + HP_BAR(opponentRight, captureDamage: &healed); + HP_BAR(opponentRight, captureDamage: &damage); + MESSAGE("The opposing Wobbuffet was hurt by the Black Sludge!"); + MESSAGE("The opposing Wynaut is healed by the grassy terrain!"); + MESSAGE("The opposing Wynaut restored a little HP using its Leftovers!"); + MESSAGE("Ekans is healed by the grassy terrain!"); + MESSAGE("Ekans's Shed Skin cured its burn problem!"); + MESSAGE("Wynaut is healed by the grassy terrain!"); + } THEN { + EXPECT_GT(0, healed); + EXPECT_GT(damage, 0); + } +} + diff --git a/test/battle/move.c b/test/battle/move.c index f69c7b2eb4..3efab260a7 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -212,6 +212,50 @@ DOUBLE_BATTLE_TEST("Moves fail if they target the partner but they faint before } } +MULTI_BATTLE_TEST("Ally switch fails when used by either side in a multibattle") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(playerRight, MOVE_ALLY_SWITCH); MOVE(opponentLeft, MOVE_ALLY_SWITCH); MOVE(opponentRight, MOVE_ALLY_SWITCH); } + } SCENE { + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerRight); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); } + } +} + +TWO_VS_ONE_BATTLE_TEST("Ally switch can only be used by the opponent in a 2v1 battle") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(playerRight, MOVE_ALLY_SWITCH); MOVE(opponentLeft, MOVE_ALLY_SWITCH); } + } SCENE { + { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentLeft); } + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerRight); } + } +} + +ONE_VS_TWO_BATTLE_TEST("Ally switch can only be used by the player in a 1v2 battle") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(opponentLeft, MOVE_ALLY_SWITCH); MOVE(opponentRight, MOVE_ALLY_SWITCH); } + } SCENE { + { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); } + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, opponentRight); } + } +} + DOUBLE_BATTLE_TEST("Moves do not fail if an alive partner is the target") { GIVEN { diff --git a/test/battle/switch_in_abilities.c b/test/battle/switch_in_abilities.c index c8a8c54dd3..4d125ddce8 100644 --- a/test/battle/switch_in_abilities.c +++ b/test/battle/switch_in_abilities.c @@ -126,3 +126,124 @@ DOUBLE_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO swi } } } + +MULTI_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO switch - multibattle") +{ + u32 spdPlayer1, spdPlayer2, spdOpponent1, spdOpponent2; + + PARAMETRIZE { spdPlayer1 = 5; spdPlayer2 = 4; spdOpponent1 = 3; spdOpponent2 = 2; } + PARAMETRIZE { spdPlayer1 = 2; spdPlayer2 = 3; spdOpponent1 = 4; spdOpponent2 = 5; } + PARAMETRIZE { spdPlayer1 = 4; spdPlayer2 = 3; spdOpponent1 = 5; spdOpponent2 = 2; } + + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_TYRANITAR) { Speed(spdPlayer1); Ability(ABILITY_SAND_STREAM); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PARTNER(SPECIES_GYARADOS) { Speed(spdPlayer2); Ability(ABILITY_INTIMIDATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WEEZING_GALAR) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_B(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 1); SEND_OUT(opponentLeft, 1); SEND_OUT(playerRight, 4); SEND_OUT(opponentRight, 4); } + TURN { ; } + } SCENE { + MESSAGE("Wobbuffet used Explosion!"); + if (spdPlayer1 == 5) { + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } else if (spdOpponent2 == 5) { + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + } else { + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } + } +} + +TWO_VS_ONE_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO switch - 2v1") +{ + u32 spdPlayer1, spdPlayer2, spdOpponent1, spdOpponent2; + + PARAMETRIZE { spdPlayer1 = 5; spdPlayer2 = 4; spdOpponent1 = 3; spdOpponent2 = 2; } + PARAMETRIZE { spdPlayer1 = 2; spdPlayer2 = 3; spdOpponent1 = 4; spdOpponent2 = 5; } + PARAMETRIZE { spdPlayer1 = 4; spdPlayer2 = 3; spdOpponent1 = 5; spdOpponent2 = 2; } + + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_TYRANITAR) { Speed(spdPlayer1); Ability(ABILITY_SAND_STREAM); } + MULTI_PARTNER(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_PARTNER(SPECIES_GYARADOS) { Speed(spdPlayer2); Ability(ABILITY_INTIMIDATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WEEZING_GALAR) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } + MULTI_OPPONENT_A(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 1); SEND_OUT(opponentLeft, 2); SEND_OUT(playerRight, 4); SEND_OUT(opponentRight, 3); } + } SCENE { + MESSAGE("Wobbuffet used Explosion!"); + if (spdPlayer1 == 5) { + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } else if (spdOpponent2 == 5) { + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + } else { + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } + } +} + +ONE_VS_TWO_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO switch - 1v2") +{ + u32 spdPlayer1, spdPlayer2, spdOpponent1, spdOpponent2; + + PARAMETRIZE { spdPlayer1 = 5; spdPlayer2 = 4; spdOpponent1 = 3; spdOpponent2 = 2; } + PARAMETRIZE { spdPlayer1 = 2; spdPlayer2 = 3; spdOpponent1 = 4; spdOpponent2 = 5; } + PARAMETRIZE { spdPlayer1 = 4; spdPlayer2 = 3; spdOpponent1 = 5; spdOpponent2 = 2; } + + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_PLAYER(SPECIES_TYRANITAR) { Speed(spdPlayer1); Ability(ABILITY_SAND_STREAM); } + MULTI_PLAYER(SPECIES_GYARADOS) { Speed(spdPlayer2); Ability(ABILITY_INTIMIDATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + MULTI_OPPONENT_A(SPECIES_WEEZING_GALAR) { Speed(spdOpponent1); Ability(ABILITY_MISTY_SURGE); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { HP(1); Speed(1); } + MULTI_OPPONENT_B(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 2); SEND_OUT(opponentLeft, 1); SEND_OUT(playerRight, 3); SEND_OUT(opponentRight, 4); } + } SCENE { + MESSAGE("Wobbuffet used Explosion!"); + if (spdPlayer1 == 5) { + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } else if (spdOpponent2 == 5) { + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + } else { + ABILITY_POPUP(opponentLeft, ABILITY_MISTY_SURGE); + ABILITY_POPUP(playerLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentRight, ABILITY_SNOW_WARNING); + } + } +} diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 55b1caabfa..5301bd911d 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -3,6 +3,7 @@ #include "battle_ai_util.h" #include "battle_anim.h" #include "battle_controllers.h" +#include "battle_setup.h" #include "battle_gimmick.h" #include "battle_z_move.h" #include "event_data.h" @@ -10,6 +11,7 @@ #include "item_menu.h" #include "main.h" #include "malloc.h" +#include "party_menu.h" #include "random.h" #include "test/battle.h" #include "window.h" @@ -76,7 +78,7 @@ NAKED static void InvokeSingleTestFunctionWithStack(void *results, u32 i, struct .pool"); } -NAKED static void InvokeDoubleTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, SingleBattleTestFunction function, void *stack) +NAKED static void InvokeDoubleTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, DoubleBattleTestFunction function, void *stack) { asm("push {r4-r7,lr}\n\ ldr r4, [sp, #28] @ function\n\ @@ -100,6 +102,78 @@ NAKED static void InvokeDoubleTestFunctionWithStack(void *results, u32 i, struct .pool"); } +NAKED static void InvokeMultiTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, MultiBattleTestFunction function, void *stack) +{ + asm("push {r4-r7,lr}\n\ + ldr r4, [sp, #28] @ function\n\ + ldr r5, [sp, #32] @ stack\n\ + mov r6, sp\n\ + mov sp, r5\n\ + push {r6}\n\ + add r6, #20\n\ + ldmia r6, {r6, r7} @ playerRight, opponentRight\n\ + push {r6, r7}\n\ + ldr r6, =MultiRestoreSP + 1\n\ + mov lr, r6\n\ + bx r4\n\ + MultiRestoreSP:\n\ + add sp, #8\n\ + pop {r0}\n\ + mov sp, r0\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} + +NAKED static void InvokeTwoVsOneTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, TwoVsOneBattleTestFunction function, void *stack) +{ + asm("push {r4-r7,lr}\n\ + ldr r4, [sp, #28] @ function\n\ + ldr r5, [sp, #32] @ stack\n\ + mov r6, sp\n\ + mov sp, r5\n\ + push {r6}\n\ + add r6, #20\n\ + ldmia r6, {r6, r7} @ playerRight, opponentRight\n\ + push {r6, r7}\n\ + ldr r6, =TwoVsOneRestoreSP + 1\n\ + mov lr, r6\n\ + bx r4\n\ + TwoVsOneRestoreSP:\n\ + add sp, #8\n\ + pop {r0}\n\ + mov sp, r0\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} + +NAKED static void InvokeOneVsTwoTestFunctionWithStack(void *results, u32 i, struct BattlePokemon *playerLeft, struct BattlePokemon *opponentLeft, struct BattlePokemon *playerRight, struct BattlePokemon *opponentRight, OneVsTwoBattleTestFunction function, void *stack) +{ + asm("push {r4-r7,lr}\n\ + ldr r4, [sp, #28] @ function\n\ + ldr r5, [sp, #32] @ stack\n\ + mov r6, sp\n\ + mov sp, r5\n\ + push {r6}\n\ + add r6, #20\n\ + ldmia r6, {r6, r7} @ playerRight, opponentRight\n\ + push {r6, r7}\n\ + ldr r6, =OneVsTwoRestoreSP + 1\n\ + mov lr, r6\n\ + bx r4\n\ + OneVsTwoRestoreSP:\n\ + add sp, #8\n\ + pop {r0}\n\ + mov sp, r0\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} + // Calls test->function, but pointing its stack at DATA.stack so that // local variables are live after the function returns (and so can be // referenced by HP_BAR, or the next call, etc). @@ -118,7 +192,19 @@ static void InvokeTestFunction(const struct BattleTest *test) break; case BATTLE_TEST_DOUBLES: case BATTLE_TEST_AI_DOUBLES: - InvokeDoubleTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.singles, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + InvokeDoubleTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.doubles, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + break; + case BATTLE_TEST_MULTI: + case BATTLE_TEST_AI_MULTI: + InvokeMultiTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.multi, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + break; + case BATTLE_TEST_TWO_VS_ONE: + case BATTLE_TEST_AI_TWO_VS_ONE: + InvokeTwoVsOneTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.two_vs_one, &DATA.stack[BATTLE_TEST_STACK_SIZE]); + break; + case BATTLE_TEST_ONE_VS_TWO: + case BATTLE_TEST_AI_ONE_VS_TWO: + InvokeOneVsTwoTestFunctionWithStack(STATE->results, STATE->runParameter, &gBattleMons[B_POSITION_PLAYER_LEFT], &gBattleMons[B_POSITION_OPPONENT_LEFT], &gBattleMons[B_POSITION_PLAYER_RIGHT], &gBattleMons[B_POSITION_OPPONENT_RIGHT], test->function.one_vs_two, &DATA.stack[BATTLE_TEST_STACK_SIZE]); break; } } @@ -135,6 +221,9 @@ static bool32 IsAITest(void) { case BATTLE_TEST_AI_SINGLES: case BATTLE_TEST_AI_DOUBLES: + case BATTLE_TEST_AI_MULTI: + case BATTLE_TEST_AI_TWO_VS_ONE: + case BATTLE_TEST_AI_ONE_VS_TWO: return TRUE; } return FALSE; @@ -179,6 +268,12 @@ static void BattleTest_SetUp(void *data) break; case BATTLE_TEST_DOUBLES: case BATTLE_TEST_AI_DOUBLES: + case BATTLE_TEST_MULTI: + case BATTLE_TEST_AI_MULTI: + case BATTLE_TEST_TWO_VS_ONE: + case BATTLE_TEST_AI_TWO_VS_ONE: + case BATTLE_TEST_ONE_VS_TWO: + case BATTLE_TEST_AI_ONE_VS_TWO: STATE->battlersCount = 4; break; } @@ -263,26 +358,97 @@ static void BattleTest_Run(void *data) { case BATTLE_TEST_WILD: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_AI_SINGLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; DATA.recordedBattle.opponentA = TRAINER_LEAF; DATA.hasAI = TRUE; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_AI_DOUBLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE; DATA.recordedBattle.opponentA = TRAINER_LEAF; + DATA.recordedBattle.opponentB = TRAINER_NONE; + DATA.hasAI = TRUE; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; + break; + case BATTLE_TEST_AI_MULTI: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LEAF; DATA.recordedBattle.opponentB = TRAINER_RED; DATA.hasAI = TRUE; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon + break; + case BATTLE_TEST_AI_TWO_VS_ONE: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LEAF; + DATA.recordedBattle.opponentB = 0xFFFF; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 1; // Opponent second mon + DATA.hasAI = TRUE; + break; + case BATTLE_TEST_AI_ONE_VS_TWO: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.opponentA = TRAINER_LEAF; + DATA.recordedBattle.opponentB = TRAINER_RED; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 1; // Player second mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon + DATA.hasAI = TRUE; break; case BATTLE_TEST_SINGLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER; DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_DOUBLES: DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE; DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + DATA.recordedBattle.opponentB = TRAINER_NONE; + for (i = 0; i < STATE->battlersCount; i++) + DATA.currentMonIndexes[i] = i / 2; + break; + case BATTLE_TEST_MULTI: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; DATA.recordedBattle.opponentB = TRAINER_LINK_OPPONENT; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon + break; + case BATTLE_TEST_TWO_VS_ONE: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; + DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); + DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + DATA.recordedBattle.opponentB = 0xFFFF; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent first mon + DATA.currentMonIndexes[2] = 3; // Player partner first mon + DATA.currentMonIndexes[3] = 1; // Opponent second mon + break; + case BATTLE_TEST_ONE_VS_TWO: + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; + DATA.recordedBattle.opponentB = TRAINER_LINK_OPPONENT; + DATA.currentMonIndexes[0] = 0; // Player first mon + DATA.currentMonIndexes[1] = 0; // Opponent A first mon + DATA.currentMonIndexes[2] = 1; // Player second mon + DATA.currentMonIndexes[3] = 3; // Opponent B first mon break; } @@ -294,9 +460,6 @@ static void BattleTest_Run(void *data) DATA.recordedBattle.playersBattlers[i] = i; } - for (i = 0; i < STATE->battlersCount; i++) - DATA.currentMonIndexes[i] = i / 2; - STATE->runRandomly = TRUE; STATE->runGiven = TRUE; STATE->runWhen = TRUE; @@ -326,10 +489,46 @@ static void BattleTest_Run(void *data) if (DATA.hasExplicitSpeeds) { - // TODO: If a battler is taking the default action maybe it - // should not require an explicit speed? - if (DATA.explicitSpeeds[B_SIDE_PLAYER] != (1 << DATA.playerPartySize) - 1 - || DATA.explicitSpeeds[B_SIDE_OPPONENT] != (1 << DATA.opponentPartySize) - 1) + u8 revisedPlayerExplicitSpeeds = 0; + u8 revisedPartnerExplicitSpeeds = 0; + u8 revisedOpponentAExplicitSpeeds = 0; + u8 revisedOpponentBExplicitSpeeds = 0; + + for (i = 0; i < 3; i++) + { + if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + revisedPlayerExplicitSpeeds |= 1 << i; + } + for (i = 3; i < PARTY_SIZE; i++) + { + if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + if(DATA.currentPosition == B_POSITION_PLAYER_LEFT) + revisedPlayerExplicitSpeeds |= 1 << i; + else + revisedPartnerExplicitSpeeds |= 1 << i; + } + } + + for (i = 0; i < 3; i++) + { + if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + revisedOpponentAExplicitSpeeds |= 1 << i; + } + for (i = 3; i < PARTY_SIZE; i++) + { + if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + { + if(DATA.currentPosition == B_POSITION_OPPONENT_LEFT) + revisedOpponentAExplicitSpeeds |= 1 << i; + else + revisedOpponentBExplicitSpeeds |= 1 << i; + } + } + + if (((DATA.explicitSpeeds[B_POSITION_PLAYER_LEFT] + DATA.explicitSpeeds[B_POSITION_PLAYER_RIGHT]) != (revisedPlayerExplicitSpeeds + revisedPartnerExplicitSpeeds) + || (DATA.explicitSpeeds[B_POSITION_OPPONENT_LEFT] + DATA.explicitSpeeds[B_POSITION_OPPONENT_RIGHT]) != (revisedOpponentAExplicitSpeeds + revisedOpponentBExplicitSpeeds))) + { Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":LSpeed required for all PLAYERs and OPPONENTs"); } @@ -1509,14 +1708,24 @@ void RNGSeed_(u32 sourceLine, rng_value_t seed) void AIFlags_(u32 sourceLine, u64 flags) { - INVALID_IF(!IsAITest(), "AI_FLAGS is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); - DATA.recordedBattle.AI_scripts = flags; + INVALID_IF(!IsAITest(), "AI_FLAGS is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); + for (u32 i = 0; i < MAX_BATTLERS_COUNT; i++) + { + DATA.recordedBattle.AI_scripts[i] = flags; + } + DATA.hasAI = TRUE; +} + +void BattlerAIFlags_(u32 sourceLine, u32 battler, u64 flags) +{ + INVALID_IF(!IsAITest(), "AI_FLAGS is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); + DATA.recordedBattle.AI_scripts[battler] |= flags; DATA.hasAI = TRUE; } void AILogScores(u32 sourceLine) { - INVALID_IF(!IsAITest(), "AI_LOG is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "AI_LOG is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); DATA.logAI = TRUE; } @@ -1552,14 +1761,14 @@ void ClearFlagAfterTest(void) } } -void OpenPokemon(u32 sourceLine, enum BattleSide side, u32 species) +void OpenPokemon(u32 sourceLine, enum BattlerPosition position, u32 species) { s32 i, data; u8 *partySize; struct Pokemon *party; INVALID_IF(species >= SPECIES_EGG, "Invalid species: %d", species); ASSUMPTION_FAIL_IF(!IsSpeciesEnabled(species), "Species disabled: %d", species); - if (side == B_SIDE_PLAYER) + if ((position & BIT_SIDE) == B_SIDE_PLAYER) { partySize = &DATA.playerPartySize; party = DATA.recordedBattle.playerParty; @@ -1570,7 +1779,60 @@ void OpenPokemon(u32 sourceLine, enum BattleSide side, u32 species) party = DATA.recordedBattle.opponentParty; } INVALID_IF(*partySize >= PARTY_SIZE, "Too many Pokemon in party"); - DATA.currentSide = side; + DATA.currentPosition = position; + DATA.currentPartyIndex = *partySize; + DATA.currentMon = &party[DATA.currentPartyIndex]; + DATA.gender = 0xFF; // Male + DATA.nature = NATURE_HARDY; + (*partySize)++; + + CreateMon(DATA.currentMon, species, 100, 0, TRUE, 0, OT_ID_PRESET, 0); + data = MOVE_NONE; + for (i = 0; i < MAX_MON_MOVES; i++) + SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &data); + data = 0; + if (B_FRIENDSHIP_BOOST) + { + // This way, we avoid the boost affecting tests unless explicitly stated. + SetMonData(DATA.currentMon, MON_DATA_FRIENDSHIP, &data); + CalculateMonStats(DATA.currentMon); + } +} + +void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species) +{ + + s32 i, data; + u8 *partySize; + struct Pokemon *party; + INVALID_IF(species >= SPECIES_EGG, "Invalid species: %d", species); + ASSUMPTION_FAIL_IF(!IsSpeciesEnabled(species), "Species disabled: %d", species); + if (position == B_POSITION_PLAYER_LEFT) // MULTI_PLAYER + { + partySize = &DATA.playerPartySize; + party = DATA.recordedBattle.playerParty; + } + else if (position == B_POSITION_PLAYER_RIGHT) // MULTI_PARTNER + { + partySize = &DATA.playerPartySize; + if ((*partySize == 0) || (*partySize == 1) || (*partySize == 2)) + *partySize = 3; + party = DATA.recordedBattle.playerParty; + } + else if (position == B_POSITION_OPPONENT_LEFT) // MULTI_OPPONENT_A + { + partySize = &DATA.opponentPartySize; + party = DATA.recordedBattle.opponentParty; + } + else // MULTI_OPPONENT_B + { + partySize = &DATA.opponentPartySize; + if ((*partySize == 0) || (*partySize == 1) || (*partySize == 2)) + *partySize = 3; + party = DATA.recordedBattle.opponentParty; + } + INVALID_IF(*partySize >= PARTY_SIZE, "Too many Pokemon in party"); + DATA.currentPosition = position; DATA.currentPartyIndex = *partySize; DATA.currentMon = &party[DATA.currentPartyIndex]; DATA.gender = 0xFF; // Male @@ -1621,10 +1883,10 @@ void ClosePokemon(u32 sourceLine) { s32 i; u32 data; - INVALID_IF(DATA.hasExplicitSpeeds && !(DATA.explicitSpeeds[DATA.currentSide] & (1 << DATA.currentPartyIndex)), "Speed required"); + INVALID_IF(DATA.hasExplicitSpeeds && !(DATA.explicitSpeeds[DATA.currentPosition] & (1 << DATA.currentPartyIndex)), "Speed required"); for (i = 0; i < STATE->battlersCount; i++) { - if ((i & BIT_SIDE) == DATA.currentSide + if (i == DATA.currentPosition && DATA.currentMonIndexes[i] == DATA.currentPartyIndex) { INVALID_IF(GetMonData(DATA.currentMon, MON_DATA_HP) == 0, "Battlers cannot be fainted"); @@ -1695,7 +1957,7 @@ void Ability_(u32 sourceLine, enum Ability ability) // Store forced ability to be set when the battle starts if invalid. if (i == NUM_ABILITY_SLOTS) { - DATA.forcedAbilities[DATA.currentSide][DATA.currentPartyIndex] = ability; + DATA.forcedAbilities[DATA.currentPosition][DATA.currentPartyIndex] = ability; } } @@ -1759,7 +2021,7 @@ void Speed_(u32 sourceLine, u32 speed) INVALID_IF(speed == 0, "Illegal speed: %d", speed); SetMonData(DATA.currentMon, MON_DATA_SPEED, &speed); DATA.hasExplicitSpeeds = TRUE; - DATA.explicitSpeeds[DATA.currentSide] |= 1 << DATA.currentPartyIndex; + DATA.explicitSpeeds[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; } void HPIV_(u32 sourceLine, u32 hpIV) @@ -1812,10 +2074,10 @@ void Item_(u32 sourceLine, u32 item) switch (GetItemHoldEffect(item)) { case HOLD_EFFECT_MEGA_STONE: - SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_MEGA); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_MEGA); break; case HOLD_EFFECT_Z_CRYSTAL: - SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_Z_MOVE); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_Z_MOVE); break; } } @@ -1833,7 +2095,7 @@ void Moves_(u32 sourceLine, u16 moves[MAX_MON_MOVES]) u32 pp = GetMovePP(moves[i]); SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); } - DATA.explicitMoves[DATA.currentSide] |= 1 << DATA.currentPartyIndex; + DATA.explicitMoves[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; } void MovesWithPP_(u32 sourceLine, struct moveWithPP moveWithPP[MAX_MON_MOVES]) @@ -1848,7 +2110,7 @@ void MovesWithPP_(u32 sourceLine, struct moveWithPP moveWithPP[MAX_MON_MOVES]) SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &moveWithPP[i].moveId); SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &moveWithPP[i].pp); } - DATA.explicitMoves[DATA.currentSide] |= 1 << DATA.currentPartyIndex; + DATA.explicitMoves[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; } void Friendship_(u32 sourceLine, u32 friendship) @@ -1874,21 +2136,21 @@ void DynamaxLevel_(u32 sourceLine, u32 dynamaxLevel) { INVALID_IF(!DATA.currentMon, "DynamaxLevel outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_DYNAMAX_LEVEL, &dynamaxLevel); - SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_DYNAMAX); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor) { INVALID_IF(!DATA.currentMon, "GigantamaxFactor outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_GIGANTAMAX_FACTOR, &gigantamaxFactor); - SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_DYNAMAX); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } void TeraType_(u32 sourceLine, u32 teraType) { INVALID_IF(!DATA.currentMon, "TeraType outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_TERA_TYPE, &teraType); - SetGimmick(sourceLine, DATA.currentSide, DATA.currentPartyIndex, GIMMICK_TERA); + SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_TERA); } void Shadow_(u32 sourceLine, bool32 isShadow) @@ -1928,7 +2190,13 @@ static const char *BattlerIdentifier(s32 battlerId) return sBattlerIdentifiersSingles[battlerId]; case BATTLE_TEST_DOUBLES: case BATTLE_TEST_AI_DOUBLES: - return sBattlerIdentifiersDoubles[battlerId]; + case BATTLE_TEST_MULTI: + case BATTLE_TEST_AI_MULTI: + case BATTLE_TEST_TWO_VS_ONE: + case BATTLE_TEST_AI_TWO_VS_ONE: + case BATTLE_TEST_ONE_VS_TWO: + case BATTLE_TEST_AI_ONE_VS_TWO: + return sBattlerIdentifiersDoubles[battlerId]; } return ""; } @@ -2068,7 +2336,7 @@ void CloseTurn(u32 sourceLine) for (i = 0; i < STATE->battlersCount; i++) { if (!(DATA.actionBattlers & (1 << i))) - { + { // Multi test partner trainers want setting to RecordedPartner controller if no move set in this case. if (IsAITest() && (i & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. SetAiActionToPass(sourceLine, i); else @@ -2082,7 +2350,7 @@ void CloseTurn(u32 sourceLine) static struct Pokemon *CurrentMon(s32 battlerId) { struct Pokemon *party; - if ((battlerId & BIT_SIDE) == B_SIDE_PLAYER) + if (battlerId == B_POSITION_PLAYER_LEFT || battlerId == B_POSITION_PLAYER_RIGHT) party = DATA.recordedBattle.playerParty; else party = DATA.recordedBattle.opponentParty; @@ -2320,7 +2588,7 @@ static void TryMarkExpectMove(u32 sourceLine, struct BattlePokemon *battler, str s32 target; INVALID_IF(DATA.turnState == TURN_CLOSED, "EXPECT_MOVE outside TURN"); - INVALID_IF(!IsAITest(), "EXPECT_MOVE is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "EXPECT_MOVE is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, and AI_TWO_VS_ONE_TEST"); MoveGetIdAndSlot(battlerId, ctx, &moveId, &moveSlot, sourceLine); target = MoveGetTarget(battlerId, moveId, ctx, sourceLine); @@ -2351,7 +2619,7 @@ void ExpectSendOut(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex s32 i, id; s32 battlerId = battler - gBattleMons; INVALID_IF(DATA.turnState == TURN_CLOSED, "EXPECT_SEND_OUT outside TURN"); - INVALID_IF(!IsAITest(), "EXPECT_SEND_OUT is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "EXPECT_SEND_OUT is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, AI_TWO_VS_ONE_TEST, and AI_ONE_VS_TWO_TEST"); INVALID_IF(partyIndex >= ((battlerId & BIT_SIDE) == B_SIDE_PLAYER ? DATA.playerPartySize : DATA.opponentPartySize), "EXPECT_SEND_OUT to invalid party index"); for (i = 0; i < STATE->battlersCount; i++) { @@ -2359,8 +2627,9 @@ void ExpectSendOut(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex INVALID_IF(DATA.currentMonIndexes[i] == partyIndex, "EXPECT_SEND_OUT to battler"); } if (!(DATA.actionBattlers & (1 << battlerId))) - { - if (IsAITest() && (battlerId & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. + { // Multi test partner trainers want setting to PlayerPartner controller even if no move set in this case. + if (IsAITest() && (((battlerId & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. + || (IsMultibattleTest() && battlerId == B_POSITION_PLAYER_RIGHT))) SetAiActionToPass(sourceLine, battlerId); else Move(sourceLine, battler, (struct MoveContext) { move: MOVE_CELEBRATE, explicitMove: TRUE }); @@ -2403,7 +2672,7 @@ void Score(u32 sourceLine, struct BattlePokemon *battler, u32 cmp, bool32 toValu s32 battlerId = battler - gBattleMons; s32 turn = DATA.turns; - INVALID_IF(!IsAITest(), "SCORE_%s%s is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST", sCmpToStringTable[cmp], (toValue == TRUE) ? "_VAL" : ""); + INVALID_IF(!IsAITest(), "SCORE_%s%s is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, & AI_TWO_VS_ONE_TEST", sCmpToStringTable[cmp], (toValue == TRUE) ? "_VAL" : ""); for (i = 0; i < MAX_AI_SCORE_COMPARISION_PER_TURN; i++) { @@ -2487,7 +2756,7 @@ void ExpectSwitch(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex) s32 i, id; s32 battlerId = battler - gBattleMons; INVALID_IF(DATA.turnState == TURN_CLOSED, "EXPECT_SWITCH outside TURN"); - INVALID_IF(!IsAITest(), "EXPECT_SWITCH is usable only in AI_SINGLE_BATTLE_TEST & AI_DOUBLE_BATTLE_TEST"); + INVALID_IF(!IsAITest(), "EXPECT_SWITCH is usable only in AI_SINGLE_BATTLE_TEST, AI_DOUBLE_BATTLE_TEST, AI_MULTI_BATTLE_TEST, AI_TWO_VS_ONE_TEST, and AI_ONE_VS_TWO_TEST"); INVALID_IF(DATA.actionBattlers & (1 << battlerId), "Multiple battler actions"); INVALID_IF(partyIndex >= ((battlerId & BIT_SIDE) == B_SIDE_PLAYER ? DATA.playerPartySize : DATA.opponentPartySize), "EXPECT_SWITCH to invalid party index"); From cec0351dd5cffcb95046c52b46b149174b49d6ac Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 24 Oct 2025 18:50:59 +0200 Subject: [PATCH 094/183] I don't know (#8015) --- src/battle_main.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index ba7dfa137f..366bcf9281 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3951,9 +3951,6 @@ static void TryDoEventsBeforeFirstTurn(void) for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++) gBattleCommunication[i] = 0; - for (i = 0; i < gBattlersCount; i++) - gBattleMons[i].volatiles.flinched = FALSE; - gBattleStruct->eventBlockCounter = 0; gBattleStruct->turnEffectsBattlerId = 0; gBattleScripting.moveendState = 0; From 65244cbeb4bbde865631204c4d662e5a1583ca27 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 24 Oct 2025 18:56:16 +0200 Subject: [PATCH 095/183] Moved usedHeldItem to Party State struct (#8006) --- include/battle.h | 2 +- include/battle_util.h | 1 - include/constants/pokemon.h | 2 +- src/battle_ai_main.c | 8 ++++---- src/battle_main.c | 4 ++-- src/battle_script_commands.c | 12 ++++++------ src/battle_util.c | 19 +++++++------------ 7 files changed, 21 insertions(+), 27 deletions(-) diff --git a/include/battle.h b/include/battle.h index 14c01629ab..4af433f60f 100644 --- a/include/battle.h +++ b/include/battle.h @@ -600,6 +600,7 @@ struct PartyState u32 changedSpecies:11; // For forms when multiple mons can change into the same pokemon. u32 sentOut:1; u32 padding:9; + u16 usedHeldItem; }; // Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise. @@ -669,7 +670,6 @@ struct BattleStruct u8 isSkyBattle:1; u8 multipleSwitchInSortedBattlers[MAX_BATTLERS_COUNT]; void (*savedCallback)(void); - u16 usedHeldItems[PARTY_SIZE][NUM_BATTLE_SIDES]; // For each party member and side. For harvest, recycle u16 chosenItem[MAX_BATTLERS_COUNT]; u16 choicedMove[MAX_BATTLERS_COUNT]; u16 changedItems[MAX_BATTLERS_COUNT]; diff --git a/include/battle_util.h b/include/battle_util.h index 281ce2c33b..b5693be0c0 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -340,7 +340,6 @@ bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes); void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast); bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind); bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); -u16 GetUsedHeldItem(u32 battler); bool32 PickupHasValidTarget(u32 battler); bool32 CantPickupItem(u32 battler); bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags); diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index e87aeda9f9..b23bdb11f2 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -218,7 +218,7 @@ #define EV_ITEM_RAISE_LIMIT ((I_VITAMIN_EV_CAP >= GEN_8) ? MAX_PER_STAT_EVS : 100) // Move category defines. -enum DamageCategory +enum __attribute__((packed)) DamageCategory { DAMAGE_CATEGORY_PHYSICAL, DAMAGE_CATEGORY_SPECIAL, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index ce7ab09768..0c1baa016b 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2066,7 +2066,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_RECYCLE: - if (GetUsedHeldItem(battlerAtk) == 0 || gBattleMons[battlerAtk].item != 0) + if (GetBattlerPartyState(battlerAtk)->usedHeldItem == 0 || gBattleMons[battlerAtk].item != 0) ADJUST_SCORE(-10); break; case EFFECT_IMPRISON: @@ -5058,13 +5058,13 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_RECYCLE: - if (GetUsedHeldItem(battlerAtk) != ITEM_NONE) + if (GetBattlerPartyState(battlerAtk)->usedHeldItem != ITEM_NONE) ADJUST_SCORE(WEAK_EFFECT); - if (IsRecycleEncouragedItem(GetUsedHeldItem(battlerAtk))) + if (IsRecycleEncouragedItem(GetBattlerPartyState(battlerAtk)->usedHeldItem)) ADJUST_SCORE(WEAK_EFFECT); if (aiData->abilities[battlerAtk] == ABILITY_RIPEN) { - u32 item = GetUsedHeldItem(battlerAtk); + u32 item = GetBattlerPartyState(battlerAtk)->usedHeldItem; u32 toHeal = (GetItemHoldEffectParam(item) == 10) ? 10 : gBattleMons[battlerAtk].maxHP / GetItemHoldEffectParam(item); if (IsStatBoostingBerry(item) && aiData->hpPercents[battlerAtk] > 60) diff --git a/src/battle_main.c b/src/battle_main.c index 366bcf9281..7a469847e0 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3107,8 +3107,8 @@ static void BattleStartClearSetData(void) for (i = 0; i < PARTY_SIZE; i++) { - gBattleStruct->usedHeldItems[i][B_SIDE_PLAYER] = 0; - gBattleStruct->usedHeldItems[i][B_SIDE_OPPONENT] = 0; + gBattleStruct->partyState[B_SIDE_PLAYER][i].usedHeldItem = ITEM_NONE; + gBattleStruct->partyState[B_SIDE_OPPONENT][i].usedHeldItem = ITEM_NONE; gBattleStruct->itemLost[B_SIDE_PLAYER][i].originalItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); gBattleStruct->itemLost[B_SIDE_OPPONENT][i].originalItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); gPartyCriticalHits[i] = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 084b37dc2d..4f49c90fac 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6871,7 +6871,7 @@ static void Cmd_moveend(void) u32 item = gBattleMons[gBattlerAttacker].item; gBattleMons[gBattlerAttacker].item = ITEM_NONE; gBattleStruct->battlerState[gBattlerAttacker].canPickupItem = TRUE; - gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerAttacker]][GetBattlerSide(gBattlerAttacker)] = item; + GetBattlerPartyState(gBattlerAttacker)->usedHeldItem = item; CheckSetUnburden(gBattlerAttacker); BtlController_EmitSetMonData( gBattlerAttacker, @@ -8690,8 +8690,8 @@ static void Cmd_removeitem(void) // Popped Air Balloon cannot be restored by any means. // Corroded items cannot be restored either. if (GetBattlerHoldEffect(battler) != HOLD_EFFECT_AIR_BALLOON - && GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS) - gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = itemId; // Remember if switched out + && GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS) + GetBattlerPartyState(battler)->usedHeldItem = itemId; // Remember if switched out gBattleMons[battler].item = ITEM_NONE; gBattleStruct->battlerState[battler].canPickupItem = TRUE; @@ -13300,9 +13300,9 @@ static void Cmd_tryrecycleitem(void) u16 *usedHeldItem; if (gCurrentMove == MOVE_NONE && GetBattlerAbility(gBattlerAttacker) == ABILITY_PICKUP) - usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + usedHeldItem = &GetBattlerPartyState(gBattlerTarget)->usedHeldItem; else - usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerAttacker]][GetBattlerSide(gBattlerAttacker)]; + usedHeldItem = &GetBattlerPartyState(gBattlerAttacker)->usedHeldItem; if (*usedHeldItem != ITEM_NONE && gBattleMons[gBattlerAttacker].item == ITEM_NONE) { gLastUsedItem = *usedHeldItem; @@ -16240,7 +16240,7 @@ void BS_HealOneSixth(void) void BS_TryRecycleBerry(void) { NATIVE_ARGS(const u8 *failInstr); - u16* usedHeldItem = &gBattleStruct->usedHeldItems[gBattlerPartyIndexes[gBattlerTarget]][GetBattlerSide(gBattlerTarget)]; + u16 *usedHeldItem = &GetBattlerPartyState(gBattlerTarget)->usedHeldItem; if (gBattleMons[gBattlerTarget].item == ITEM_NONE && gBattleStruct->changedItems[gBattlerTarget] == ITEM_NONE // Will not inherit an item && GetItemPocket(*usedHeldItem) == POCKET_BERRIES) diff --git a/src/battle_util.c b/src/battle_util.c index b3c1c7941c..9f9bf10dc2 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4544,7 +4544,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab && PickupHasValidTarget(battler)) { gBattlerTarget = RandomUniformExcept(RNG_PICKUP, 0, gBattlersCount - 1, CantPickupItem); - gLastUsedItem = GetUsedHeldItem(gBattlerTarget); + gLastUsedItem = GetBattlerPartyState(gBattlerTarget)->usedHeldItem; BattleScriptExecute(BattleScript_PickupActivates); effect++; } @@ -4553,9 +4553,9 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if ((IsBattlerWeatherAffected(battler, B_WEATHER_SUN) || RandomPercentage(RNG_HARVEST, 50)) && gBattleMons[battler].item == ITEM_NONE && gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item - && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) + && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES) { - gLastUsedItem = GetUsedHeldItem(battler); + gLastUsedItem = GetBattlerPartyState(battler)->usedHeldItem; BattleScriptExecute(BattleScript_HarvestActivates); effect++; } @@ -4748,12 +4748,12 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab { gBattleScripting.battler = battler; gDisableStructs[battler].cudChew = FALSE; - gLastUsedItem = gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; - gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = ITEM_NONE; + gLastUsedItem = GetBattlerPartyState(battler)->usedHeldItem; + GetBattlerPartyState(battler)->usedHeldItem = ITEM_NONE; BattleScriptExecute(BattleScript_CudChewActivates); effect++; } - else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES) + else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES) { gDisableStructs[battler].cudChew = TRUE; } @@ -9700,17 +9700,12 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch return TRUE; } -u16 GetUsedHeldItem(u32 battler) -{ - return gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)]; -} - bool32 CantPickupItem(u32 battler) { // Used by RandomUniformExcept() for RNG_PICKUP if (battler == gBattlerAttacker && (GetGenConfig(GEN_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) return TRUE; - return !(IsBattlerAlive(battler) && GetUsedHeldItem(battler) && gBattleStruct->battlerState[battler].canPickupItem); + return !(IsBattlerAlive(battler) && GetBattlerPartyState(battler)->usedHeldItem && gBattleStruct->battlerState[battler].canPickupItem); } bool32 PickupHasValidTarget(u32 battler) From 7ebb939cbc77a78235f9cc2e5838a811e5005542 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 25 Oct 2025 13:52:40 +0200 Subject: [PATCH 096/183] Remove usage of gBattlerTarget for MirrorHerb/Opportunist (#8033) --- data/battle_scripts_1.s | 2 +- src/battle_script_commands.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 2aaf0649b3..ab00c5138f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8023,7 +8023,7 @@ BattleScript_OpportunistCopyStatChange:: call BattleScript_AbilityPopUpScripting BattleScript_OpportunistStartCopyStats: copyfoesstatincrease BS_SCRIPTING, BattleScript_OpportunistCopyStatChangeEnd - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_OpportunistCopyStatChangeEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG setbyte sSTAT_ANIM_PLAYED, TRUE @ play stat change animation only once diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4f49c90fac..7d538e2ff9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15597,7 +15597,6 @@ void BS_CopyFoesStatIncrease(void) SET_STATCHANGER(stat + 1, gQueuedStatBoosts[battler].statChanges[stat], FALSE); gQueuedStatBoosts[battler].stats &= ~(1 << stat); - gBattlerTarget = battler; gBattlescriptCurrInstr = cmd->nextInstr; return; } From be23dfdf2acb11c6bbd49a0130058eb7664dc861 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sat, 25 Oct 2025 14:37:47 +0200 Subject: [PATCH 097/183] Even more enums and documentation (#8029) --- include/battle_ai_script_commands.h | 0 include/battle_ai_switch_items.h | 2 +- include/battle_ai_util.h | 10 ++++---- include/battle_dynamax.h | 2 +- include/battle_environment.h | 4 ++-- include/battle_hold_effects.h | 2 +- include/battle_script_commands.h | 3 +-- include/battle_util.h | 4 ++-- include/constants/pokemon.h | 22 ++++++++++-------- include/item.h | 2 +- include/pokemon.h | 6 ++--- src/battle_ai_switch_items.c | 2 +- src/battle_ai_util.c | 34 ++++++++++++++++----------- src/battle_anim_throw.c | 2 +- src/battle_debug.c | 1 + src/battle_dome.c | 3 +-- src/battle_hold_effects.c | 8 +++---- src/battle_main.c | 2 +- src/battle_script_commands.c | 36 ++++++++++++++++------------- src/battle_tower.c | 2 +- src/battle_util.c | 25 ++++++++++++-------- src/contest_ai.c | 2 +- src/contest_util.c | 2 +- src/debug.c | 2 +- src/item.c | 2 +- src/metatile_behavior.c | 2 +- src/pokedex_cry_screen.c | 2 +- src/pokemon.c | 29 +++++++++++++---------- src/pokemon_summary_screen.c | 2 +- src/save.c | 2 +- src/script_pokemon_util.c | 5 ++-- test/test_runner_battle.c | 2 ++ 32 files changed, 125 insertions(+), 99 deletions(-) delete mode 100644 include/battle_ai_script_commands.h diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index 8fcd7ba353..afc50a2364 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -45,7 +45,7 @@ void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); void AI_TrySwitchOrUseItem(u32 battler); u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType); bool32 ShouldSwitch(u32 battler); -bool32 IsMonGrounded(u16 heldItemEffect, enum Ability ability, u8 type1, u8 type2); +bool32 IsMonGrounded(enum HoldEffect heldItemEffect, enum Ability ability, u8 type1, u8 type2); void ModifySwitchAfterMoveScoring(u32 battler); #endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index f175f88c40..ee6922042e 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -94,7 +94,7 @@ void RecordAllMoves(u32 battler); void RecordKnownMove(u32 battlerId, u32 move); void RecordAbilityBattle(u32 battlerId, enum Ability abilityId); void ClearBattlerAbilityHistory(u32 battlerId); -void RecordItemEffectBattle(u32 battlerId, u32 itemEffect); +void RecordItemEffectBattle(u32 battlerId, enum HoldEffect itemEffect); void ClearBattlerItemEffectHistory(u32 battlerId); void SaveBattlerData(u32 battlerId); void SetBattlerData(u32 battlerId); @@ -151,8 +151,8 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); -bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, u32 stat); -bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, u32 stat); +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, enum Stat stat); +bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, enum Stat stat); bool32 AreBattlersStatsMaxed(u32 battler); u32 CountPositiveStatStages(u32 battlerId); u32 CountNegativeStatStages(u32 battlerId); @@ -256,7 +256,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct Ai bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef); // IsTargetingPartner includes a check to make sure the adjacent pokemon is truly a partner. u32 GetAllyChosenMove(u32 battlerId); -bool32 IsBattle1v1(); +bool32 IsBattle1v1(void); // IsBattle1v1 is distinct from !IsDoubleBattle. If the player is fighting Maxie and Tabitha, with Steven as their partner, and both Tabitha and Steven have run out of Pokemon, the battle is 1v1, even though mechanically it is a Double Battle for how battlers and flags are set. // Most AI checks should be using IsBattle1v1; most engine checks should be using !IsDoubleBattle bool32 HasTwoOpponents(u32 battler); @@ -287,7 +287,7 @@ bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category); // score increases u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId); u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statId); -u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat); +u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat); void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index 03dfef96a3..99c917f456 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -5,7 +5,7 @@ bool32 CanDynamax(u32 battler); bool32 IsGigantamaxed(u32 battler); -void ApplyDynamaxHPMultiplier(struct Pokemon* mon); +void ApplyDynamaxHPMultiplier(struct Pokemon *mon); void ActivateDynamax(u32 battler); u16 GetNonDynamaxHP(u32 battler); u16 GetNonDynamaxMaxHP(u32 battler); diff --git a/include/battle_environment.h b/include/battle_environment.h index e9435aa454..e93b848e87 100644 --- a/include/battle_environment.h +++ b/include/battle_environment.h @@ -4,8 +4,8 @@ #include "constants/battle.h" #include "battle_bg.h" -struct BattleEnvironment { - u8 name[26]; +struct BattleEnvironment +{ u16 naturePower; u16 secretPowerEffect; u8 camouflageType; diff --git a/include/battle_hold_effects.h b/include/battle_hold_effects.h index 7ddace7782..56a3718fb4 100644 --- a/include/battle_hold_effects.h +++ b/include/battle_hold_effects.h @@ -29,7 +29,7 @@ extern const struct HoldEffectInfo gHoldEffectsInfo[]; typedef bool32 (*ActivationTiming)(enum HoldEffect holdEffect); enum ItemEffect ItemBattleEffects(u32 primaryBattler, u32 secondaryBattler, enum HoldEffect holdEffect, ActivationTiming timing); enum ItemEffect TryBoosterEnergy(u32 battler, enum Ability ability, ActivationTiming timing); -enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, ActivationTiming timing); +enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, enum Stat statId, u32 itemId, ActivationTiming timing); bool32 IsOnSwitchInActivation(enum HoldEffect holdEffect); bool32 IsOnSwitchInFirstTurnActivation(enum HoldEffect holdEffect); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index df30037f4c..2f3bd8e731 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -43,7 +43,6 @@ union TRANSPARENT StatChangeFlags s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); s32 GetCritHitOdds(s32 critChanceIndex); -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 HasBattlerActedThisTurn(u32 battler); u32 GetBattlerTurnOrderNum(u32 battler); bool32 NoAliveMonsForBattlerSide(u32 battler); @@ -67,7 +66,7 @@ bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); void StealTargetItem(u8 battlerStealer, u8 battlerItem); u8 GetCatchingBattler(void); -u32 GetHighestStatId(u32 battlerId); +enum Stat GetHighestStatId(u32 battlerId); bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, u32 moveType); bool32 IsMoveNotAllowedInSkyBattles(u32 move); bool32 DoSwitchInAbilities(u32 battlerId); diff --git a/include/battle_util.h b/include/battle_util.h index b5693be0c0..38f26be489 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -338,7 +338,7 @@ void TrySaveExchangedItem(u32 battler, u16 stolenItem); bool32 IsPartnerMonFromSameTrainer(u32 battler); bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes); void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast); -bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind); +bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind); bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); bool32 PickupHasValidTarget(u32 battler); bool32 CantPickupItem(u32 battler); @@ -412,7 +412,7 @@ void RemoveAllHazardsFromField(u32 side); bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType); void RemoveHazardFromField(u32 side, enum Hazards hazardType); bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect); bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander); bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); u32 GetNaturePowerMove(u32 battler); diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index b23bdb11f2..76c4667696 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -74,16 +74,18 @@ #define NUM_NATURES 25 // Pokémon Stats -#define STAT_HP 0 -#define STAT_ATK 1 -#define STAT_DEF 2 -#define STAT_SPEED 3 -#define STAT_SPATK 4 -#define STAT_SPDEF 5 -#define NUM_STATS 6 - -#define STAT_ACC 6 // Only in battles. -#define STAT_EVASION 7 // Only in battles. +enum __attribute__((packed)) Stat +{ + STAT_HP, + STAT_ATK, + STAT_DEF, + STAT_SPEED, + STAT_SPATK, + STAT_SPDEF, + NUM_STATS, + STAT_ACC = NUM_STATS, // Only in battles. + STAT_EVASION, // Only in battles. +}; #define NUM_NATURE_STATS (NUM_STATS - 1) // excludes HP #define NUM_BATTLE_STATS (NUM_STATS + 2) // includes Accuracy and Evasion diff --git a/include/item.h b/include/item.h index eaec831fe5..fa52b4adb5 100644 --- a/include/item.h +++ b/include/item.h @@ -231,7 +231,7 @@ bool32 RemovePyramidBagItem(u16 itemId, u16 count); const u8 *GetItemName(u16 itemId); u32 GetItemPrice(u16 itemId); const u8 *GetItemEffect(u32 itemId); -u32 GetItemHoldEffect(u32 itemId); +enum HoldEffect GetItemHoldEffect(u32 itemId); u32 GetItemHoldEffectParam(u32 itemId); const u8 *GetItemDescription(u16 itemId); u8 GetItemImportance(u16 itemId); diff --git a/include/pokemon.h b/include/pokemon.h index a72cc83b6c..6264dbd2cb 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -601,8 +601,8 @@ enum { struct NatureInfo { const u8 *name; - u8 statUp; - u8 statDown; + enum Stat statUp; + enum Stat statDown; u8 backAnim; u8 pokeBlockAnim[2]; u8 battlePalacePercents[4]; @@ -826,7 +826,7 @@ u8 GetPlayerFlankId(void); u16 GetLinkTrainerFlankId(u8 linkPlayerId); s32 GetBattlerMultiplayerId(u16 id); u8 GetTrainerEncounterMusicId(u16 trainerOpponentId); -u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex); +u16 ModifyStatByNature(u8 nature, u16 stat, enum Stat statIndex); void AdjustFriendship(struct Pokemon *mon, u8 event); void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies); u16 GetMonEVCount(struct Pokemon *mon); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 62a68cf800..6b7dcf300b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1535,7 +1535,7 @@ static u32 GetFirstNonInvalidMon(u32 firstId, u32 lastId, u32 invalidMons, u32 b return PARTY_SIZE; } -bool32 IsMonGrounded(u16 heldItemEffect, enum Ability ability, u8 type1, u8 type2) +bool32 IsMonGrounded(enum HoldEffect heldItemEffect, enum Ability ability, u8 type1, u8 type2) { // List that makes mon not grounded if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index d34040ffc8..6049a13842 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -271,7 +271,7 @@ void ClearBattlerAbilityHistory(u32 battlerId) gBattleHistory->abilities[battlerId] = ABILITY_NONE; } -void RecordItemEffectBattle(u32 battlerId, u32 itemEffect) +void RecordItemEffectBattle(u32 battlerId, enum HoldEffect itemEffect) { gBattleHistory->itemEffects[battlerId] = itemEffect; gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect = itemEffect; @@ -2107,7 +2107,7 @@ s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) } // stat stages -bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, u32 stat) +bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, enum Stat stat) { if (gBattleMons[battlerDef].statStages[stat] == MIN_STAT_STAGE) return FALSE; @@ -2170,7 +2170,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, return TRUE; } -u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) +u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat) { u32 tempScore = NO_INCREASE; @@ -2236,12 +2236,14 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat) if (gBattleMons[battlerDef].volatiles.cursed) tempScore += WEAK_EFFECT; break; + default: + break; } return (tempScore > BEST_EFFECT) ? BEST_EFFECT : tempScore; // don't inflate score so only max +4 } -bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, u32 stat) +bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, enum Stat stat) { if ((gBattleMons[battler].statStages[stat] < MAX_STAT_STAGE && battlerAbility != ABILITY_CONTRARY) || (battlerAbility == ABILITY_CONTRARY && gBattleMons[battler].statStages[stat] > MIN_STAT_STAGE)) @@ -2251,7 +2253,7 @@ bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, u32 stat) bool32 AreBattlersStatsMaxed(u32 battlerId) { - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] < MAX_STAT_STAGE) @@ -2262,7 +2264,7 @@ bool32 AreBattlersStatsMaxed(u32 battlerId) bool32 AnyStatIsRaised(u32 battlerId) { - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { @@ -2275,7 +2277,7 @@ bool32 AnyStatIsRaised(u32 battlerId) u32 CountPositiveStatStages(u32 battlerId) { u32 count = 0; - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] > DEFAULT_STAT_STAGE) @@ -2287,7 +2289,7 @@ u32 CountPositiveStatStages(u32 battlerId) u32 CountNegativeStatStages(u32 battlerId) { u32 count = 0; - u32 i; + enum Stat i; for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) @@ -3192,7 +3194,7 @@ bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability) static bool32 AnyUsefulStatIsRaised(u32 battler) { - u32 statId; + enum Stat statId; for (statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { @@ -3210,6 +3212,8 @@ static bool32 AnyUsefulStatIsRaised(u32 battler) break; case STAT_SPEED: return TRUE; + default: + break; } } } @@ -4033,7 +4037,7 @@ bool32 ShouldCureStatusWithItem(u32 battlerAtk, u32 battlerDef, struct AiLogicDa } // Partner Logic -bool32 IsBattle1v1() +bool32 IsBattle1v1(void) { if (IsDoubleBattle() && ((IsBattlerAlive(B_POSITION_PLAYER_LEFT) && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) @@ -4706,7 +4710,7 @@ static bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, return FALSE; } -static u32 GetStatBeingChanged(enum StatChange statChange) +static enum Stat GetStatBeingChanged(enum StatChange statChange) { switch(statChange) { @@ -4774,7 +4778,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY); // Don't care about the priority of our setup move, care about outspeeding otherwise u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); u32 i; - u32 statId = GetStatBeingChanged(statChange); + enum Stat statId = GetStatBeingChanged(statChange); u32 stages = GetStagesOfStatChange(statChange); if (considerContrary && gAiLogicData->abilities[battlerAtk] == ABILITY_CONTRARY) @@ -4878,6 +4882,8 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, else tempScore += DECENT_EFFECT; break; + default: + break; } // if already inclined to boost, be slightly more likely to if boost levels matter @@ -5479,7 +5485,7 @@ s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle) bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) { - u8 i; + enum Stat i; // Want to copy positive stat changes for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) { @@ -5499,6 +5505,8 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) case STAT_DEF: case STAT_SPDEF: return (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL); + default: + break; } } } diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index 54f16003be..5ee1a7d6da 100644 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -2312,7 +2312,7 @@ void AnimTask_SwapMonSpriteToFromSubstitute(u8 taskId) { u8 spriteId; u32 x; - u32 done = FALSE; + bool32 done = FALSE; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; switch (gTasks[taskId].data[10]) diff --git a/src/battle_debug.c b/src/battle_debug.c index 6a96b52e88..98c440291b 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2291,6 +2291,7 @@ static const u8 *const sHoldEffectNames[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_OGERPON_MASK] = COMPOUND_STRING("Ogerpon Mask"), [HOLD_EFFECT_BERSERK_GENE] = COMPOUND_STRING("Berserk Gene"), }; + static const u8 *GetHoldEffectName(enum HoldEffect holdEffect) { if (sHoldEffectNames[holdEffect] == NULL) diff --git a/src/battle_dome.c b/src/battle_dome.c index 1629330898..309a0e4a58 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2136,9 +2136,8 @@ static void InitDomeTrainers(void) static void CalcDomeMonStats(const struct TrainerMon *fmon, int level, u8 ivs, int *stats) { int evs[NUM_STATS]; - int i; - for (i = 0; i < NUM_STATS; i++) + for (enum Stat i = 0; i < NUM_STATS; i++) { if (fmon->ev != NULL) evs[i] = fmon->ev[i]; diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c index b325956d9d..4f4d65b056 100644 --- a/src/battle_hold_effects.c +++ b/src/battle_hold_effects.c @@ -97,7 +97,7 @@ static enum ItemEffect TryRoomService(u32 battler, ActivationTiming timing) return ITEM_NO_EFFECT; } -enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 itemId, ActivationTiming timing) +enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, enum Stat statId, u32 itemId, ActivationTiming timing) { if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN)) { @@ -516,7 +516,7 @@ static enum ItemEffect TryThroatSray(u32 battlerAtk) return effect; } -static enum ItemEffect DamagedStatBoostBerryEffect(u32 battlerDef, u32 battlerAtk, u32 statId, enum DamageCategory category) +static enum ItemEffect DamagedStatBoostBerryEffect(u32 battlerDef, u32 battlerAtk, enum Stat statId, enum DamageCategory category) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -968,7 +968,7 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, A return effect; } -static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, ActivationTiming timing) +static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, enum Stat statId, ActivationTiming timing) { enum ItemEffect effect = ITEM_NO_EFFECT; enum Ability ability = GetBattlerAbility(battler); @@ -1013,7 +1013,7 @@ static enum ItemEffect CriticalHitRatioUp(u32 battler, u32 itemId, ActivationTim static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, ActivationTiming timing) { enum ItemEffect effect = ITEM_NO_EFFECT; - s32 stat; + enum Stat stat; for (stat = STAT_ATK; stat < NUM_STATS; stat++) { diff --git a/src/battle_main.c b/src/battle_main.c index 7a469847e0..edaa0f48c7 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -1985,7 +1985,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer } if (partyData[monIndex].isShiny) { - u32 data = TRUE; + bool32 data = TRUE; SetMonData(&party[i], MON_DATA_IS_SHINY, &data); } if (partyData[monIndex].dynamaxLevel > 0) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7d538e2ff9..949e0d4df0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -311,7 +311,7 @@ enum GiveCaughtMonStates #define TAG_LVLUP_BANNER_MON_ICON 55130 static void TrySetDestinyBondToHappen(void); -static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr); +static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr); static bool32 IsMonGettingExpSentOut(void); static void InitLevelUpBanner(void); static bool8 SlideInLevelUpBanner(void); @@ -3562,7 +3562,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; case MOVE_EFFECT_ORDER_UP: { - u32 stat = 0; + enum Stat stat = 0; bool32 commanderAffected = TRUE; switch (gBattleStruct->battlerState[gEffectBattler].commanderSpecies) { @@ -3735,7 +3735,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai case MOVE_EFFECT_LOWER_EVASIVENESS_SIDE: if (!NoAliveMonsForEitherParty()) { - u32 statId = 0; + enum Stat statId = 0; u32 stage = 1; switch (gBattleScripting.moveEffect) { @@ -5581,7 +5581,7 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move if (!IsBattlerAlive(battlerAtk) || NoAliveMonsForEitherParty()) break; - u32 stat = STAT_ATK; + enum Stat stat = STAT_ATK; u32 numMonsFainted = NumFaintedBattlersByAttacker(battlerAtk); if (abilityAtk == ABILITY_BEAST_BOOST) @@ -5671,7 +5671,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) return FALSE; - u32 effect = FALSE; + bool32 effect = FALSE; enum BattleSide side = GetBattlerSide(gBattlerTarget); switch (moveEffect) { @@ -7444,7 +7444,7 @@ static void Cmd_openpartyscreen(void) { if (((1u << i) & hitmarkerFaintBits)) { - u32 skipPartnerCheck = FALSE; + bool32 skipPartnerCheck = FALSE; if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerSide(i) == B_SIDE_OPPONENT && TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE) @@ -9331,9 +9331,11 @@ u32 IsAbilityStatusProtected(u32 battler, enum Ability ability) || IsFlowerVeilProtected(battler); } -u32 GetHighestStatId(u32 battler) +enum Stat GetHighestStatId(u32 battler) { - u32 i, highestId = STAT_ATK, highestStat = gBattleMons[battler].attack; + enum Stat i; + enum Stat highestId = STAT_ATK; + u32 highestStat = gBattleMons[battler].attack; for (i = STAT_DEF; i < NUM_STATS; i++) { @@ -10012,7 +10014,7 @@ static u16 ReverseStatChangeMoveEffect(u16 moveEffect) static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 stats, s32 statValue, u32 statId, bool32 certain) { - u32 currStat = 0; + enum Stat currStat = 0; u32 changeableStatsCount = 1; // current stat is counted automatically u32 statAnimId = statId; bool32 statChangeByTwo = statValue > 1 || statValue < -1; @@ -10098,7 +10100,7 @@ static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 st } } -static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr) +static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union StatChangeFlags flags, u32 stats, const u8 *BS_ptr) { u32 index, battlerAbility; enum HoldEffect battlerHoldEffect; @@ -14239,7 +14241,7 @@ static void Cmd_swapstatstages(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static u16 *GetBattlerStat(struct BattlePokemon *battler, u32 stat) +static u16 *GetBattlerStat(struct BattlePokemon *battler, enum Stat stat) { switch (stat) { @@ -15934,7 +15936,7 @@ void BS_TrySpectralThiefSteal(void) bool32 contrary = GetBattlerAbility(gBattlerAttacker) == ABILITY_CONTRARY; gBattleStruct->stolenStats[0] = 0; // Stats to steal. gBattleScripting.animArg1 = 0; - for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) { if (gBattleMons[gBattlerTarget].statStages[stat] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[stat] != MAX_STAT_STAGE) { @@ -15979,7 +15981,7 @@ void BS_SpectralThiefPrintStats(void) { NATIVE_ARGS(); - for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) { if (gBattleStruct->stolenStats[0] & (1u << stat)) { @@ -16045,7 +16047,7 @@ void BS_SwapStats(void) { NATIVE_ARGS(u8 stat); - u32 stat = cmd->stat; + enum Stat stat = cmd->stat; u32 temp; switch (stat) @@ -16068,6 +16070,8 @@ void BS_SwapStats(void) case STAT_SPDEF: SWAP(gBattleMons[gBattlerAttacker].spDefense, gBattleMons[gBattlerTarget].spDefense, temp); break; + default: + break; } PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); gBattlescriptCurrInstr = cmd->nextInstr; @@ -16279,7 +16283,7 @@ void BS_JumpIfIntimidateAbilityPrevented(void) { NATIVE_ARGS(); - u32 hasAbility = FALSE; + bool32 hasAbility = FALSE; enum Ability ability = GetBattlerAbility(gBattlerTarget); switch (ability) @@ -16681,7 +16685,7 @@ void BS_TryAcupressure(void) { NATIVE_ARGS(const u8 *failInstr); u32 bits = 0; - for (u32 stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) { if (CompareStat(gBattlerTarget, stat, MAX_STAT_STAGE, CMP_LESS_THAN)) bits |= 1u << stat; diff --git a/src/battle_tower.c b/src/battle_tower.c index f925826a6f..183afaf10a 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1632,7 +1632,7 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 if (fmon->isShiny) { - u32 data = TRUE; + bool32 data = TRUE; SetMonData(dst, MON_DATA_IS_SHINY, &data); } if (fmon->dynamaxLevel > 0) diff --git a/src/battle_util.c b/src/battle_util.c index 9f9bf10dc2..b3c50a9e6c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2388,7 +2388,7 @@ static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) { - u32 noEffect = FALSE; + bool32 noEffect = FALSE; u32 calledMove = MOVE_NONE; const u8 *battleScript = NULL; battleScript = BattleScript_SubmoveAttackstring; @@ -3453,7 +3453,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability ability { enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; const u8 *battleScript = NULL; - u32 statId = 0; + enum Stat statId = 0; u32 statAmount = 1; switch (abilityDef) @@ -4067,7 +4067,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab case ABILITY_DOWNLOAD: if (!gSpecialStatuses[battler].switchInAbilityDone) { - u32 statId, opposingBattler; + enum Stat statId; + u32 opposingBattler; u32 opposingDef = 0, opposingSpDef = 0; opposingBattler = BATTLE_OPPOSITE(battler); @@ -4463,7 +4464,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab case ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK: if (!gSpecialStatuses[battler].switchInAbilityDone) { - u32 stat; + enum Stat stat; if (gLastUsedAbility == ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK) stat = STAT_ATK; @@ -6603,7 +6604,7 @@ u32 GetBattlerWeight(u32 battler) u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc) { - u32 i; + enum Stat i; u32 count = 0; for (i = 0; i < NUM_BATTLE_STATS; i++) @@ -7293,7 +7294,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) break; case ABILITY_PROTOSYNTHESIS: { - u8 defHighestStat = GetHighestStatId(battlerDef); + enum Stat defHighestStat = GetHighestStatId(battlerDef); if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivated) && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) && !(gBattleMons[battlerDef].volatiles.transformed)) @@ -7566,7 +7567,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_PROTOSYNTHESIS: if (!(gBattleMons[battlerAtk].volatiles.transformed)) { - u32 atkHighestStat = GetHighestStatId(battlerAtk); + enum Stat atkHighestStat = GetHighestStatId(battlerAtk); if (((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivated) { if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) @@ -7577,7 +7578,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_QUARK_DRIVE: if (!(gBattleMons[battlerAtk].volatiles.transformed)) { - u32 atkHighestStat = GetHighestStatId(battlerAtk); + enum Stat atkHighestStat = GetHighestStatId(battlerAtk); if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivated) { if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) @@ -9631,7 +9632,7 @@ bool32 TestIfSheerForceAffected(u32 battler, u16 move) } // This function is the body of "jumpifstat", but can be used dynamically in a function -bool32 CompareStat(u32 battler, u8 statId, u8 cmpTo, u8 cmpKind) +bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind) { bool32 ret = FALSE; u8 statValue = gBattleMons[battler].statStages[statId]; @@ -10555,7 +10556,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abil return effect; } -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect) +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect) { u32 calc, moveAcc; s8 buff, accStage, evasionStage; @@ -10652,6 +10653,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkA if (HasBattlerActedThisTurn(battlerDef)) calc = (calc * (100 + atkParam)) / 100; break; + default: + break; } // Target's hold effect @@ -10660,6 +10663,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkA case HOLD_EFFECT_EVASION_UP: calc = (calc * (100 - defParam)) / 100; break; + default: + break; } if (gBattleStruct->battlerState[battlerAtk].usedMicleBerry) diff --git a/src/contest_ai.c b/src/contest_ai.c index 77f27fcc91..8d4a347280 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -1199,7 +1199,7 @@ static void ContestAICmd_if_condition_not_eq(void) static void ContestAICmd_get_used_combo_starter(void) { - u16 result = FALSE; + bool32 result = FALSE; u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]); if (IsContestantAllowedToCombo(contestant)) diff --git a/src/contest_util.c b/src/contest_util.c index 3bd5e1ec5f..dd7070e9a3 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -1959,7 +1959,7 @@ void TryEnterContestMon(void) u16 HasMonWonThisContestBefore(void) { - u16 hasRankRibbon = FALSE; + bool32 hasRankRibbon = FALSE; struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex]; switch (gSpecialVar_ContestCategory) { diff --git a/src/debug.c b/src/debug.c index 2d3f1b2248..a683311b8b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -995,7 +995,7 @@ static const u16 sLocationFlags[] = static u8 Debug_CheckToggleFlags(u8 id) { - u8 result = FALSE; + bool32 result = FALSE; switch (id) { diff --git a/src/item.c b/src/item.c index 53633bbe66..155909e547 100644 --- a/src/item.c +++ b/src/item.c @@ -812,7 +812,7 @@ const u8 *GetItemEffect(u32 itemId) return gItemsInfo[SanitizeItemId(itemId)].effect; } -u32 GetItemHoldEffect(u32 itemId) +enum HoldEffect GetItemHoldEffect(u32 itemId) { return gItemsInfo[SanitizeItemId(itemId)].holdEffect; } diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 687b98ca27..115a0d4c7b 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -331,7 +331,7 @@ bool8 MetatileBehavior_IsSouthArrowWarp(u8 metatileBehavior) bool8 UNUSED Unref_MetatileBehavior_IsArrowWarp(u8 metatileBehavior) { - u8 isArrowWarp = FALSE; + bool32 isArrowWarp = FALSE; if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) || MetatileBehavior_IsWestArrowWarp(metatileBehavior) diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c index b567aac391..810a8dae6a 100644 --- a/src/pokedex_cry_screen.c +++ b/src/pokedex_cry_screen.c @@ -228,7 +228,7 @@ static const struct SpritePalette sCryMeterNeedleSpritePalettes[] = bool8 LoadCryWaveformWindow(struct CryScreenWindow *window, u8 windowId) { u8 i; - u8 finished = FALSE; + bool32 finished = FALSE; switch (gDexCryScreenState) { diff --git a/src/pokemon.c b/src/pokemon.c index b2712f6470..51449d7889 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -852,7 +852,7 @@ static const u8 sGetMonDataEVConstants[] = }; // For stat-raising items -static const u8 sStatsToRaise[] = +static const enum Stat sStatsToRaise[] = { STAT_ATK, STAT_ATK, STAT_DEF, STAT_SPEED, STAT_SPATK, STAT_SPDEF, STAT_ACC }; @@ -1042,8 +1042,8 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u32 value; u16 checksum; u8 i; - u8 availableIVs[NUM_STATS]; - u8 selectedIvs[NUM_STATS]; + enum Stat availableIVs[NUM_STATS]; + enum Stat selectedIvs[NUM_STATS]; bool32 isShiny; ZeroBoxMonData(boxMon); @@ -1200,6 +1200,8 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, case STAT_SPDEF: SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); break; + default: + break; } } } @@ -3743,9 +3745,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov u8 itemEffectParam = ITEM_EFFECT_ARG_START; u32 temp1, temp2; s8 friendshipChange = 0; - u8 holdEffect; + enum HoldEffect holdEffect; u8 battler = MAX_BATTLERS_COUNT; - u32 friendshipOnly = FALSE; + bool32 friendshipOnly = FALSE; u16 heldItem; u8 effectFlags; s8 evChange; @@ -4329,7 +4331,7 @@ u8 GetItemEffectParamOffset(u32 battler, u16 itemId, u8 effectByte, u8 effectBit return offset; } -static void BufferStatRoseMessage(s32 statIdx) +static void BufferStatRoseMessage(enum Stat statIdx) { gBattlerTarget = gBattlerInMenuId; StringCopy(gBattleTextBuff1, gStatNamesTable[sStatsToRaise[statIdx]]); @@ -4470,7 +4472,7 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti for (i = 0; params != NULL && params[i].condition != CONDITIONS_END; i++) { enum EvolutionConditions condition = params[i].condition; - u32 currentCondition = FALSE; + bool32 currentCondition = FALSE; switch(condition) { @@ -4761,7 +4763,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); - u32 holdEffect; + enum HoldEffect holdEffect; const struct Evolution *evolutions = GetSpeciesEvolutions(species); if (evolutions == NULL) @@ -5204,7 +5206,7 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) return gTrainers[difficulty][sanitizedTrainerId].encounterMusic_gender & (F_TRAINER_FEMALE - 1); } -u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) +u16 ModifyStatByNature(u8 nature, u16 stat, enum Stat statIndex) { // Don't modify HP, Accuracy, or Evasion by nature if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS || gNaturesInfo[nature].statUp == gNaturesInfo[nature].statDown) @@ -5220,7 +5222,7 @@ u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species, heldItem; - u8 holdEffect; + enum HoldEffect holdEffect; s8 mod; if (ShouldSkipFriendshipChange()) @@ -5302,8 +5304,9 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) u16 evIncrease = 0; u16 totalEVs = 0; u16 heldItem; - u8 holdEffect; - int i, multiplier; + enum HoldEffect holdEffect; + enum Stat i; + int multiplier; u8 stat; u8 bonus; u32 currentEVCap = GetCurrentEVCap(); @@ -5382,6 +5385,8 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) else evIncrease = gSpeciesInfo[defeatedSpecies].evYield_SpDefense * multiplier; break; + default: + break; } if (holdEffect == HOLD_EFFECT_MACHO_BRACE) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index a0a00894ce..5ecfb83f2a 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3757,7 +3757,7 @@ static void PrintRibbonCount(void) PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_RIBBON_COUNT), text, x, 1, 0, 0); } -static void BufferStat(u8 *dst, u8 statIndex, u32 stat, u32 strId, u32 n) +static void BufferStat(u8 *dst, enum Stat statIndex, u32 stat, u32 strId, u32 n) { static const u8 sTextNatureDown[] = _("{COLOR}{08}"); static const u8 sTextNatureUp[] = _("{COLOR}{05}"); diff --git a/src/save.c b/src/save.c index 4e6c41b6f9..f54beb2d8c 100644 --- a/src/save.c +++ b/src/save.c @@ -856,7 +856,7 @@ bool8 WriteSaveBlock2(void) // It returns TRUE when finished. bool8 WriteSaveBlock1Sector(void) { - u8 finished = FALSE; + bool32 finished = FALSE; u16 sectorId = ++gIncrementalSectorId; // Because WriteSaveBlock2 will have been called prior, this will be SECTOR_ID_SAVEBLOCK1_START if (sectorId <= SECTOR_ID_SAVEBLOCK1_END) { diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index d4fba87859..13ffc4948d 100644 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -518,8 +518,8 @@ void ScrCmd_createmon(struct ScriptContext *ctx) // Perfect IV calculation u32 i; - u8 availableIVs[NUM_STATS]; - u8 selectedIvs[NUM_STATS]; + enum Stat availableIVs[NUM_STATS]; + enum Stat selectedIvs[NUM_STATS]; if (gSpeciesInfo[species].perfectIVCount != 0) { // Initialize a list of IV indices. @@ -543,6 +543,7 @@ void ScrCmd_createmon(struct ScriptContext *ctx) case STAT_SPEED: speedIv = MAX_PER_STAT_IVS; break; case STAT_SPATK: spAtkIv = MAX_PER_STAT_IVS; break; case STAT_SPDEF: spDefIv = MAX_PER_STAT_IVS; break; + default: break; } } } diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 5301bd911d..f51912d4f0 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2079,6 +2079,8 @@ void Item_(u32 sourceLine, u32 item) case HOLD_EFFECT_Z_CRYSTAL: SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_Z_MOVE); break; + default: + break; } } From 271ca56bdb7b9f2cc3da298715bcbcc9a76137fe Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sat, 25 Oct 2025 13:42:28 +0100 Subject: [PATCH 098/183] Fixes CanUseLastResort and resolves 3 KNOWN_FAILING Last Resort tests (#8032) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_script_commands.c | 6 ++---- test/battle/move_effect/last_resort.c | 10 +++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 949e0d4df0..2be580e1ee 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9118,17 +9118,15 @@ static void Cmd_useitemonopponent(void) bool32 CanUseLastResort(u8 battler) { - u32 i; u32 knownMovesCount = 0, usedMovesCount = 0; - for (i = 0; i < 4; i++) + for (u32 i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[battler].moves[i] != MOVE_NONE) knownMovesCount++; - if (i != gCurrMovePos && gDisableStructs[battler].usedMoves & (1u << i)) // Increment used move count for all moves except current Last Resort. + if (GetMoveEffect(gBattleMons[battler].moves[i]) != EFFECT_LAST_RESORT && gDisableStructs[battler].usedMoves & (1u << i)) // Increment used move count for all moves except current Last Resort. usedMovesCount++; } - return (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1); } diff --git a/test/battle/move_effect/last_resort.c b/test/battle/move_effect/last_resort.c index 602f4ad2a3..089a723304 100644 --- a/test/battle/move_effect/last_resort.c +++ b/test/battle/move_effect/last_resort.c @@ -117,7 +117,7 @@ SINGLE_BATTLE_TEST("Last Resort works with Sleep Talk") AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 2 moves") { - KNOWN_FAILING; + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_SCRATCH); } @@ -129,10 +129,10 @@ AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 2 moves") AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 3 moves") { - KNOWN_FAILING; + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_QUICK_ATTACK, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { MovesWithPP({MOVE_LAST_RESORT, 5}, {MOVE_QUICK_ATTACK, 1}, {MOVE_SCRATCH, 35}); } } WHEN { TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } @@ -142,10 +142,10 @@ AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 3 moves") AI_SINGLE_BATTLE_TEST("AI uses Last Resort - 4 moves") { - KNOWN_FAILING; + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_LAST_RESORT, MOVE_QUICK_ATTACK, MOVE_SCRATCH, MOVE_GUST); } + OPPONENT(SPECIES_WOBBUFFET) { MovesWithPP({MOVE_LAST_RESORT, 5}, {MOVE_QUICK_ATTACK, 1}, {MOVE_SCRATCH, 1}, {MOVE_GUST, 35}); } } WHEN { TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } TURN { NOT_EXPECT_MOVE(opponent, MOVE_LAST_RESORT); } From 3260d2a42ad9d61b94a352aef9b287de15148bf7 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sun, 26 Oct 2025 10:43:54 +0000 Subject: [PATCH 099/183] Fixed test "Revival Blessing cannot revive a partner's party member" (#8031) Co-authored-by: hedara90 <90hedara@gmail.com> --- test/battle/move_effect/revival_blessing.c | 37 +++++++++++++--------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/test/battle/move_effect/revival_blessing.c b/test/battle/move_effect/revival_blessing.c index f1a0ad74bc..eeb90d202d 100644 --- a/test/battle/move_effect/revival_blessing.c +++ b/test/battle/move_effect/revival_blessing.c @@ -49,29 +49,36 @@ SINGLE_BATTLE_TEST("Revival Blessing fails if no party members are fainted") } } -DOUBLE_BATTLE_TEST("Revival Blessing cannot revive a partner's party member") +// Can only be tested through AI test, else test fails due to trying to force illegal action +AI_MULTI_BATTLE_TEST("Revival Blessing cannot revive a partner's party member") { - KNOWN_FAILING; struct BattlePokemon *user = NULL; - gBattleTypeFlags |= BATTLE_TYPE_TWO_OPPONENTS; - PARAMETRIZE { user = opponentLeft; } - PARAMETRIZE { user = opponentRight; } + u32 move1, move2, move3; + PARAMETRIZE { user = opponentLeft, move1 = MOVE_REVIVAL_BLESSING, move2 = MOVE_CELEBRATE, move3 = MOVE_CELEBRATE; } + PARAMETRIZE { user = playerRight, move1 = MOVE_CELEBRATE, move2 = MOVE_REVIVAL_BLESSING, move3 = MOVE_CELEBRATE; } + PARAMETRIZE { user = opponentRight, move1 = MOVE_CELEBRATE, move2 = MOVE_CELEBRATE, move3 = MOVE_REVIVAL_BLESSING; } GIVEN { - ASSUME((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) != FALSE); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - OPPONENT(SPECIES_WYNAUT) { HP(0); } - OPPONENT(SPECIES_WYNAUT); + MULTI_PLAYER(SPECIES_CLEFABLE); + MULTI_PLAYER(SPECIES_CLEFABLE) { HP(0); } + MULTI_PLAYER(SPECIES_CLEFABLE); + MULTI_PARTNER(SPECIES_CLEFAIRY) { Moves(move2); } + MULTI_PARTNER(SPECIES_CLEFAIRY); + MULTI_PARTNER(SPECIES_CLEFAIRY); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(move1); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(move3); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { HP(0); } + MULTI_OPPONENT_B(SPECIES_WYNAUT); } WHEN { - TURN { MOVE(user, MOVE_REVIVAL_BLESSING, partyIndex:4); } + TURN { EXPECT_MOVE(playerRight, move2); } // EXPECT_MOVE makes battler2 AI-controlled } SCENE { if (user == opponentLeft) { MESSAGE("The opposing Wobbuffet used Revival Blessing!"); MESSAGE("But it failed!"); + } else if (user == playerRight) { + MESSAGE("Clefairy used Revival Blessing!"); + MESSAGE("But it failed!"); } else { MESSAGE("The opposing Wynaut used Revival Blessing!"); MESSAGE("Wynaut was revived and is ready to fight again!"); From 4ed1c3309d4bb99758163b56cb65fcf52cf82d32 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 26 Oct 2025 14:57:34 +0100 Subject: [PATCH 100/183] Decouple (overworld) statuses from ability function (#8002) --- include/battle.h | 10 +- include/battle_util.h | 11 +- src/battle_main.c | 26 +-- src/battle_util.c | 453 ++++++++++++++++++++++-------------------- 4 files changed, 257 insertions(+), 243 deletions(-) diff --git a/include/battle.h b/include/battle.h index 0c4f119f03..2660782d8d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -681,15 +681,13 @@ struct BattleStruct struct LinkBattlerHeader linkBattlerHeader; struct BattleVideo battleVideo; } multiBuffer; - u8 startingStatus:6; // status to apply at battle start. defined in constants/battle.h - u8 startingStatusDone:1; - u8 terrainDone:1; - u8 overworldWeatherDone:1; + u8 startingStatus; // status to apply at battle start. defined in constants/battle.h u8 battlerKOAnimsRunning:3; u8 friskedAbility:1; // If identifies two mons, show the ability pop-up only once. u8 fickleBeamBoosted:1; u8 poisonPuppeteerConfusion:1; u8 toxicChainPriority:1; // If Toxic Chain will trigger on target, all other non volatiles will be blocked + u8 padding1:1; u16 startingStatusTimer; u8 atkCancellerTracker; struct BattleTvMovePoints tvMovePoints; @@ -772,14 +770,14 @@ struct BattleStruct u8 printedStrongWindsWeakenedAttack:1; u8 numSpreadTargets:2; u8 noTargetPresent:1; - u8 padding1:1; + u8 padding2:1; struct MessageStatus slideMessageStatus; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; u8 hazardsQueue[NUM_BATTLE_SIDES][HAZARDS_MAX_COUNT]; u8 numHazards[NUM_BATTLE_SIDES]; u8 hazardsCounter:4; // Counter for applying hazard on switch in enum SubmoveState submoveAnnouncement:2; - u8 padding2:2; + u8 padding3:2; u16 flingItem; u8 incrementEchoedVoice:1; u8 echoedVoiceCounter:3; diff --git a/include/battle_util.h b/include/battle_util.h index 39ccea4797..1c56aca9c2 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -40,6 +40,13 @@ enum MoveAbsorbed MOVE_ABSORBED_BY_BOOST_FLASH_FIRE, }; +enum FieldEffectCases +{ + FIELD_EFFECT_TRAINER_STATUSES, + FIELD_EFFECT_OVERWORLD_TERRAIN, + FIELD_EFFECT_OVERWORLD_WEATHER, +}; + enum AbilityEffect { ABILITYEFFECT_ON_SWITCHIN, @@ -55,11 +62,8 @@ enum AbilityEffect ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, ABILITYEFFECT_ON_WEATHER, ABILITYEFFECT_ON_TERRAIN, - ABILITYEFFECT_SWITCH_IN_TERRAIN, - ABILITYEFFECT_SWITCH_IN_WEATHER, ABILITYEFFECT_OPPORTUNIST, ABILITYEFFECT_OPPORTUNIST_FIRST_TURN, - ABILITYEFFECT_SWITCH_IN_STATUSES, ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES, }; @@ -256,6 +260,7 @@ bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability); bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag); bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, u32 moveType, enum FunctionCallOption option); +bool32 TryFieldEffects(enum FieldEffectCases caseId); u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); diff --git a/src/battle_main.c b/src/battle_main.c index 7f5179d969..faf7829bdf 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3732,7 +3732,6 @@ static void DoBattleIntro(void) { gBattleStruct->eventsBeforeFirstTurnState = 0; gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->overworldWeatherDone = FALSE; Ai_InitPartyStruct(); // Save mons party counts, and first 2/4 mons on the battlefield. // mark all battlers as sent out @@ -3822,32 +3821,19 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->eventsBeforeFirstTurnState++; break; case FIRST_TURN_EVENTS_OVERWORLD_WEATHER: - if (!gBattleStruct->overworldWeatherDone - && AbilityBattleEffects(ABILITYEFFECT_SWITCH_IN_WEATHER, 0, 0, ABILITYEFFECT_SWITCH_IN_WEATHER, 0) != 0) - { - gBattleStruct->overworldWeatherDone = TRUE; - return; - } gBattleStruct->eventsBeforeFirstTurnState++; + if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_WEATHER)) + return; break; case FIRST_TURN_EVENTS_TERRAIN: - if (!gBattleStruct->terrainDone - && AbilityBattleEffects(ABILITYEFFECT_SWITCH_IN_TERRAIN, 0, 0, ABILITYEFFECT_SWITCH_IN_TERRAIN, 0) != 0) - { - gBattleStruct->terrainDone = TRUE; - return; - } gBattleStruct->eventsBeforeFirstTurnState++; + if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_TERRAIN)) + return; break; case FIRST_TURN_EVENTS_STARTING_STATUS: - if (!gBattleStruct->startingStatusDone - && gBattleStruct->startingStatus - && AbilityBattleEffects(ABILITYEFFECT_SWITCH_IN_STATUSES, 0, 0, ABILITYEFFECT_SWITCH_IN_STATUSES, 0) != 0) - { - gBattleStruct->startingStatusDone = TRUE; - return; - } gBattleStruct->eventsBeforeFirstTurnState++; + if (TryFieldEffects(FIELD_EFFECT_TRAINER_STATUSES)) + return; break; case FIRST_TURN_EVENTS_TOTEM_BOOST: for (i = 0; i < gBattlersCount; i++) diff --git a/src/battle_util.c b/src/battle_util.c index 79cc2b40da..72be8c97fe 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3588,7 +3588,7 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability ability return effect; } -static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer) +static inline bool32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer) { if (!(gFieldStatuses & flag)) { @@ -3600,13 +3600,13 @@ static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *t else *timer = 0; // Infinite - return 1; + return TRUE; } - return 0; + return FALSE; } -static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u16 *timer) +static inline bool32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u16 *timer) { if (!(gSideStatuses[side] & flag)) { @@ -3619,10 +3619,243 @@ static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 ani else *timer = 0; // Infinite - return 1; + return TRUE; } - return 0; + return FALSE; +} + +bool32 TryFieldEffects(enum FieldEffectCases caseId) +{ + bool32 effect = FALSE; + bool32 isTerrain = FALSE; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + return FALSE; + + switch (caseId) + { + case FIELD_EFFECT_TRAINER_STATUSES: // starting field/side/etc statuses with a variable + switch ((enum StartingStatus) gBattleStruct->startingStatus) + { + case STARTING_STATUS_NONE: + break; + case STARTING_STATUS_ELECTRIC_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_ELECTRIC_TERRAIN, + B_MSG_TERRAIN_SET_ELECTRIC, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_MISTY_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_MISTY_TERRAIN, + B_MSG_TERRAIN_SET_MISTY, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_GRASSY_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_GRASSY_TERRAIN, + B_MSG_TERRAIN_SET_GRASSY, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_PSYCHIC_TERRAIN: + effect = SetStartingFieldStatus( + STATUS_FIELD_PSYCHIC_TERRAIN, + B_MSG_TERRAIN_SET_PSYCHIC, + 0, + &gFieldTimers.terrainTimer); + isTerrain = TRUE; + break; + case STARTING_STATUS_TRICK_ROOM: + effect = SetStartingFieldStatus( + STATUS_FIELD_TRICK_ROOM, + B_MSG_SET_TRICK_ROOM, + B_ANIM_TRICK_ROOM, + &gFieldTimers.trickRoomTimer); + break; + case STARTING_STATUS_MAGIC_ROOM: + effect = SetStartingFieldStatus( + STATUS_FIELD_MAGIC_ROOM, + B_MSG_SET_MAGIC_ROOM, + B_ANIM_MAGIC_ROOM, + &gFieldTimers.magicRoomTimer); + break; + case STARTING_STATUS_WONDER_ROOM: + effect = SetStartingFieldStatus( + STATUS_FIELD_WONDER_ROOM, + B_MSG_SET_WONDER_ROOM, + B_ANIM_WONDER_ROOM, + &gFieldTimers.wonderRoomTimer); + break; + case STARTING_STATUS_TAILWIND_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_TAILWIND, + B_SIDE_PLAYER, + B_MSG_SET_TAILWIND, + B_ANIM_TAILWIND, + &gSideTimers[B_SIDE_PLAYER].tailwindTimer); + break; + case STARTING_STATUS_TAILWIND_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_TAILWIND, + B_SIDE_OPPONENT, + B_MSG_SET_TAILWIND, + B_ANIM_TAILWIND, + &gSideTimers[B_SIDE_OPPONENT].tailwindTimer); + break; + case STARTING_STATUS_RAINBOW_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_RAINBOW, + B_SIDE_PLAYER, + B_MSG_SET_RAINBOW, + B_ANIM_RAINBOW, + &gSideTimers[B_SIDE_PLAYER].rainbowTimer); + break; + case STARTING_STATUS_RAINBOW_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_RAINBOW, + B_SIDE_OPPONENT, + B_MSG_SET_RAINBOW, + B_ANIM_RAINBOW, + &gSideTimers[B_SIDE_OPPONENT].rainbowTimer); + break; + case STARTING_STATUS_SEA_OF_FIRE_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_SEA_OF_FIRE, + B_SIDE_PLAYER, + B_MSG_SET_SEA_OF_FIRE, + B_ANIM_SEA_OF_FIRE, + &gSideTimers[B_SIDE_PLAYER].seaOfFireTimer); + break; + case STARTING_STATUS_SEA_OF_FIRE_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_SEA_OF_FIRE, + B_SIDE_OPPONENT, + B_MSG_SET_SEA_OF_FIRE, + B_ANIM_SEA_OF_FIRE, + &gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer); + break; + case STARTING_STATUS_SWAMP_PLAYER: + effect = SetStartingSideStatus( + SIDE_STATUS_SWAMP, + B_SIDE_PLAYER, + B_MSG_SET_SWAMP, + B_ANIM_SWAMP, + &gSideTimers[B_SIDE_PLAYER].swampTimer); + break; + case STARTING_STATUS_SWAMP_OPPONENT: + effect = SetStartingSideStatus( + SIDE_STATUS_SWAMP, + B_SIDE_OPPONENT, + B_MSG_SET_SWAMP, + B_ANIM_SWAMP, + &gSideTimers[B_SIDE_OPPONENT].swampTimer); + break; + } + if (effect) + { + if (isTerrain) + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + else + BattleScriptPushCursorAndCallback(BattleScript_OverworldStatusStarts); + } + break; + case FIELD_EFFECT_OVERWORLD_TERRAIN: // terrain starting from overworld weather + if (B_THUNDERSTORM_TERRAIN == TRUE + && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + && GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM) + { + // overworld weather started rain, so just do electric terrain anim + gFieldStatuses = STATUS_FIELD_ELECTRIC_TERRAIN; + gFieldTimers.terrainTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + effect = TRUE; + } + else if (B_OVERWORLD_FOG >= GEN_8 + && (GetCurrentWeather() == WEATHER_FOG_HORIZONTAL || GetCurrentWeather() == WEATHER_FOG_DIAGONAL) + && !(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) + { + gFieldStatuses = STATUS_FIELD_MISTY_TERRAIN; + gFieldTimers.terrainTimer = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + effect = TRUE; + } + break; + case FIELD_EFFECT_OVERWORLD_WEATHER: + if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) + { + switch (GetCurrentWeather()) + { + case WEATHER_RAIN: + case WEATHER_RAIN_THUNDERSTORM: + case WEATHER_DOWNPOUR: + if (!(gBattleWeather & B_WEATHER_RAIN)) + { + gBattleWeather = B_WEATHER_RAIN_NORMAL; + gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; + effect = TRUE; + } + break; + case WEATHER_SANDSTORM: + if (!(gBattleWeather & B_WEATHER_SANDSTORM)) + { + gBattleWeather = B_WEATHER_SANDSTORM; + gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; + effect = TRUE; + } + break; + case WEATHER_DROUGHT: + if (!(gBattleWeather & B_WEATHER_SUN)) + { + gBattleWeather = B_WEATHER_SUN_NORMAL; + gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; + effect = TRUE; + } + break; + case WEATHER_SNOW: + if (!(gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + { + if (B_OVERWORLD_SNOW >= GEN_9) + { + gBattleWeather = B_WEATHER_SNOW; + gBattleScripting.animArg1 = B_ANIM_SNOW_CONTINUES; + } + else + { + gBattleWeather = B_WEATHER_HAIL; + gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; + } + effect = TRUE; + } + break; + case WEATHER_FOG_DIAGONAL: + case WEATHER_FOG_HORIZONTAL: + if (B_OVERWORLD_FOG == GEN_4 && !(gBattleWeather & B_WEATHER_FOG)) + { + gBattleWeather = B_WEATHER_FOG; + gBattleScripting.animArg1 = B_ANIM_FOG_CONTINUES; + effect = TRUE; + } + break; + } + } + if (effect) + { + gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); + BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); + } + break; + } + + return effect; } u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) @@ -3655,215 +3888,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab switch (caseID) { - case ABILITYEFFECT_SWITCH_IN_STATUSES: // starting field/side/etc statuses with a variable - { - gBattleScripting.battler = battler; - switch (gBattleStruct->startingStatus) - { - case STARTING_STATUS_ELECTRIC_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_ELECTRIC_TERRAIN, - B_MSG_TERRAIN_SET_ELECTRIC, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_MISTY_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_MISTY_TERRAIN, - B_MSG_TERRAIN_SET_MISTY, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_GRASSY_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_GRASSY_TERRAIN, - B_MSG_TERRAIN_SET_GRASSY, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_PSYCHIC_TERRAIN: - effect = SetStartingFieldStatus(STATUS_FIELD_PSYCHIC_TERRAIN, - B_MSG_TERRAIN_SET_PSYCHIC, - 0, - &gFieldTimers.terrainTimer); - effect = (effect == 1) ? 2 : 0; - break; - case STARTING_STATUS_TRICK_ROOM: - effect = SetStartingFieldStatus(STATUS_FIELD_TRICK_ROOM, - B_MSG_SET_TRICK_ROOM, - B_ANIM_TRICK_ROOM, - &gFieldTimers.trickRoomTimer); - break; - case STARTING_STATUS_MAGIC_ROOM: - effect = SetStartingFieldStatus(STATUS_FIELD_MAGIC_ROOM, - B_MSG_SET_MAGIC_ROOM, - B_ANIM_MAGIC_ROOM, - &gFieldTimers.magicRoomTimer); - break; - case STARTING_STATUS_WONDER_ROOM: - effect = SetStartingFieldStatus(STATUS_FIELD_WONDER_ROOM, - B_MSG_SET_WONDER_ROOM, - B_ANIM_WONDER_ROOM, - &gFieldTimers.wonderRoomTimer); - break; - case STARTING_STATUS_TAILWIND_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND, - B_SIDE_PLAYER, - B_MSG_SET_TAILWIND, - B_ANIM_TAILWIND, - &gSideTimers[B_SIDE_PLAYER].tailwindTimer); - break; - case STARTING_STATUS_TAILWIND_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND, - B_SIDE_OPPONENT, - B_MSG_SET_TAILWIND, - B_ANIM_TAILWIND, - &gSideTimers[B_SIDE_OPPONENT].tailwindTimer); - break; - case STARTING_STATUS_RAINBOW_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW, - B_SIDE_PLAYER, - B_MSG_SET_RAINBOW, - B_ANIM_RAINBOW, - &gSideTimers[B_SIDE_PLAYER].rainbowTimer); - break; - case STARTING_STATUS_RAINBOW_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW, - B_SIDE_OPPONENT, - B_MSG_SET_RAINBOW, - B_ANIM_RAINBOW, - &gSideTimers[B_SIDE_OPPONENT].rainbowTimer); - break; - case STARTING_STATUS_SEA_OF_FIRE_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE, - B_SIDE_PLAYER, - B_MSG_SET_SEA_OF_FIRE, - B_ANIM_SEA_OF_FIRE, - &gSideTimers[B_SIDE_PLAYER].seaOfFireTimer); - break; - case STARTING_STATUS_SEA_OF_FIRE_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE, - B_SIDE_OPPONENT, - B_MSG_SET_SEA_OF_FIRE, - B_ANIM_SEA_OF_FIRE, - &gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer); - break; - case STARTING_STATUS_SWAMP_PLAYER: - effect = SetStartingSideStatus(SIDE_STATUS_SWAMP, - B_SIDE_PLAYER, - B_MSG_SET_SWAMP, - B_ANIM_SWAMP, - &gSideTimers[B_SIDE_PLAYER].swampTimer); - break; - case STARTING_STATUS_SWAMP_OPPONENT: - effect = SetStartingSideStatus(SIDE_STATUS_SWAMP, - B_SIDE_OPPONENT, - B_MSG_SET_SWAMP, - B_ANIM_SWAMP, - &gSideTimers[B_SIDE_OPPONENT].swampTimer); - break; - } - - if (effect == 1) - BattleScriptPushCursorAndCallback(BattleScript_OverworldStatusStarts); - else if (effect == 2) - BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); - } - break; - case ABILITYEFFECT_SWITCH_IN_TERRAIN: // terrain starting from overworld weather - if (B_THUNDERSTORM_TERRAIN == TRUE - && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) - && GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM) - { - // overworld weather started rain, so just do electric terrain anim - gFieldStatuses = STATUS_FIELD_ELECTRIC_TERRAIN; - gFieldTimers.terrainTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC; - BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); - effect++; - } - else if (B_OVERWORLD_FOG >= GEN_8 - && (GetCurrentWeather() == WEATHER_FOG_HORIZONTAL || GetCurrentWeather() == WEATHER_FOG_DIAGONAL) - && !(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) - { - gFieldStatuses = STATUS_FIELD_MISTY_TERRAIN; - gFieldTimers.terrainTimer = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY; - BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); - effect++; - } - break; - case ABILITYEFFECT_SWITCH_IN_WEATHER: - gBattleScripting.battler = battler; - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - { - switch (GetCurrentWeather()) - { - case WEATHER_RAIN: - case WEATHER_RAIN_THUNDERSTORM: - case WEATHER_DOWNPOUR: - if (!(gBattleWeather & B_WEATHER_RAIN)) - { - gBattleWeather = B_WEATHER_RAIN_NORMAL; - gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES; - effect++; - } - break; - case WEATHER_SANDSTORM: - if (!(gBattleWeather & B_WEATHER_SANDSTORM)) - { - gBattleWeather = B_WEATHER_SANDSTORM; - gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - effect++; - } - break; - case WEATHER_DROUGHT: - if (!(gBattleWeather & B_WEATHER_SUN)) - { - gBattleWeather = B_WEATHER_SUN_NORMAL; - gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES; - effect++; - } - break; - case WEATHER_SNOW: - if (!(gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) - { - if (B_OVERWORLD_SNOW >= GEN_9) - { - gBattleWeather = B_WEATHER_SNOW; - gBattleScripting.animArg1 = B_ANIM_SNOW_CONTINUES; - } - else - { - gBattleWeather = B_WEATHER_HAIL; - gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; - } - effect++; - } - break; - case WEATHER_FOG_DIAGONAL: - case WEATHER_FOG_HORIZONTAL: - if (B_OVERWORLD_FOG == GEN_4) - { - if (!(gBattleWeather & B_WEATHER_FOG)) - { - gBattleWeather = B_WEATHER_FOG; - gBattleScripting.animArg1 = B_ANIM_FOG_CONTINUES; - effect++; - } - break; - } - } - } - if (effect != 0) - { - gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather(); - BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts); - } - break; case ABILITYEFFECT_ON_SWITCHIN: - if (gHoldEffectsInfo[HOLD_EFFECT_MIRROR_HERB].onSwitchIn) - break; gBattleScripting.battler = battler; switch (gLastUsedAbility) { From e8ad3c20f7e5c8604418009cba37c35f5a67548b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 26 Oct 2025 15:48:59 +0100 Subject: [PATCH 101/183] Fixes compilation error due to #8002 (#8050) --- include/battle.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index 2660782d8d..fce5236b38 100644 --- a/include/battle.h +++ b/include/battle.h @@ -781,7 +781,7 @@ struct BattleStruct u16 flingItem; u8 incrementEchoedVoice:1; u8 echoedVoiceCounter:3; - u8 padding3:4; + u8 padding4:4; }; struct AiBattleData From 782c559a20e873ee0926eca3328ea23d28645c6b Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 26 Oct 2025 21:41:16 +0000 Subject: [PATCH 102/183] Fixes Ruin field statuses negation conditions + upcoming cleanup (#8042) --- data/battle_scripts_1.s | 4 +- include/battle_scripts.h | 4 +- src/battle_ai_main.c | 4 +- src/battle_ai_util.c | 3 +- src/battle_hold_effects.c | 12 +-- src/battle_script_commands.c | 22 +++--- src/battle_util.c | 12 ++- test/battle/ability/beads_of_ruin.c | 116 +++++++++++++++++++++++++++- test/battle/ability/sword_of_ruin.c | 115 +++++++++++++++++++++++++++ 9 files changed, 265 insertions(+), 27 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 25624a8ecd..f7edad9db4 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7723,7 +7723,7 @@ BattleScript_ItemHealHP_End2:: call BattleScript_ItemHealHP_Ret end2 -BattleScript_AirBaloonMsgIn:: +BattleScript_AirBalloonMsgIn:: printstring STRINGID_AIRBALLOONFLOAT waitmessage B_WAIT_TIME_LONG end3 @@ -7733,7 +7733,7 @@ BattleScript_AirBalloonMsgInRet:: waitmessage B_WAIT_TIME_LONG return -BattleScript_AirBaloonMsgPop:: +BattleScript_AirBalloonMsgPop:: printstring STRINGID_AIRBALLOONPOP waitmessage B_WAIT_TIME_LONG removeitem BS_TARGET diff --git a/include/battle_scripts.h b/include/battle_scripts.h index d64d9812aa..1031f1dcbf 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -345,9 +345,9 @@ extern const u8 BattleScript_WeaknessPolicy[]; extern const u8 BattleScript_TargetItemStatRaise[]; extern const u8 BattleScript_RockyHelmetActivates[]; extern const u8 BattleScript_ItemHurtEnd2[]; -extern const u8 BattleScript_AirBaloonMsgIn[]; +extern const u8 BattleScript_AirBalloonMsgIn[]; extern const u8 BattleScript_AirBalloonMsgInRet[]; -extern const u8 BattleScript_AirBaloonMsgPop[]; +extern const u8 BattleScript_AirBalloonMsgPop[]; extern const u8 BattleScript_ItemHurtRet[]; extern const u8 BattleScript_ToxicOrb[]; extern const u8 BattleScript_FlameOrb[]; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 80f2f46abc..94b4a10a51 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -279,7 +279,7 @@ void BattleAI_SetupFlags(void) } else // Assign ai flags for player for prediction { - u64 aiFlags = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA, B_POSITION_OPPONENT_LEFT) + u64 aiFlags = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA, B_POSITION_OPPONENT_LEFT) | GetAiFlags(TRAINER_BATTLE_PARAM.opponentB, B_POSITION_OPPONENT_RIGHT); gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = aiFlags; gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = aiFlags; @@ -2277,7 +2277,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case PROTECT_WIDE_GUARD: - if(!(GetBattlerMoveTargetType(battlerAtk, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH))) + if (!(GetBattlerMoveTargetType(battlerAtk, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH))) { ADJUST_SCORE(-10); decreased = TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 6049a13842..bab5d76706 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -5308,7 +5308,8 @@ void DecideTerastal(u32 battler) #define takenWithTera altCalcs->takenWithTera #define takenWithoutTera gAiLogicData->simulatedDmg[opposingBattler][battler] -enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, struct AltTeraCalcs *altCalcs) { +enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, struct AltTeraCalcs *altCalcs) +{ struct Pokemon* party = GetBattlerParty(battler); // Check how many pokemon we have that could tera diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c index 4f4d65b056..7dacc04223 100644 --- a/src/battle_hold_effects.c +++ b/src/battle_hold_effects.c @@ -231,7 +231,7 @@ static enum ItemEffect TryKingsRock(u32 battlerAtk, u32 battlerDef, u32 item) return effect; } -static enum ItemEffect TryAirBallon(u32 battler, ActivationTiming timing) +static enum ItemEffect TryAirBalloon(u32 battler, ActivationTiming timing) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -239,7 +239,7 @@ static enum ItemEffect TryAirBallon(u32 battler, ActivationTiming timing) { if (IsBattlerTurnDamaged(battler)) { - BattleScriptCall(BattleScript_AirBaloonMsgPop); + BattleScriptCall(BattleScript_AirBalloonMsgPop); effect = ITEM_EFFECT_OTHER; } } @@ -247,7 +247,7 @@ static enum ItemEffect TryAirBallon(u32 battler, ActivationTiming timing) { gSpecialStatuses[battler].switchInItemDone = TRUE; if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptPushCursorAndCallback(BattleScript_AirBaloonMsgIn); + BattleScriptPushCursorAndCallback(BattleScript_AirBalloonMsgIn); else BattleScriptCall(BattleScript_AirBalloonMsgInRet); RecordItemEffectBattle(battler, HOLD_EFFECT_AIR_BALLOON); @@ -497,7 +497,7 @@ static enum ItemEffect TryMentalHerb(u32 battler) return effect; } -static enum ItemEffect TryThroatSray(u32 battlerAtk) +static enum ItemEffect TryThroatSpray(u32 battlerAtk) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -1110,7 +1110,7 @@ enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect effect = TryKingsRock(itemBattler, battler, item); break; case HOLD_EFFECT_AIR_BALLOON: - effect = TryAirBallon(itemBattler, timing); + effect = TryAirBalloon(itemBattler, timing); break; case HOLD_EFFECT_ROCKY_HELMET: effect = TryRockyHelmet(itemBattler, battler); @@ -1146,7 +1146,7 @@ enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect effect = TryMentalHerb(itemBattler); break; case HOLD_EFFECT_THROAT_SPRAY: - effect = TryThroatSray(itemBattler); + effect = TryThroatSpray(itemBattler); break; case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move effect = DamagedStatBoostBerryEffect(itemBattler, battler, STAT_DEF, DAMAGE_CATEGORY_PHYSICAL); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 62604d43f5..80e0139f4a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6124,7 +6124,7 @@ static void Cmd_moveend(void) if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, 0, 0, 0)) effect = TRUE; } - if(!effect) + if (!effect) gBattleScripting.moveendState++; break; case MOVEEND_SYNCHRONIZE_ATTACKER: // attacker synchronize @@ -9129,16 +9129,18 @@ static void Cmd_useitemonopponent(void) bool32 CanUseLastResort(u8 battler) { - u32 knownMovesCount = 0, usedMovesCount = 0; - - for (u32 i = 0; i < MAX_MON_MOVES; i++) + u32 moveIndex; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gBattleMons[battler].moves[i] != MOVE_NONE) - knownMovesCount++; - if (GetMoveEffect(gBattleMons[battler].moves[i]) != EFFECT_LAST_RESORT && gDisableStructs[battler].usedMoves & (1u << i)) // Increment used move count for all moves except current Last Resort. - usedMovesCount++; + u32 move = gBattleMons[battler].moves[moveIndex]; + // Assumes that an empty slot cannot have a non-empty slot after it + if (move == MOVE_NONE) + break; + // If not Last Resort and has not been used, can't use Last Resort + if (GetMoveEffect(move) != EFFECT_LAST_RESORT && !(gDisableStructs[battler].usedMoves & (1u << moveIndex))) + return FALSE; } - return (knownMovesCount >= 2 && usedMovesCount >= knownMovesCount - 1); + return moveIndex >= 2; // At least two usable moves that are either Last Resort or have been used } static void RemoveAllWeather(void) @@ -17075,7 +17077,7 @@ void BS_TryActivateReceiver(void) u32 partnerAbility = GetBattlerAbility(gBattlerAbility); if (IsBattlerAlive(gBattlerAbility) && (partnerAbility == ABILITY_RECEIVER || partnerAbility == ABILITY_POWER_OF_ALCHEMY) - && GetBattlerHoldEffect(battler) != HOLD_EFFECT_ABILITY_SHIELD + && GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD && !gAbilitiesInfo[gBattleMons[battler].ability].cantBeCopied) { gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[battler].ability; // re-using the variable for trace diff --git a/src/battle_util.c b/src/battle_util.c index 72be8c97fe..c7c6f49e58 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7421,11 +7421,17 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) static bool32 IsRuinStatusActive(u32 fieldEffect) { - if (IsNeutralizingGasOnField()) // Neutralizing Gas still blocks Ruin field statuses - return FALSE; - + bool32 isNeutralizingGasOnField = IsNeutralizingGasOnField(); for (u32 battler = 0; battler < gBattlersCount; battler++) { + // Mold Breaker doesn't ignore Ruin field status but Gastro Acid and Neutralizing Gas do + if (gBattleMons[battler].volatiles.gastroAcid) + continue; + if (GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD + && isNeutralizingGasOnField + && gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS) + continue; + if (GetBattlerVolatile(battler, fieldEffect)) return TRUE; } diff --git a/test/battle/ability/beads_of_ruin.c b/test/battle/ability/beads_of_ruin.c index 37240d2d68..86172459ab 100644 --- a/test/battle/ability/beads_of_ruin.c +++ b/test/battle/ability/beads_of_ruin.c @@ -4,6 +4,7 @@ ASSUMPTIONS { ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveEffect(MOVE_ROLE_PLAY) == EFFECT_ROLE_PLAY); } @@ -74,4 +75,117 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler } } -TO_DO_BATTLE_TEST("Beads of Ruin reduce Defense if Wonder Room is active"); +DOUBLE_BATTLE_TEST("Beads of Ruin increases damage taken by physical moves in Wonder Room", s16 damage) +{ + bool32 useWonderRoom; + u32 move; + + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_ROUND; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_ROUND; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveEffect(MOVE_ROUND) != EFFECT_PSYSHOCK); + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useWonderRoom) + TURN { MOVE(opponentLeft, MOVE_WONDER_ROOM); MOVE(playerRight, move, target: opponentLeft); } + else + TURN { MOVE(playerRight, move, target: opponentLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!"); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_GT(results[2].damage, results[0].damage); // In Wonder Room, physical move deals more damage + EXPECT_LT(results[3].damage, results[1].damage); // In Wonder Room, special move deals less damage + } +} + +SINGLE_BATTLE_TEST("Beads of Ruin doesn't activate when dragged out by Mold Breaker attacker") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_TAIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent); + if (ability == ABILITY_MOLD_BREAKER) + { + NONE_OF { + ABILITY_POPUP(player, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!"); + } + } + else + { + ABILITY_POPUP(player, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!"); + } + } +} + +DOUBLE_BATTLE_TEST("Beads of Ruin's Sp. Def reduction is not ignored by Mold Breaker", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ROUND, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Beads of Ruin's Sp. Def reduction is ignored by Gastro Acid", s16 damage) +{ + u32 move; + + PARAMETRIZE { move = MOVE_GASTRO_ACID; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + PLAYER(SPECIES_CHI_YU) { Ability(ABILITY_BEADS_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, move, target: playerLeft); MOVE(opponentLeft, MOVE_ROUND, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_BEADS_OF_RUIN); + MESSAGE("Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding Pokémon!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_LT(results[0].damage, results[1].damage); + } +} diff --git a/test/battle/ability/sword_of_ruin.c b/test/battle/ability/sword_of_ruin.c index 395cd3fd68..a891f7d5a7 100644 --- a/test/battle/ability/sword_of_ruin.c +++ b/test/battle/ability/sword_of_ruin.c @@ -73,3 +73,118 @@ SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battler MESSAGE("The opposing Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!"); } } + +DOUBLE_BATTLE_TEST("Sword of Ruin increases damage taken by special moves in Wonder Room", s16 damage) +{ + bool32 useWonderRoom; + u32 move; + + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_ROUND; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_SCRATCH; } + PARAMETRIZE { useWonderRoom = TRUE; move = MOVE_ROUND; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMoveEffect(MOVE_ROUND) != EFFECT_PSYSHOCK); + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (useWonderRoom) + TURN { MOVE(opponentLeft, MOVE_WONDER_ROOM); MOVE(playerRight, move, target: opponentLeft); } + else + TURN { MOVE(playerRight, move, target: opponentLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!"); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_LT(results[2].damage, results[0].damage); // In Wonder Room, physical move deals less damage + EXPECT_GT(results[3].damage, results[1].damage); // In Wonder Room, special move deals more damage + } +} + +SINGLE_BATTLE_TEST("Sword of Ruin doesn't activate when dragged out by Mold Breaker attacker") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_DRAGON_TAIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent); + if (ability == ABILITY_MOLD_BREAKER) + { + NONE_OF { + ABILITY_POPUP(player, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!"); + } + } + else + { + ABILITY_POPUP(player, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!"); + } + } +} + +DOUBLE_BATTLE_TEST("Sword of Ruin's Defense reduction is not ignored by Mold Breaker", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + PARAMETRIZE { ability = ABILITY_SAND_RUSH; } + + GIVEN { + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_EXCADRILL) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Sword of Ruin's Defense reduction is ignored by Gastro Acid", s16 damage) +{ + u32 move; + + PARAMETRIZE { move = MOVE_GASTRO_ACID; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + PLAYER(SPECIES_CHIEN_PAO) { Ability(ABILITY_SWORD_OF_RUIN); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentRight, move, target: playerLeft); MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_SWORD_OF_RUIN); + MESSAGE("Chien-Pao's Sword of Ruin weakened the Defense of all surrounding Pokémon!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_LT(results[0].damage, results[1].damage); + } +} From a32da780c4fefd57c21203ea0397c8fe54f7e0f7 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:24:33 +0000 Subject: [PATCH 103/183] Corrects ONE_VS_TWO_BATTLE_TEST to use BATTLE_TEST_ARGS_ONE_VS_TWO (#8061) --- include/test/battle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/test/battle.h b/include/test/battle.h index 4e779f0f0f..2ea4c9a344 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -918,8 +918,8 @@ extern struct BattleTestRunnerState *const gBattleTestRunnerState; #define TWO_VS_ONE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_TWO_VS_ONE, __VA_ARGS__) #define AI_TWO_VS_ONE_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_AI_TWO_VS_ONE, __VA_ARGS__) -#define ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_ONE_VS_TWO, __VA_ARGS__) -#define AI_ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_TWO_VS_ONE(_name, BATTLE_TEST_AI_ONE_VS_TWO, __VA_ARGS__) +#define ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_ONE_VS_TWO(_name, BATTLE_TEST_ONE_VS_TWO, __VA_ARGS__) +#define AI_ONE_VS_TWO_BATTLE_TEST(_name, ...) BATTLE_TEST_ARGS_ONE_VS_TWO(_name, BATTLE_TEST_AI_ONE_VS_TWO, __VA_ARGS__) /* Parametrize */ From 6ddabde582bae0e678ff5d6696664ca5a5a01612 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Mon, 27 Oct 2025 11:41:07 -0500 Subject: [PATCH 104/183] New Feature: ORAS Dowsing (#7211) --- asm/macros/event.inc | 5 + data/field_effect_scripts.s | 6 + data/scripts/obtain_item.inc | 2 + .../field_effects/palettes/oras_dowsing.pal | 19 + .../pics/oras_dowsing_brendan.png | Bin 0 -> 313 bytes .../field_effects/pics/oras_dowsing_may.png | Bin 0 -> 345 bytes include/config/item.h | 11 + include/constants/field_effects.h | 4 + include/item_use.h | 2 + include/oras_dowse.h | 39 ++ spritesheet_rules.mk | 6 + src/bike.c | 2 + .../field_effect_object_template_pointers.h | 4 + src/field_effect.c | 6 + src/field_effect_helpers.c | 1 - src/field_player_avatar.c | 27 +- src/field_screen_effect.c | 3 + src/item_use.c | 32 +- src/oras_dowse.c | 562 ++++++++++++++++++ src/overworld.c | 2 + 20 files changed, 721 insertions(+), 12 deletions(-) create mode 100644 graphics/field_effects/palettes/oras_dowsing.pal create mode 100644 graphics/field_effects/pics/oras_dowsing_brendan.png create mode 100644 graphics/field_effects/pics/oras_dowsing_may.png create mode 100644 include/oras_dowse.h create mode 100644 src/oras_dowse.c diff --git a/asm/macros/event.inc b/asm/macros/event.inc index b15bf8deb3..e081819217 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2313,6 +2313,11 @@ callnative ScriptSetDoubleBattleFlag, requests_effects=1 .endm + @ Stop using the ORAS dowsing machine. + .macro stoporasdowsing + callnative EndORASDowsing + .endm + @ ============================ @ @ FAKE RTC MACROS @ Will only function if OW_USE_FAKE_RTC is true. If it has any additional requirements, it will be listed accordingly. diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 34678bb293..ce71a102fd 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -83,6 +83,7 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG .4byte gFieldEffectScript_UseRockClimb @ FLDEFF_USE_ROCK_CLIMB .4byte gFieldEffectScript_RockClimbDust @ FLDEFF_ROCK_CLIMB_DUST + .4byte gFieldEffectScript_ORASDowse @ FLDEFF_ORAS_DOWSE gFieldEffectScript_ExclamationMarkIcon1:: field_eff_callnative FldEff_ExclamationMarkIcon @@ -386,6 +387,7 @@ gFieldEffectScript_CaveDust:: gFieldEffectScript_Defog:: field_eff_callnative FldEff_Defog field_eff_end + gFieldEffectScript_UseRockClimb:: @ 82DBC3F field_eff_callnative FldEff_UseRockClimb field_eff_end @@ -394,3 +396,7 @@ gFieldEffectScript_RockClimbDust:: @ 82DBB28 field_eff_loadfadedpal_callnative gSpritePalette_BigDust, FldEff_RockClimbDust field_eff_end +gFieldEffectScript_ORASDowse:: + field_eff_callnative FldEff_ORASDowsing + field_eff_end + diff --git a/data/scripts/obtain_item.inc b/data/scripts/obtain_item.inc index 599961c821..3eb7f4f0d4 100644 --- a/data/scripts/obtain_item.inc +++ b/data/scripts/obtain_item.inc @@ -205,6 +205,7 @@ EventScript_FoundHiddenItem:: end EventScript_PutHiddenItemInPocket:: + callnative Script_ClearDowsingColor delay 10 showitemdescription waitmessage @@ -215,6 +216,7 @@ EventScript_PutHiddenItemInPocket:: hideitemdescription special TryPutTreasureInvestigatorsOnAir special SetHiddenItemFlag + callnative Script_UpdateDowseState releaseall end diff --git a/graphics/field_effects/palettes/oras_dowsing.pal b/graphics/field_effects/palettes/oras_dowsing.pal new file mode 100644 index 0000000000..d3446e3971 --- /dev/null +++ b/graphics/field_effects/palettes/oras_dowsing.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +0 0 0 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 255 255 +255 0 255 diff --git a/graphics/field_effects/pics/oras_dowsing_brendan.png b/graphics/field_effects/pics/oras_dowsing_brendan.png new file mode 100644 index 0000000000000000000000000000000000000000..fd8351981984df9831e07206613f99e10d3b7e8f GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^6M$HOgBeJk3S#^Zq!^2X+?^QKos)S9@nOClWCH|8ecP1yI9wPZ!6Kh}O43j(mp=IGSq}{{Me_Y?od_kjs)dt(#q|5^}^< z1r<4(A{?$>TiYnL>hojH<4b;-=D0GSnz-_}-Mi?DXE*%WvM(Cuw6aV|cDVYVN956( z4`(*c@8RPt-DQ+r`SX4IWWg8SZ=P#&tN&7eq#YRWV5#;p=Z4qM9ef|tmboFyt=akR{03-C6;s5{u literal 0 HcmV?d00001 diff --git a/graphics/field_effects/pics/oras_dowsing_may.png b/graphics/field_effects/pics/oras_dowsing_may.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4eb08f0293c22310a4582e4ec9be51af1e81a9 GIT binary patch literal 345 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 z®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

mD+=t`NDu0{t#iXjr9F92@ zzMa|QiF}1QY-X2AF8DZ-UEOw4J#l7Q$>q>G9K)zf64jT;=?j0I{DAwA@<>%zu%ucB zTXd{aq!{jA8iDWL%b#>6K>Rv#IXZx!vPkYP2u_o$qlJ#UecIPO7awu@Zc0Xdo8z<# z9@{j;w>$N$sOHA71mVwg-yaWWPD3_9T~kpz$@SA2LWZ2UpM~s%?a4C7oGy@Hk@1_I zmCJkx`OHL7er#&1tnPY)=fwr`{H(?aE5{GbDVHll6pL!zBzjH6L(kn8!CrvBYKZ@& zXVC5hx^&oQdO1H~!U@v>bPxRm)rekB{4~jW_Mlqjlt!cuDCQh+x^$rZ3w%quV)#6|R!zCrwJS@i2s5qTBON`HUM&!6yP zjmeGL)T7VJCPtgr*~ufQmZF~B+)s6-!7#z-!q?ZS@UwiFnvzu|pBvPnu&^VxeI!a< zn-~GD*}IHIAB5F0@6|+>6phnxrwWJ09Jm(~VoZNxcYxZZS!Z;PTFNN22(h7+FEtU+ zv})3p2a!C8gEy+epW4PJdsD&6nkLBHXBH0;joQ;u)thr{n_@u>`>m>#6H;!i`1&5rXK*5!8S*tQjh*&1`EPl%C->8ab5IeEsN(`#=ePR(l5<8a^j z`IuA)u4Q;SN||GB%&KE zZ^S)&aRFr!CkG@*!&6pb3t`v{y-Ko_QHk;;SPHrC8A$6M^YV#^=pkV`E~FY&FVLA@ zFZalHm<~&R?af&nkChy{yma5XTR5Zj@*u%(f8@)Psu(DNhRI3Me%q%H@kvK~4aGA= zj2*_`!SSBXON65v-9pp(wd>w!)G);_5*I1s);Kt4VSP>Cs=i5qD+0CW8-nx;URuu_ z+iGMzf(uP^#s%#Pg2N&+R*RlIUl<@S&OA*RaMC&2O)g4aZ{DOMKQzfsfmDJeE4Eh~ ze~mIA(D@`#ogx}HxA5y7-=DsR?>e8&i*uHT`~`t~T-zTZz^ zH(xk@zmM?4t;B0wRsG%PDgKHn8OI+cPsX+(QGZc2OwRKciLSzXy^@Q4N2X$tewG{! zvCxaEub+62%;`(1tv0+S8LxgAT@XXxyfG?NtHaHzcjHOmk zk}HwUvhf__2WgO-<_W&axep!Nx*pTnLzL3cwOYA;^j2(oTd0>`(NV>S>}Th*yxnJ$ z_K(}M?s4Z?u`)EbXM?r(39%0AU#On@GU7eS5yz7{UdK7A$38#VNYMC8PMejG3YY=( zyW16o(B9cFHb=rSE^Lg4X0ig0jtN7&=Ht`i^U!yJG^uWx%uaHDoP}QEqJ2@ZL4??vXqZrM zqffE#(dlnrND6`fK!q(o%lqo(yTxl_Ub=C{25?E1l5Ntl_jft4S^qKW5hHkF{VJC z#FDyV$Eh0U>8R1vw!RR_sL4FT<<3KGcrchZ(WQvC3WQkr>bFbDt(BF>j18_=8jZw? z@rvdmoj_}qVx1G4QgTP72#(l1hOy21(XK<;4LWi$Hr15;T7Jb8RsWtyqj~1Wt^l1uFRTc&RgV=>wVQxO6^xDS*)x@eI+o5KB$NA2V__9` z%&T#l_iH++sNR!2e1&?~C2nL;J;7gx7SzeFjWD*WPW#ps!aeKB1@d1= ztsPAGdi7zh#OJ;!Fj_N^IOYECA|?Bp^Jc~+8?Pg_^(Hl2UV(XbyS#?xkjiWIL zZz8|BXE>s{xvTtQFRJ&<#ptWu*93fO1Gf5kh7X+H*g^8e-$0xd*FQ_5Z)UAOM3h1o zeJfNO{4mR*mOFTj{m+mlh?!h;4SL?ebP-lrf~J4H7u zc~O~(1UVgVzOCBqWtu&)Vk**oaK{jF`!Q^Ioes-%xB~?Ys7A%V{|s8C#Rtc3t*lV$ zP;3_h1G6u~URFbe-L@}LmD;*qCzH_dMc&ZGI@8H_Kn%O$ctZdBFdbfK;jMeWoTvGu zWWDYFL9J0mXy|egoKdIH@Z!(o_^89SLm47He}dwVeT_=D%vj&|zt6sen-ux0x~J<0 zn@4=uXJxrAt7y6Rn4ze$llHix_o0-9N}3LhqI+Pu>}@l4Alf*=a?!=m1lWEk%=DU; z0yuAQ>&96;k*{BVSDe&z_)&90Z~6m!3U<~`iCLc&vuE${?&-B`)s*)=VkP0ac-@eQ ztArwq=sTFyi%W1GayLO^9wTlcM;$Ibv~Q=4>s zB8~cz8pFIFdBmU+lf)9c#b{%1BN8nO3&T<_f(Ky2DZ^=%pLBWqSv9+#+5Omb=PXDj zB>k;lKUi2ldH;cRwvB0v9SAqVF?qJ#lMdVx)#%4iew}l7H93z#p7h8U8zQB{nA7k^ zqIq;B5RmBMg1vs6Di3E4x3mY1EI!ld1y}Mq(Q9vktpX)YOG!G$;ze7osM6DQSR;u8;!1DU3{&YHR=AUjvlo3JM^=rLmsW-^y zR0>GP10P|*gK5LK?y>T7&9~KK+gP*XEJod@z!LAHzcAo<6L8OC<@8;lBr#7ih_mGq zeu#qG;?N}}^D9|#{F%kyE^ID5N^3=x``u1%o_fe}h07)X!KEw&W2=>vRZP-pn#cE# z`2Fww6BIMRcMEzh+CQNYF3Uv z#`x5>3ZjL%Qf0C%$9$%M+|=CI@&b&XEe6Sxq?}6Zh5%z;k*&oloQ< z$um>6x)JSk#NSEw;1hb?Q!7?HUL5i=Y}#SwmoFJ9ZUQGzaQsu`f?Tb2?>bz-pOrAp zK=w0V%AEW@0%+qU7ZCbjnmZ_dS`S)TuuCre1$KQ~kL8m?|?>(q9CRlZJC=IJ?JDQ4f| z-TmN-zGRTDor3&t7F_%@1D89KJx{q)ehy(UbgI59HKcJVba>BrGLlIua&@xO;$_{g z`hc>sGWN=W4N$?zy9JDL<+0^#7uet$kf{)5-u01-@}$g`(G(1m+$gECs7DEDu}__R zVyLE*l>3~&xMXbaL@x`t7=hz<@D=-&p$T5oufR--DAlaX`GUr+8$S~GU+0Yjf#nRL zD^F|*__1nXs;1F}iR#=h^Hrr4-pb=;cie8QjZX#at`&wKsN3>XiR&!=GWSZbV+Nc; zK@ld}{o?iZA6USg9A5=u!?QIYI8L7?JB;LhBwxcbC0)G|`Ag)M5-Aa+-7rT5!va$rBI33^_R;r)>v@ zA4HwaB^c(AiOC!<9*ch^I4dHAx*l8KZ6dst%#A zSu6@7#%a(TeMQAONU5!Jz{d8r#Y7wlsido!Z@I7cX`2x8EMH#QUG9Th!e5(=hd6d> z(YtHh%Sp5Q&#FTWFUiTNgE0JNR?)Yo-hO%GXD*N4JjBYhiV#v$N`XXZw5E{P9t_bOV~m2KYAZZNbyz5sM-=dpbaVEt z|Faq&>*FtnN*%G>#6FI+DUd5ri*h)f&BMT{(*1-x5<$wr&?1?3=>3d@HT?MSSvV1x z505d8-RjiUeAIuK4fIVjbrt45@ON{yQk?uk>x(g=uX1u2A5i>u$85z9$lfqUmf=P! zbmHIu7?r`w=LU1b4q8ZkZ$G4Y>KZioY})_PmeoBj=W9B_UTr(Auf3lf(&BkH^E1g3@1?WN}1QSIn>y%h3^aDR0VOkZ~s<{@&)o9WY+dyUGTtb6XC|A*gC(q@>W7ZTDI4w56zu-b$PgIz53XmY>G zTp^nlNDgvdFz@}Kcs+ghg;;2)$bbT5etJ)(r?DeG%#ei~(ob**ED(A37Sib4bJab_ipNX3>Z!$Y z^8J?F*HA9pGX6A}FQPCcae3&D3V2RBS{~1>QK@f{Fs~P#Ogg;Mx<^fFwt3y5Spdre zkG;>Vq{txP&*4mf_q|EXMT}KLg=>Z~CgKzb_(NHKw|2w?ns<$%#LFYP9-v^$4bvN1 zKS4p!(btXbU|;R|y7t_q=VnrK)vrMRCH|!0Q!-z^^>DCWWi%wd?}!qI53fkT;TVRq zk?|hcxFu+vMi-&#hq`IbE0f7*681zph zHKN8I8*)Z=Ie=G)-)TMA>}5CiX86FNP!IE7e>3Y4zrVBYZeFIFJ(jFXRb*Wp?%-1z z^46ut5-HwpzcOqgP6tQr^(|M}bz@(!&k%MPXL(ZO(qO`y1Q0uR-8%1Y zuI$wQKMF3sVdXaGcexz)a~R^EpVDkSdxOEPa7Mx3*e~L+G`W0h3k-Tr#!h2A~&+7H$ZcuqL+*oZjTtP2v z6)%3I!gFeN=V`7xMW^>+Dp_`5rx*i>GZ8fe}DhbSLIKCwOwUXfk2G) zU2tw%e05NyflNOB==;J`S4GO3I-`Z`pHVC_Wga~n+yP=9+>@C3R5B#lBy>fF!PgMQ~>Woe9O}9p84qwD!ceG zjwSjvLH&2uVHUT|g^zdHB@ab1SB`L&$3EhBKTziu{Ki#+6ZYKYQoN1*>&gyrVv`{; zpua;!UyHcw@Rw~gTQi#AOfbSx%D+o;U8 zVdYhF+Lu;#DN^l*(CsCvb$A~pA4c~OwmMG-*|^AiX2x#Y%bbmp)WsV2{~Ant(TwU* z`BK{PRe5~Q0sX?0`I8_=MM4){kIq3*v+X#ZEWR8u8V% zlkX_JX;q&KsH>B<_{nTz2NDB|1vbrFLU3$@8t2n;RsFjQ@naHUy2YtT7EV$}vgvkRVMkSdo30;lMM ztO*M1KCQH2?_kRtdW-{KgxzO;o)wv-h)(|+S( zg`%)VeWeGSocI2)TY}-2U(|*?1w*nTFx57yz7wH?k|?yvwX@vk*>qv5bygC!pM1*G zdJs{q3RoZ>V1V3*FGAl6M7 z)Qc3e`!pH@lB8_2UG&i2-%WhzoTWl}aHb>2c_m>A#$x0c_ANfuUHZ-he8lRS& zoSBX3{~b-0S25uXzkyq_^tD4R>dU`lF${A=A47!k6TzaJpqfh>uxk%VHQa<&D|<}j z&c&%1Em4B11@_9Eroc(>zbZa+yIC#}ds_!VW7{7{r+Two4CB5BcYd%8&ql4oUcM$Z z#rCtEpcqMSI{bqqi)(=|%v%}dVp~+{2CEMJg+jkbnN+%k(^#>ucnzK0#Jl}@AZ7Pw zi4HRL+sWI=zvDDA=l@eOOC;_Q<9Z2GG1UbdkX7!z6RG;qx1*Jp{}x&imB*`k7kC#J z*1Pggu~GgNYdl@~9*?o@-;ygLu4x%1ob(O%Pt!%CI=#8gIH+*PX-4gB*fPGFkS;s| z)}WijdXnZJPtrm{@|GBeQtU57sxII;1_aVVvXLL$a(xcX+@;7NihGjglZ*n;vtMTZ zaURdNFfs@da^^fg@~N68KqOHZ;Wri-@LAwN_jUXo@ha7|Qjy~;u6~+1LgFCfSeWKB zM*pw`Ubkf#vojTF11TlTKJ)7K^LME}OJdJD;d%Yc?~T`7;J)o)Kn@sb@0>Vrm-jdd z6{ZKROlq}r=@8H z`{urkZ1OScz8_Rd1}bW4N18u4#=icCTl^t#47gl@c-JrO?A8(xbv#>j`|`eKS@wow zHDzmwZR7**-q%YJ-qyjg$ z0?Gm#iqF5fGHU1U+~T*z^tSPwyTCW0n$#%!W9sLCc}4>#!ZJ^hMsr3D^&ZrXM7HS->N25 zCSTsZO&V;VTG8{>{pH=cZ$6ek4piAr&90#V{!EHDEoCfRKc5o5Bk(hD>iDkiMpkSk zN;uQa;P%D7eyVrIEOO_vboE}n#(faG-_Ys6gMf^);$olsG|zTE@Zq;kJXEa~$CLYK zg6_YrFu+_*cEL>)_S_`565)Eny`65qZWI^=lGc#15YmS-Fu@4poTk$0{GNTAtE)Du zhnO-Qldc+>ApwBB+W$i~4U9GimVOP-83sc5cEAzS=KHBcWaLZ9q(wZqzi{qLWYV>X z=apqaEhZu`3jD$H3}$rPU6{&qMxm}i`kVM~@$$|E9LI>)uhX6$A(9zhzwrZt%Jls+ zV;cFEv#>^c5G*4?{s1*+p?9zwO`HJ*Z*oW}24TjtU?i_)q8ye%03RO6_qs5GMZ0FZ zb-mMU4915#SM-pAnS$h<>D1#+++(F#` zD=A7`B+YEVWHD;IT_X5toAPs9`W%;A`3Ci9`m|5kJyc?r5xmQ1v9(m)AhU>1NAl3i z8WGaqkVUADiBRB)y`)7!*jlS0G=1K#AevFd!qK-Xw{p;aMFy^!%+n8e~WjNaXcoL{6Mh_X6O7*xh@BJ zw?8>C0F)n9%Q9NtxTw5u|NM5>{|cPaSb>wnBo_#rt*I>5{J*o3#yJr)p5FPs@S(&+-#BR7wbVUB&;Rewx0xE5MDPaBz1x z%;tnBP7ONh){p17Ywvnl4YC4$G3NG{Kf0z&m7cKsB*&_LF>l@N)lnH0-{wG4p&(1J zu-ag@Hwe^RRhE@dl|BV9IxX08mB7oyymRWJP_C6mt;)uJcY&b9+mld`4ye{YYq{uO zf|5Dr53MOT3H#lwpOTSYjWnqvR013@CcwXcqcg~W2Lqgw{$n=52fFe#8^YLJDA#Jj zSf5rZb|m&!ED9I|R>iV%OxDp(ndgpfVhh5^PXd6yNq1RYQ*b25RbS%VU0EweztjS4hm|d z$!|Q|kg1*Ot=~=iSKT%C*QgM90<1JyL&2=2{ z<*_y9Zc~#PaqqtC?R0?H*Z&3-d9e-0yRPQx>&JJKOVnlAo7zCS0MAmC_jrjvaQL^2 zpd2aEcAd)W(^3W(yAIved(2E^h?5|2kRoOdOO-au8Pn}fJ64cVVopktU)+l;zEU45AYS0ojkCD-r$ zP)q45B)m|j+Cc6m=V6a~iQ~E9%Fhg^1q#osZedsSAvru0=)-Pb z*E6wo9u*IeYQofHo=9nc2htiGxk(b#)!8S(zFCp^m z6VjR!^2e~#IXQ?hAy$M=D^thy&MVZPA_`S!)#sV=G7f%UY(2iz4#mq&u2f{Mq8iIEpz7Q zzXEZl`qStL@9sW2{9JFv0EzyQQCe%z5HfJMR_RwDoz1lIT|7S{?2MxiFzJY4dE64tyFtOqoP%|8nIkE(u~fM=yJOG z5s|ix$VMU1`$(EFtb?KZA%)?neg+wT=M%^O6^S2DVxXgh-(#%=jLN7+uXnWOGE%o4 z<5km$s^u@A5Bc3Qs2c`?B-R|gw2i3nkN(h~%dvEQLEvBznnFDOEna zybTGZ`-s4B!!vN`HIM1skC|dlPDuM8ri|DS@0nzR7NaQ;4d{rqXO5nbF(h!R``b~Z zF|y%C0qtIQ6vzIJT}6r)9PQBL!?3VKFGK4q#1mwr->mRf_cA+a=}?SDb&trUNxwOZ zu4vW#fXj5RZ1f{;Yt>5n8J^8%*8_o?RPsMPVWOk?j5WHSx-Y1&{B>WiZwoyg{{L_G6Rtk zOmsgXO9L9n8faORW&pkW#gQC+5?qR7W)zg{TTphNki4(1@xCfg7f)AFEwmr)bRIH; z!gEstir@1`!z{+V2gykL8;!N1?jQ#Y2Lq8 zC7nrYnne}9fqk#^kAFJz4$7OHVN#~1Ur-?|Gxt2Fs>h$1nJj?-Q_SJh0LNNI?pGQg z){_Wh;959i3w_OUMZrR$h0#SMP~=f{g1C)~qT!Gh69mJ^d1ii>n_}IN74oM;XkPTS%nsqB;ehD7YwAPCmHvMoJC!c zf;?=g*u37Es!sN!5k2hBmo1(nwukFa$!uqNIZ=%)F9?tFT&~}gSt1GSD9tShvvBe)NfKqHY;H6*b*dG3c@O2S*~&W+bSIC6rEqvd`ZA%y z<^AJ`8US%sT~2mxH#V@$1CWlha)pBFCEbRVop%=~?8>LD3<7jHTswxZ=?FYK(A@@4p$}0hPP5f@PzD$(8a0lC4TK~9zAHCiNHcuVXX`SieLo#?( zA1%09zuhB>=aQ9!V(zBM;(uXsPtiIUf4t2~IE{fcBg%1~FQ}EDtpB2u%hD^OqPu6l zeMXPy=C=SC(aE1b>C7mUpbUeeAIGkP`Z1`^_~w&?G$4$25lO#C_!yra)h`|(daZ{C z%DgY0m$3;ht)XRPAF=0uU`F=*K(s}?h;n=9+tIh9-d;(-y3WOue@ZoC>Sq!+#yicK z{#Law*!k9`%L(O6XCNu=QW2{8P9---%BNLm*vVCxVhYLeQ?0aa1I%x~-Vx?6GU2V+ zHQMAe6=ps)1<#%=JqoEjTW+;sNdef@1K?ZR5G1j;yDb4IqMDZ%dtc+e08+v@kec-L zss4F8k5pmfu}VR<{+#P$G(1J3xrLI%G26TZ=~!b8a`xRRThP=$ZMCz)yP@u_`DC#fF)VvlKB3&xjW;DRb2kNH;CQXlSjXM7ocWNN$gO!MTf?~(*Koy zhhNEbKlmp8`H9Qo_a?kX5am4U^AvQb5r%O*1<~FgX*$t?J;jS5rlJ2=&N$PY5?kMb z;p#Bk1Ap|bN8-v`i9w6>kxRQe%T+#8Cd;)xmxsjVk179ak4^v9^`%Cw2~q}Z z3GSq(6MTh1Ct1pLUh*1;edL=2P}Myd$R}X(oC0IKJ!_lpw>CbZLw6&W;HM)FS_yZR zw@F_(WoGg^~x2FE+uD~s%j_N`OlI5 zBai>@wzA$YpRs{>EV!!s_u|jYv2V|xypk%YA^PZi@;!Yygf+Rwa32rsxzW9Te|VC7 zN|-rH^-C#8Mt^c|)7R3tC-?&maMh)6jSLjEXm!V_`!>y2KSokDcNyYg!wz8&&%_LEY!BjB~I zXe+;obiJI`jSPrxbUQ?TWN%1%;bZ!#W)^R)R34YbzZBP4P#fm6lm zoAs%o*hu-U=*Lzr7zd7cJ0W+FuzUW?p$ymGea98{!_w%<_k|-I)8zCy^V3sVASHpC zFbfa++dw2rC*4g4UgUX9x=HnhieyXw)<{-O$tnYbKv^6wUst|0W1%~A z6kjiLIv()OZqjsn62C4gUbsrt7O~}#`ILsod~W@gJwkvnYG#(F-7ImQpoNF0P`Yc@ z(|z^ z+-jC&9Hje}{m8e<5M`=)!4mzIjbe-5-v+yVHD5)3I$zKj?3A-gCMA+-Sae`&`Nt9f zQ-;m~j6CA2TXf=bG1wRa#2;yS3q2wJ#Sraxr~Q&q#FXAwCrORC@xOsY@qo&HfeES9 zR=yzSyY%*WRs7No+4GJVO#QojZN{|<&^3J7Ag&BwrmwGmi>8+`xLOI7LeoO# z*&;|>up!o;<@eEfV!P8rPEJnalc2+UI+Y}09LN~Rdd!>Y_li9Ea*a$8CCzGZ`8@NX zk=!87U`zlhDa3QVFxb4n8-A=^{JXNjfcK)QHqNR2ih|F;SgrSUrK^h67QE*3eD8Z% zV)2}y6xH8rJWI=U-&c_xw9wL&sKtNvkPuws!>vCjbDrm9?&PFB6!Le1|7hRE9?`%6 zt{?xC;QudhG7`_bpGzhIHn7x!4JbKtzVUzTof1|d+IawvIFgjBtbH*XsI%W7Ppdcw_ zQ~kX9M`=XxSC_X6$8WFC^c47?o!q6Eyi&A^2!b)wT#b?6{g56mU74NY^_*}{cxkEX zp5ztl^MLD&qoT5LR+6&*dRZjuwY2}F=v9!Dkb5K8H@Es_&$!8-h%<1&Qw~4e_NmAR zHZHev9gWT^3FUCii4XkTLaJvLN<1;5lWbSS61&aIpmx@v(s6zmpr$NUbeyrz#lO=P zkIF?FBfPw^cnaVr_yLX}R)ahHT#Tdi_y7L?^y68^@VtrtpFY~3W#!JA_0RBZakBa2d|8krBbU z4_^jte)%1)?*9%VFSZ~5R&zW6@a>fuP2C}QjaxkMqkH-W22eBy*q)7ih0T_r(s9HE z1O(vQDV{Ve0sbWDye%mXq`p;fkn5#?`|L5$!zwUvy)zNyDFq+z|`5F#yk;m@0_>PQ|hsm?VVu4VRN-~9U!guvf- zy`EY_L&Iycm0IL1@tiZGvsSw^lwkzKViYJH`uAXI*CyRc8Z`&VT0Z%t`g5suqLw}x`j>QRrSK6gU6GE_I z*uVrHF6h79T0}456C)G}UN|9&U_CL}r*wC>ba!`mD2Q}PDAEcDB8vPE=*&3x z&Uo+KJKuZn@A=Q+k;lh<_Pf`9SAW)8ulJ=SxOw#60kQ!fhym9hASnQi6#xPNo^=4O zGJs$nG&EK;5D&)PyC4t{1o@BxK%_h%QZNYeEgldE3?>BtNLdX?c^pVZSSbX+v>;Ym zQdU}8FfA)9EjWM{9Ki}AWo0F0RRXXo8L%oPuxg6j6;t8ak7H*eou z{q^~42mWpcNUv_mi7P)46;=>uV`71Uf~W)OM_5=G05O2!S~srMB9$i4nJ5rb+%G-qj zrT|zNAiCUe1}!^uKs=M)RKD4XAv_VkC6EwYU;I2zGM?_?XhI3%9TfY)WsMUma3~tC z*z}@OzElN*oof4hY~Eyq;oVtai_)HIhE89nRcbt)Y?;%+X#K?tiO4P=2puxbEV@LT zpXubrU28T6LuElv7(nJa9j++tf!Pa;&tlT~+6uIe5Eg4e-YHC<(DS#dGX%UJXL2^0 zv@)L_4y0<`eS|OXe~VbIz4>VEo!+C(UctUat^gPfiG#C*>xLDl`hX?sPA*c_A_NUskh3(nXv0_ZRg zn9N0TqX5^V`zf0U9BxD7F8lE8NMc1JJDFmMD)8dw8ncQlyb2?s44Mt4dSaYpp`_{d zS~gq7tRR8ITvEmL%E<&LokVQ1JHv6->`kWYmK3!g@>z+lp~4O=O{V1tu*eaFd7|_^OT;_^2XiWvg+QeML?D) z)u}Q}%~tDfMWB5!ZYi=A9YY?vCEk8@C9Xnw2qo8&X6-Ol8$;f64C%Z$KGxLy$YQQ+ zXnP4f?lODtix!e9H0%<;=%vFD^M-eWd<+FoYpLIM979X$m3%%>)+?p+T+;4_#j$+X z1H|XIt^lv3+4kOsAFu4Z?7*+Ob?z5nm$YMLXx3rUK>c>`JWggMy`8Xi%VZTP!xxEd zyR{S)Yi-J9b9sn@Y4I>>BsiCWJ;vU=S=Fs+}h}sf(PKtQ`O@Fx`O`8IGnWS1c||Hn%Pl z`o*KIYG&2lGT(!BqMgh-cw;27XG5a%xm_b}OV@OLhM%|UHW}Lgu;|l1M z?;lUpR>|?5<(D0D9XPb=EN3jgs1R6g#1XiZSuDkEcV+i_^TqhcU(D$hae88`*}>D> zT9;qSWG_8W3zcxKn2YhWw|xfvn@7rhSMd^H59%wk1gf2pkfU-Q8xg`TnwYU6#s-a& z6QNlblUYgoCGFqW1^k8pk z(X3r zyJ&AK)@KyCd|JX1iYTk>K9yQ67F)7nW3B`fpPCy`(EZrF+OUW%gqrLVZ*>RMcG{X#-i}dDAe!|t3Kp)Y+D?t^zQn!Sj2H0JMA%7 zFUiHI$LRV1rIFY}7%2`xjaw5tDt;@fb&9K@o-V7W{9Gq^GDioe4XSX-$IFmp-kc?w zq%i!Jq-urHQ+1tzQ;~xNYXTg@8z1KjJ*8!KFTH~| zdJE0dI9~`O-`-UzIRHH$M73{^y5xMYGT^h>u!?z~fOK~?^;!E_rI3a;NgfjpHGa5l z{R;srV*zU=<%hT0)>X>g=F}VK3K>wfHlVXs%qsy^@fdbqJB>zZR%OV=FQJJ#>uNzS zkMNxaspPix^vyRwRnF=SoR*SgvX#q%QMVCRg`jWk>oQ*5DPA0YNFsuT)U*G9C597z zJ@pDz0PC(!eQcthlZCp$Ys9@go_(eKkL_=`OscE1bGddmaH~p{&qoPU_tVu@deVDA z`IKKAR8O=Q3Cg%xci;{TJ-ptSFh!$|ByF9OqU?=g+b+;wG>4jO z|3a`f)aLRa)kdH;FRW`Lvp9093&(zliz}*Yar1H1KeB%+$DyZak#f}k)-`_$XnON=KYYH;2m2xEU#k(=A~qtd!+WUQ z@lTxdeP{CM)X1M7#2BbgLXzz#0AhTL;~xG z1_i0uTriiO5F=LD5%psYF3$*8^wJcfviY!bbrjJl#Rc%Iy#w(ExLk zh^I7>3uh73)bS8mx69&79QiWjNkp-x!aIiE@j zNHy|F>;OVNbYRQ~p_)9Y#e9{E#8ZS6Z1kMwV*)jbOt4wRpt^yhxrezXBjZRR?}q}E z1jF)P7~y^x<533}UPeimBu`qs{VSf7a7`!EonrdbVh^4Y$>9J`B%TAPLiSBMF41Cl z+>-3n0K4WSb~?`ayCJ2cvE_6w1*6eLnx@XKcDi&5m23*ec)`PF8MqFiB<5sku3<$c zVQpc0{qE&S+m>BvB4KXcYMVuwi*#A7c?0g5tsxBUK%UO#p#CQFxv(c|yA|`AGCXqu zOGwbVqvC#e6}8I6-q`+ylHML^<_1#cx7@1$sZ}3F0#os9w(%fT-StH(C4W(R;$n=@ zlHoL50kd5SFKv_8>W!KnU7VA}R$5)tQqp)q2mQJ-q$NOr*7u&9-if*T7xx0r;95b% z{Cjw{vpco?3)Ylvlpy@P^Q-%1@Zvdy_;qOMMbe0Ir@M6`eDy~dN%|k7br&^w6Cc2) z+XeAN%I_sV9X0U7Esb^$RFf`=8?9BhDB&o2a=BRehz^FG1V&J(5ze>KNUK=!mMJ4R zCY08>a3KZ%qS}eC2En39m%i*7TT`&JAy)yHk#u8DU_P-{Xy1iFNK<*>RyMg=`A}&2 zyA1#uRf`sU`lwr7#8UIK5x3@#qE#Oa`hqhbd{V6aP_YsA1XUL{0pGM3pV>pJb&)61 zu9dDi&h*{lW2EXfB$i4Pb1yXWEV%Hh54El3dw^kl)AQ!SF8s#157Fr6Z7g+6<@)BX zOLc8~P>Xv|ZF~$Y?&{-L9~o>snqBy;hNTq{6WjC6o7zlkN!>~x(>K~p(N&9f%q&%d zKGY890+yD#mdC2NmI_J>I<0N`!Tg!pl*(1cZ1Ly#N6Tv8y5Nv(~ zOe`{VD*r&n{>TyUhy`ZXGjsGLf|kAymCtL3+rnYQ0DyeY(FNXNvX4#SXRRcP1DOOv zHlGL6p+|F&0j>O_Vz#4$8KWiToltp1-%805XnXpp1jGp1-zu zPSMvhiwJmjwLeK{JIYg7uHBk(?A(1JZ8MnhoIqeA-LoGbW|Y+H1se7=mF$Gr%5$~@ zYo->FLkl~Bhu!qI>i8w0>8qhJv!{o12jFDuDK01Ey{5)8hVG)wrYp^+BTv{^Jq1zE z?hiZ@-5bD?faXAhy?Zc2;S*59C!=z!L?hivWq-oXYDydh13&^zr~m~e^a2V1Q?w5q zd@wD`IB~W=;M?)cf2Bb?T`xz2(R~GKhXB?arMqAx!-BgrkC7pmaawNWdBoHHSQJ%LhKQ=|~?6(dQ+; zb)Nz9=F75{Fxt+cgGJ5{gEVq$C+)OCOs|ko7UEF=EIJHwf}09opsF5vt8`3pF6j(s zPTl$Nf@FRDxMTRimvz2}wAcjs2ZMfEowE;_UK4%U5Z2jrdi=uWu?@P6sa_=!X#T1C z?hF2_F@N*QEhgl8Mt%l6%l^R#hH%u)80&!t`>(mUCt+7s88d=(Oz%a91nGlzjm`rt zj(T;AgL0#G^@ewg9tTxf@9NO(mC5bp3GNxH?->Gj+n(%Y9tLQI&(Vg4)NX@273QTt(_gYf44(B}O?>w_VkgYnLTmCA$2;e%&_%d^R)=9ZQ#pzz%%hs2?; zs>&nxh~Dlqy?rnE_DtvP`Ip1=y|{Cn@=%%Z7iwEZ#Ed+T>UghC?(kpOe6hwPxHz=FD7m-&P~@V@`+`t$dysJEtnj=! z>l4dWvuN3;&Z|$%;{yumj-H5TnlDcuJ*v@({ygse`Pszj1o2sr=OHT9huxP=2wU5 z2PZL-mpiWKz8+6x7Vg(ZJjxfs=fl6)=Rq%)4-ySTMJ~NV`#eA*@z~JZen+ub*@@zk zhjUYfkj}`jTB>gAX^p;xwRpPffo7xCN@pN`lbKqb)4^0iy4qWvPOr<-23GcR>7++J zVJLeWZ}kTw32g{J-k}jq4AH~mvbaM%Hk2vgy~U@I|Evw2D_IZ)`n~yVMa6DK#K+40 zR_!aqCx&5K=GIG+9w(olI#I)JP=|`Xd#d%(daKEQ&$*M|{p8iOZy%+5t-ao&@q-uB zggWQ0N3Tb+?mi;w4acDl$>UM-9yj*KpX$WC$8k1ji1Ep|)A5nUWxY9EC@ zYHLxBr53epub>M4K?yY)-7Pj2GGVmiVT#*gQ<7B41hpeHFCA`o-T}RP2m65}1Y?ve zZ+~iprRTGf6ziDhu?+1~3Wuj0OWL(n-G{j^Dlx#4q(LBX^O_&#q0IUOAJj~|{5>cv z$E!*H5BqfipbN~g>f5A~7|;xJOKgH|7`G1p)>YJ(vl;BmzP-dlgTd@dWy z%UNt&HRiDKrts|xkGJL%#_dO8r{nRI47kI|VB^<87XqVIp0mnk-u2jymf~|sj$<;( zXBH);i*%OLPM#~2Lnh2x6Ciu_l7j?#*;ySrm!kBU(qQUN*UddV0`30jE_&EES;2zt zJ4HoA7tzekgf3`Lf)=e-dCD=34jEOPR25VTW?rbw$Uj<436xhU%s5Fq@jMYAo(bIj z@W%UU564StM0xN@u|S0qT!!XSGbZ-{)UyXD0lMAiTbwphgSNmU++wo%xGzqVSN^2u zDcSk}zqo=3A31}?#0&|c6-E|zb$|6teaRx+Tq=D|{>i4w7cp@p13_#uPZ0vuJED&e z<(KmCr)gYzjag&umo2nbthv%lp(?`E%3ple6=kQJH4AwZv3mM0zvHQjRA`d<#tRyR z&V=Uy7B&R<<7=kLRhjw0@=#F|Tk1G0XXpWVbt*`<$yM0)Kyz3Qim}Rm9wI9R8;o&0 zUjhvrShE5eoc2g~(w*+qbM%O-u?Lt99AFqClgN=N!j)}j-p}Y%&YAA7)%D#{G%ie) zd8CPM+bOrI_S!2y`J6k6trRlls_i%tpdc<44T9VA6HcaNBEtoS5IC1zQ~p{>f3@Bd);ndjjI!fJF8J zXq4?IzE6}K;8S!rxOk-CnK0ut8Gy~bgHlQdvRTB)>zVp%@^G5Fp%%)8_wRuz;YpPB z?*{0B6tT)X(F@YbWTFI;I3V>T2sozk^FH3P{*n>B#6snTc z(Oy2L8?2#eKbw?B8KLQ7nwRG~P{&uxppH?d9tkyBLv~t9njbFKf?L)rJtHRu2aHF%9!>ElP(lU z$kuOxZwl%*7At!JX@ECKZ^5yQtfhTZg{po1%f+0#WZRv?VGnJ10`4B54vW=Gi-Fw6 z^J1n>Y3Fr}^y1^^eZ-Y15)Vk?(VLRFfvCk{vKQ=i&kBdF1dcg;uj1FGFC?O+w$>uE z5JoXQ>55FW7e->7Mn9O>cE0DdOzDx4D&lDIJC!ySJs^8cOCDK6zoXVwsa@4fy2t%C zlAT$2Z%n|1t0C)>-CWdV46(w9qQmL6nbeT+8!S7;soIRhYUKh(@wuktK}Xb{q#aag zw{)IKqUb227HK!r=|VQ)Qk4#K)uzRnsvxKGhYwdAoz?0-h=+p>pYA$u#XtW{pr@Y_ z&f}G8Hw`>}E{#VLfX}hCFcIWjUm##*u7AoNPhWx#s)^IPF0>hV6IzeZ^bc{iT2C7tIL^7%^UgD5rOIQIiSF0*!ER%Z zm>g2G_>?$_rfh6wxtFGWHn1jyCIg8a!i%Fp~TbUq%->rZ^c@E=-)7&&OeeU@h& zFfn()=Nx^nsaGP_fk?1>v{->e?AYt z#RM~E)3zB-SfxOXps>pMJRyzTP`ygdxy~W;tf9+m*1^WZ&q3O2y#bS>QA~?m+g}Ub zv1)!GUjBpS-0}O01L~Jvc*nP`%rf#Bm`2T*9ERK4KgE4`JbveqgWTKpdJZ5lx+ z-0FKD_vO8J_At<{>-%u9kcvLTTR;{73i1O0!UCXRVQ((L{NW4#v85oC0dxUa5OS{o z!XN+(Y&WtWG7wLUMq#~&6!Dgz3@|%)ARJN-ub)>S6A4B}a1Q`tkc9v#=_O#hySqmc z7_b_bCF`gLlgU*^9Yfhn#{JmgD)WJ)c?zjm;fva%nB9umQjvHdyi+RwJFFId&1nrK za|K#8O8K~rdlCgQ&mTXucwnW~XuCO@Dcw}L(&l=yyE4{P^|H(7jUPb4F=Qz{0Fell zzxkbhR47V3W4l7F;^=MS6F6Uu8i{9=#8ny1cJGI}v1Q|@i`^M4@;OU#2Wirc59%0b zsh_DQ_*y^p@VJ_#(bn7W4ZPC`@AG-{xbvwLQ*>oJg@06{mI1ZEl+)?~ahtyYHEpMf zQKpbvF9EM@-N)cCecK-1@epkqTywvvsfPxIg0@M9-KZG#gx*tNQ=0*TCEsN3gdxMcdkNLSV zawS92Xo+BT0kHRD=pHmqOV(`-B-86P_NOXQ1C!8k0X{;C+fTDauLU3>7b;)O!#be! zJsB)eByXzyS^x^Q<7bh}RPq!HO}a`OQj-oAoBmz^>_brl-Z|`v_WH0Q5oxM#>i0)U zi!{=;u<8O6+4UuOKI%)s8!zLUc)_6-ca~w#sXN1^H#g4Pyeqz_zjQG`sN%A> zNb60cz067hSVs%>=a|Id*$y5^)=8`8`Td6q(BLg!1%(VK+|x?toH;V;eazFA)F5b5*kM|qj&cO5b?38 z7f%ADLWty}INWLqq$6nV^TKv3<%84UiAEDz(ER!{(A}WleXQM<&Zdn&`&{CXqmV1| zNP-jGusfZkR%X63+E6xErP~)qDBW1TP-pt0^x;@z#Zs;yoCsi@?NFiBhI%nmE1C3V z7#i=F0ubo6Zd0HzQBul0^J*v=@q>tr4-}H{ail}z8A_x9<>Ue;D)_vw--H+3e`2jM zPyIZ+B3RX!L5*u~5zQXIzO30q55E1fcIJT9^&qD!@-~)P{QB!H^VFgGa#rJ$xM`k3 zLtL+m@w8QGGTfDtWV6X*%OO5-`MMINr9ApUZ$5AROP_zh-2Y9k-^j`L%tZl!pmlHB zoTy-bZgcvzT4VAEM$9X|5{U!iKITtlDHu#Xrox7VwKKWPS&r*E?R?eN;+<}+e%(to zhq@V$XNZzOuFUJfT2fKdG#|593%MgDjLLDlL(>>9A4{aFA8b$J$=@+lNOS6)V19Tf zz^jEyZxPqX1HJ~dz8TnlbTPQV)%^M;N2G_CU>)1jt^NfO6VG_|XQ?S_YHw2r>)&s4 zsVEU3bZF8(Es+bBVEpp_vpZm`ppw}u_KVghtOJDqdH4LgT7Avmzx?)}b&l z?iE#Md6et$0GesMxn^@n`Sz!RTP?M($AW_8R3lpI-b|QK=H(-|*6+NK6{nU9Yi-zj zRytz;Shmf1ecsz@Z`BLuuGwn0zssqBR`b!ON@$(LvvxQ0r+MLgS=QPg^>^o8v?iWC zc%HLAGAA5cRfI9#N00&tP72vY3K&F7$;}4$*0Decx z_x|~>;Oid+U&H`!2!9YD8%h9x+6NVjWyksRp<%;zDuM6o>hXrAL3*L}_3f_?ancxldbMVIY9}M1j{@mbg?N`Cu#dpEm z(cJ1pSJ%}Q0G?*e2Nv6O%@;^jyyl0@wY}z#CPA|vfT?P_9tbinUJoL0-d+zT38L8u zp|~+Qg~c0T42|0x;VgqRn-M?Roy{ozv+d33Z+6G*RjlNV-Qn7K6|W#c`#M2c)$Dbm zx^cN4`MrsK z_%kJV5WBpb0}BwQ1OqW(by@U!f^Lxt@}Hx9(~TP{j3F<5>*l3dZ_GHXkFY;DVP8`H z-C9o|D!B-3HDoL!6!wmeWpnlVU^FVLJ1oypwgiCsSJ0Z>->4|8kB}d9BF%D6z zo#|5OZ14&l0M`Ewr=mNYbZpr|m_gs}=h8CU_Rsnh(qm`ClP_Ub!km~imkUR85 z$Yk_AZ3Kk3eHogMrbhHBAHXAT9E*(02;5sdSv#nIq!ji2t%f_9pblXANH$M%9l)QQ3dA9Q= z%LkrrJ39c|d^;zEs&qRyf@^m>FGhlHCqF^ee5WAAxOAsb<}f=TDAFI`4K zuKR8}xO}uEwxkxeRP38l{#Z-UATHh(0BKVKZeDAvq(XMQKin^&p#=Z7*bQvPl|Njg zFC2z<&(AZ2C0{ZM#23ZDGnEgHBa%h+bc;2T0dN`Ny;oN3x}IlXOGS)6p4A`8N3; zRL(KAorfJB>rBl`z&*EiRy`%TkPkP%tPe}OxDuHnwVajoCOoyflncS7vV{~X+D_>bVu)jtk* z7XJrb>yI@Z^Kh*QLlok8v;B}t#B#)m!c1fQFpx}R!nk-}W&68>zN^SELnIUS#>YTh z(!K(;&WG#Zf1qBj5m zmnh&|VNEC)m6$FeB{sJw3ZB&1($#iTJQNd$3AQ?}AnscjdK2M^{_IQX{>GQC3k4uS zft1x*a>V>GaIq6yt8)gzF>gsEd{4PNgcRr-Qf>oWXmEi5pKgCJ8WO>`@7z2>i7u@@ll#u*0#Q%Jw!(n!CBODkUE(#&B5JT>J0fk-IX0idZIKq7@f6i3T3g-jZg z-sp16WOrXYBaTSSHanR@4u8BH!{TwVPmX{$lOvMKj$9E%jphniu}rc``)_gSUn&yT z!AJoB{ruG;ue~p?_mWB1o6&fQ3R6;E>o-RV3nqaUY}cBom>-PGB-e>g*vQib08||% zryOOo#Hf6->xuMJbTdAXr?yafh}SH?@f8@l5p8pX9GF#o_M8eg;d6bMlTaS zA;sh_(~QV%w+HS|ldYSU*0jwo+vMtHe3dBaIJd2uc8cW6@m_XV*S~1nNKEn8zqqjvR3oO}9PJNsp+C2t>I`uz z2#^>X03?G1n*_};fOvldD4J_HC*BXqg&XP}noob=ZECh@APLEjUEYsr20%VPRaX82 z-~S2l-5FxU{upQeadc*N6P=ykL}%4&LexN%Uw}JUpUIJaNL8Corr9=lh!9Mp`bx4| zUo;->eprU25(PLCnkT9ps1%A3!_HXg=vG@WmdfBX2#e%kB1cUEN43IJUm}{t_Q*Iw zbK3M-fplIeKg|s7T%48)w3U>~{_|?=hNynLsomKug+TW}k68xwc&9xsO2mYN4^@GUT^UX%~(R+k!Lkw&?3Eb#r1EUmoCnsNKo(yPfwsqS@j; zK+54sA)otu^S;!bCr<^qSVWikwQj>_B-tGe2E;Q5fp$@P6o zhW&F&_8oWvNe*>w_4@qavHl)Bxkg)%Z_qFfh#P^C z3kIT#Xal>~MT78gFhtTg{^ znokLI!Gxq-dLooaD7=Os^qgM_kr2epe-&T0Yvrf0g+wAiC=f$)9;B{~mIzWNi`5qo zyM;wGt!`^D7)>PVOn@k~(I1J4@Dq}8V_f9_r4&TvZ>YUNDt|}WZk&h?#PlIT=mh{- ze~FtC3BXgm|y9lj&AZW|1P?k|!JdQYa5BJGBk*~(htQ!HC1Vgzom00YqyN@3||%NEM? zs-k4^Ps^9WHPi;ZmYl4?ZH_;85`BlE=#0;AO!=Y-d3u3(jyB8U6m=?>o5=#=GMFDH zg)F?=j>;kQf41C0;ope!u#bpA%i!P{R#V}0WJ;6OlR7^7z;Uci+Xf{>;-NG2pjqXWu0t`8Fou%h9JYZ9 zo<=M!&Y5cIE6GFhF)uOqD-FQNZly$`FEcH~qc1HfG}|k$n$ol=se#@rOKt0Q-z~Es zqX*P>1mS&`prHXG{Oy80F?`B-Q5OV*8jO&J0 zF+ezE+paS%p>LK$m=YG@P@&gWuh$PqDriV!nw;tL#Ik__=b79*wrInEzAd7{f5yml0g5J#uVtD}gAUA@y73cvWWOs30goJdPXp z+bKg-uQmFqCn>>@$}z8_)cqpD9Ho`fnb4U+mT=Ppu8#nhRvv98Z(+~R>!hia*6ib9kvJM@RoEe-FNpV8rk1Gj!15P`^@3No56>8tag1J z1z#F1J)6zDs#8TJ*0w#`Q~5Qte0k1K4$!MX7sY}jc4bl&o7oKUlv7k zc^!?Hl~5DwR76T>YJa2+#xx2=e52#{g)r1Q~@lDq*B9zsHw@+8DH$ z4c{Nc=F-Wpd2ASvBc|1g?B-}L8At5z=aVLEFj2)X`=mV;DnO;$6vaH!Rw+-VoOOLv z4E!SSX}n1)6P(5|%~PQBQtvB1oPD`qO}L_mo@m?iH74Str^VCc{Q;p^ca1?Un|;sH zDOZj7&^b0!qKM@kJ<@8_i>MJ!GM1BVd&bM|F0Sr>q&r9|HAp{P(LCsHtI<TR4;uVVVRNy;R;GD`U9!vvvkmT zXwuCnl+M!KqK$_29x~d~=-m&6OVSO&Z%8H+orhDM(YfP}lNQPr^m@%-{5XF#aNjF% z)6wbRE_v8{xP_@lN2D5$^yH`l)NQ4(sn(>CF5vU6*P*&!I-h8SY6gDv1qcZNe!+XL zTT9#k1UI%j6Nm}?Ro4$3B2~h6Om43)45|5Y^JK1YG@39p8t!wcksu5yd+ia0d~g!o zgEUK?c#=VXw)@88xOVw+nOrvd`P|d5o<`p{f)~)JHI>Mgu;3M6bljaN70xslFHPK@ z%+ksdIWXtk880(-i;BF!I?%{aN^OOsZ(!6eG%Ooc(Y(tvTj}~zDHA`1Njv#*(eaAb zS;<_kJ0kh3kFF-uU4Do~l%JB=4aXzN9U6Gg4ArBv1U?K%IXRd#SrN;RFKWEgZ^+vu znmJD`ut`bvzIC70x!G=GD4zb&v-XygHxTe3ORj_WbY<3;dBybk;oH@PmUu^04SYV^ zmUXu(?5IzlXWsALeu=HQRR6mDZFpamy3XnAWeYcKb=yx)%8z{7oZdWo5ZIx%CW@rL zr5gaX<$`SlE6A;7n7+cP9vqQcL>drj#R)R)pxssvA|Jhr<3*%jkgP`RHLM@bJ^Dc@ zieIkqQ8W@{h~j#b;zrYc>G8S7>;Ar$tjztKR5TC<-CXP^yza(oUK_{1S|k6Y*2o)1 z{8HP4v`78ae)CgOi-Le56QV%cAAm|L!vB3`;k>o@s|%251ny(jP% zA(>$a3&}6y@LTKMkVp21*SjHu=I7f;Z+Z_5gX8=WP@vU;LZp4ZNGN2M#Q~(^;b@d( zzj`aCpYMV+o?U}uYpA|(i39|u3ORj2C|Fz!+(+x(0bnNMZx9@03g~Np!CzI!>miGe z|Ibz(5jRo6ppl|1FX)!OY%f%>X|yL@4s2E^6JBwYH+;8gcB}}vBo9+1%^*MC_`)E$Vq#%%Y}*=$ z1c3y?ri)|r2cnReHT$_)ztac>h%6%B)CcLWWl^Y_1V9M`fw^hWx}$;eH_;(E@gJzM;(nJx-x!pCt;Txu5|sa5#?SiWj34GF z_0<6+-9!Yzuqo(YE0XZPRgq-RbFVXgW&*Fl?Tvn*dyrTum~qdvSBqJ)cPxWf70^&}6&0H^0gD3v1ra^*-Y%$|ptQ zeIt^ThV>mVCHilmGqR9-5pRkpbYJ}hNsk{4IuS>442ftEAYng+#&$!95=5`69a2Ls z9)SSSE!?k-@i-M z_ssnZ7XC3T{NLx+Z?W;mRDEx@|2nMWf9J4{Kif$Eu4H^K0Dt-IKizNtSo?m9EB{f> z|CEyb<+p#}w||!-zkA`o&-K6j_CJ4E#|^ixD?=*ZmFNK7Le%iLsR)|ik@N<@k%K8{ zYI4OxaM-yVhimfg2ZNZEGR_qYr6RE)_pG6=}Z4c!j`3qidCzMVW%d%pixT(;q6gB%>W z8-W?!-fyedTlCBx(46hg#XeZkv>M~8p6dua*vg zTza_`mmD&8%X+OTEBO#g!w0?c&bmj8tCec+9M>nxt|}wh?;dqXzEzr7NxPK&Ku^ki z`w_>zhpl@@R3vsV*eMA{-}g2A@!Hyt_2+-NMD#ZWnE!wG55N0=ynmQFnh&{i3Dfr#!$=#n@ z=-GcNT?60~(UfzmNk#k+?nnfvE9i@dz~IVR4p(RQMxdiZZx`3(4#$(r=8Ank0d`#~ z`r`*vT#ti)J+grQTfMf25H68MY*+zN#1{r1th`;lAqIeERCNT|txEtfvHV~)zOS^Z z|4jYQBXItJgzI@~Qa}I%FNF-o50C_G@B*-_q+$b&AGSV4m7RZM@_Wlb2)W~o}OGZ9BKhG{*6#!g*S+e^q?C9DYTY#MqQvDMNO5;spT*O= zWo;hste;fLzKHFaU^f-fF*6HCpiMux(RIQr2y8Ksgc>8|LU6;db)31Knbj`nMW&Ng zA|7@XRZPfoezcJpJh69Ydn~17<<{xa6ROWg$M;@l(m6AEuLoV4EUPr4xFl<|=mo4< zX%r-qn4n@9uh}7wV$B3#{okH|@N>oG4-RBUHTYu~$Z66R=pSa66hK>s(I&;y<@D$0 zL|v35X2iA97O54QmlhZ0VujI`)D40Q%JR(V%#+%Xs_DxUzIDFeXxg9DJbWXo|F_M< zH{||F&BHh3{(H^C(LWoOUytUH_7S2X(50HjWQ&GCQ_B5n*z~tjpc_)Yk6`~wPyXff zL=IAn{&x!c>VPQ79NqOfIfT~}jx;f$!v1i#*`!=;5qt!8W&fnJnby>GfJG55X@_)zzeEMSEHdZMmv#U`i_>9QHH8H zOv0&)u_kU#hv#!oUKA=kk>PtIPOQ@L=nS(!Fwka>Mx~;W{Yhinhk(H!5<}V>h;R$< z=IGPwQ;#`-=;YT2*gQs-!pN75p}3!>J#V+!pTuOK8US=C?2jjq+R86Ep_C3~BZnuv zIHsBm=a0uz0UsIO4@68Bv7%#H7tTR(yYQT!%n_rM%g8`(Lo1*6GuHBZYWBi#B9@#s z*Rj;$P%GP77|-#Rn*Mx+)*P9mQf&21p>(8q0C;8 z^Um1}UW?)D6beKb$w)<~!94h@v<6S-2CH!sQ6vUSb*_c!hBo~G6nuN*a9t+{cr?|f zWnT|Fy66r(=aZEh75e*H0xcT#b&8``f~8Gvdq+Yj@%KmCFEtY$vzHEy5j<9(`Ear~ z@%ZEU%TGA3lUIB&cTCoNmo%n{AH%Z^t@(Wt-%j&KZG~6z$28_f4?s9JA+~`j!_r0&Rvv+i&NFgG#w`Lh&!u41z%B^9JEp4U*Hb0%UH6F<>s9 zX*;=A3jKHutfqOzc=3^>B+*FY*B0uF14d2;@NltOa&f9#X$6WZSodwf*jW0ODjJCy z=K7Qb>Gc{ZN~U&+gE-n=Rtu`~o};cAhPN{twIz@;4W~^Q8Iw(NrLYSy41>tvh>PUC zREvsJup1U_U@r$B$&}2h<^)f6I2D?gEPX6^sAha1so__20l#MUCb3n|rD7(jON8Bm`pU~k(5b$j4@((B^$v~VHS*`9M<8C zVW}I%6>V>wwG5lyJOgG&^__W;`S)VWV8+8!6TD79dW891pT}28{Mu{`8GYO^490*A z?jgw(8$!-Y0+69b6tj?tQ-V-bIa1Kc#X<==i7dAjUx|kkvie~zu#yRf^Xd0S@UT*e zgfqcG&-*%1i^U6ioYm7#Q9O^O4n&%9RW9j{7JMY(l?=)&>_&k=>Tf}L% zZcn`y+NLnGIDu}ljv1jfvoz+Fco2foM#R_$(%xV`v(5vz#@y*rxnmv56r3XcP%2`W z>{5Fh{f_t*y2d@$8tpjyte{F{wiAtHJE;djyEUXLqh<6HSa|raU(Ld5NsC=u5;Z$ zUs`2!e|+P4(jb;hczwTzPy-}pf(;yGV6w^(RdG7~l*Dk3QJ~5LT(16vsJmf_1{&f} zGdV$A4eFbZ90IYF)F_e?)TAgcniJwVc;cxKHI&|dCz&j-~Ny5dRR}6Ip>&T-0{p~4#sNJ@5y$U zY62?ax=oDl@@1>VfSP`J{j#O!n-!4eCxm$x@Sg>le7a&EFnh1eBH7<=s>mF#oyPZi z)qsO4yWLo87*VbEZ7u({X^Mx=YT`tHT*Zn+T#7-5vk-)csD9^WITqbu)@6%WdmZi< zgE>5CbA58^`3jL(TqM;xoQz{-3~8ti6%$=570Lxc#!f+&>NSS-kF=KHxGKGxUu|v6Db@&4N2LzZom%%5wCvAYJ z`@w_WnroKPegwN3$<4Sg9f#bUR1vd@?LLy}yBRH`hFD1%Dhtd9#^6370DW3<>zb5P z8ezL@zTHA5G=73P;(`&$G|b8IMm-RCyWVwgmtydi90kPhuBx|&R)8$A z45eng&SaLeQ;9pd3?^MDvGxTC87dQW-Q)seQbGEElWg4oSZ9Al#R{jfw?sZac|$tO zu%Wk9iQhR9M~T6C0~0^QmZ^fEda$Cr7WHJ&w&IRQrfqqeE}pG)&78b?sXV+MQ+df$ zn_X?+)Syjig(F@CWMH$xzH%%Qm9=3Em9nC~(PNP1PO)WUWz$Hi-cI#OtS@uxQ&Ts# z)-6NxosRv(OqI5$PnZchKjzx8b+qYL*3_QBRylU;i$<}vY*T07?g3p%;b?V@&=eugYXs@T$rN_{gTmSupQ5+&0BvJ&2bjyt^?1%R%NgZ3Gu%GgH|U zSw7Vii_sL3cX+e$iS4+9&4dm6waZUQwyR1ZDv`R1sI9=Raodkz| zhbc|b>?`NE9<%IbH&rm*x$h_>TutJzxgEil_3B3NSW$=Fqv}pFj>mMl`fuOu3BI~J zi2jJ#>HQ@oVeSF!+qeBcyfV7(`i@{+`0mk*D3+7M$Gx}wKWGl>WWW*@p0AahEe3ed z0SqKC41nxT5E3?yKA;lR4ThtVNq!$+a6bemN0?_IenmQjgfa3X(Vc?c7$T8Sbsc51 z-dOU>cUU%D3Ll^9%~rLz0D7~;zOZESZjgtCvO07rtwrTHAfa5Gn6|p|@e+Y@)B7YE z5s47pFrVtpgUX5O3l9pfRZQB=l;|$hr#ooPZYtlX%V%RV z+IGBJ=Yi7X@he+CE|UkL+oHuRT6K!xtfS@aHt#!=-QJU*t20|0U*=p@i4*Ba;##aX z(F&X2I(DBblZVG7V4JkuUQ}vOy2#)||7Q5Mbfp8sb4r&2{^y1WPB}sn4+Y|mZEFVn zUd@&%4I*C6(|q9_xH(SIAev{URQ~e8t(~JgD`O`-CgzE9lLhK(ipNyQb3y$ukYrhU zGQ7M%`iPfLrMXMM#-T)x>DVEkXb033cvMyw!#^bq;Cho+5EX=T5Fn^U^Y|d@#t44T zH;MVSC;sCqums<*%=~8{?0oS+L|j-gNG$-OMyJBWgGfb)MG|o1bRh37cZCo$D}7vd zE|Q5Sposjajol>=I$xrs1y1%;Y6Ki1xmyd?^7oV%Xy(iO?H&Z71wTNL>^A{K1Y9nj z_oI}(5s0|D;Pk!4t|$Z)K`?)Uxl}wUr{G6G*Xn){E86**%4JX_unj%cB;bH5X5|Bq z1P=&+a4DN~2cqCJMXc{qN`zn$%S>ovgL*@e=v@HFd7)IocY;tq-9Vn!3jPM4{Z+>a z=srgB&xMQJx1aqA^X2-tAiI24)9wP)Tv8ZlWSt6dz$jE)EJO)FRT-a?>!S9q@q;h| zaa*@^Wg3ZidQw$&2v*T|G;_Ug=K>^V0QqKfN^x2QY&vy7-2*68P{_EgW0~HMz+)A? z$ggrqDunowZ85_hwOlZk3YY%F^QCI5Z;wLz9W@E6e2Rg@X1|VA*d2lLy~+)A%s73! zg)ff-0``C?0Qmw?kOm|(2!xRnsJp}QX-zLeb_?%^pfNgThdURG2cshd(L~_T1e~9^ zZ+<(Mz}a0GiwB=-rlybPCx(IuMAfaa0;B^`E=V-U?k>wjBQg7A52&n2C0;-&w1>n~ z-w*#y&Gkzjm;9A(@W%wuEz<0ufj1;q{@x=(Z6{weK-(sU}<+Yotq3-ti-k9Sz0kktU(q$DuHzWGv zBXuW(omQ=7YV41H$T7-oE~Zr=v`}3+3ctpE7jYc zZzVl>7VGn2FqQH~?hQLp^Wohs6-in_=gpgy2MhDJZ18L}KDRH0E-0D~X&6f*q5iMS z|Nf;s?o^GG5-5I`%G(caqzW-mZ9;NlQ7drpL*_~<@aj-EOCfCJs}-pQnM`(7Wu=kK z)$Q|b6=ik9nY87FZ0c2C*9~YeCxemz#c|+IWVAEI@d)v+k}lAR;-{1GFCF-op6W}W zzXs(%^BoLiB5LC^lM=kII@kXo8FOY*QuHthkc`oP2#9i}QC(r9iHI*y41%@pF=uqK z?8y{y-h3w402wQiy#|yDRe@3=F9M6haf9hZF;N*?l{{yKX12bo>1m+rM4G6Siuk%z z%Qf5oPxGm7T^?L!L#V#Kt2jRya$4bPnIu#FUBx4smyhEmaS;Mri}apc=1r1j#de!| zazP_1*DqmJHm2#q{LnV%rPq}W!FIw_sg!UneKv#SSs&@&EDNNe5&8>LIVVk`7%mw2 zw7=dN?+rdNj=?(Y*-L-45FKUM?47+W(s|*E2*d02>euy+_vS4>f8HM>P}jP$q=n$Dg6$qC=FbrRX3{1@4yfq%xw8Lu>hvb)(H zn;T{Mp-h{Q;#Awsa!6^#W<^!g=4NGW{|VDpRl}6+R&~pZime)*&Bd+TU5L!DYWoQ6 zUeyiIRld6OnD1#7#xS{FuNPai)pp}dkg`KlqRl>Y!ze78W9>?0rDV%Ou0l=Qi%_)g z_R&r>@wWA2UADVhQB8)Fp*!#1Oh!-z1=Cmw>Sd zYXCPY{*;4f^d;&ww$n1{K!FZge@4iNR{}Pg9&rJmZ*YR z-k_lC`@s%i2@kg{$5Q0ByvXyNfBzysj{JDJ%rmxaqbk_RsV-cI<-@CKRdoqe&OYTH z1j1tFp6$+)&q6zGZ^>_>cB5VYxI>tX1^4gaZJbEAkwPtd;YY|7F5?vNRkZ@nZsFOKu)(F zzg_rjXe|bZI2sD`DsQ)i_I85Ga3DHpcHm^*BA~6r$@i+d366V{)E@6xILqqP2TR2E z3`Q2%>wN?SMeFq_T~47K*#Sg%wIw(g-tAV0PO8fRZd^F2fkrWhgv)nNGdkOK;#WeJcGHXXlKGa2K@Ns5$k$Vzi z1NV(7>fhIjWR4^k_L=ocy>Dxc!AT)>qoK8uQ;>sw?Y)6!N=L}hSLw|ao2(~~Bo66O zFN{m}lzM?0<}D?;2}-EFRDg+BE^VfZWqPNogs(9}=$THX3p%ptD&_h^PiNKGZu14Q zw;s(HP4(%o&0l_6Z5@77=VEZ^Qp&udb0X?5W1j^ovDh(<58hkH$+_`r4eoik@}M_+ zGFA*kie6C2FViU#Z@UO2(KQz9vtLAsQ7$VK*^h?RkWaZ-eBhyTx1x2-_6m;`FDt`9 z*znt%Joh&g?R2l?_{aHy?bn(;j@87b>itN`%2m^to+RSDwsg!cdcgE9Xhl7)Lj6-Z z8+Y1eQxA=dscc5=yFQPz5qNc+NSAIyyzkYOa+E8^FsqFbbr8kBaB<1rq~n%ry{2@K zuWv!k)cpQx&*4}tk<^R%M1~%mP29}h$Q&G`51OsIn&sBQ#;B@30!pE{mDu}s8of5d z!zAv>1>h1&l}7_&xf+m82@~5BY|yE$I8Z0iKwQU8jl{6q zkAL)Rwhl)(Ub?asFGK&%)K1gPnzh^wtx-zYsgfK#Hm{=0VGIA!YG0lkoYl-zBADBH z!^MTQG?nwWUFw=<8>`fu%N_-Lcog(jugLGo3yjx{ z(eks2m(#n7NR;1cVPWZ$QYpIcv3t_^#C!^6_Suw(2mhl>C0nmeN7t$`-_?tEGUboR zwQ@gVZw;5GwjeZ^*;K+ddE2;bN-WYYv?5TPG3k(&;c}5H%d4*o!KG|SUuw4eaH8I! zx&ld{hcSu6a;az6cF%f6VT8B&nR_6N$8#IXJpPF*eDvjUH}z%s-o;H`J7hBPUD6`a z<7(<`By!hNhFi~M?8K~vTvrrPP4l_yDEc~cR&T;d;V7OU_co73&SPgY?m30$?0KF; zc8*9wPxB5v5P5GJ`_s=Xpdoq%BYZXv8o%C;tWf!w1J$IR_}P=)DK>*v#T#%RXX_Ua zURhBoJDX0wU!hFPsU#fUA&?YajyripcUQo1Py9x^E$IU90|9aiI=E+p%AKu(akj3x zmyT}OiV(&4#lFqSy*Mw>|Gd;f)Ebc`f1Idxe%xSwk0(lRNc&#f6b7N2X~}^fk<43O zQjdM>tyyn{I+IKIwGe2kE z$Vz)%`+P;9exSaRBMSK=`Eg?48?MhMhZ`Gv=pSw_zGU}09y0O|yY1RD1S{Oo<9P3I zn&MW-jm@Qq=1ym&8kfXi0Umr8c=aae_!8=9_BR=W03UeX~yCECqZXM<-8|KXr<^lnSm3rdi z>-f{NB~F33oWjG?!y{V25mOR`F=HWA@ixtut}sul=7E*mc$5gzLhaJQ+=~%;L||@? z$b9X{LfObNuSgvtk+cV%)%`5tcy^&);l#>OP1;f6Es;JAA;fz@PaE~7EuAy={gzWS z^4xg$31I97!bGtmFUN-sBgcp_#9Wb$8Cee<^9mbU535M_MV^*dm5pNJh+XB6C3XsL zBjO~$2C8n~BuM^q>GALNM}Krz(A@ldY2|N%$iIsq0^M=__!|IFQykD$pmYWV5wa%; z4t|%i))+*9fR7G{s8e-g!r(Eei;cpGBanr|kA|C>N<~YBgD9V<6h6cRSmDT{2_=0g zWKOks{4`==DX>CfEXW`$@f77qifFJCp7CKr`vi8}xRM+$Dgs?Duj zDhL}!n}JCse;lz0fYYhgprta{!QQ!3y)_ ziensD3NT-GV=Qkr&4isu7^lSO-6msCec{gpwSOn4|vWizksInC8rr$iVh| zfBF23@Hb=V&oYLflk30EBn~>De%~bS_e(9m;)e#k*r|!xc>^`z^gk6*hF+TO+YkPk zkJCAYlrzV&|F;!Vp8fYKq@*_XrpxEI1mjredKYHG)ap=YS;fkghC4AiTV`4WG0eEL_5vQwXuc%XX#!ek$|(1P5vgqZyv6{N6%10?e4>OE**I9%^E%%@UY@^{QUktP2L3`Rm00?;g1Yn| z1x2qg+eVdE9EL@*vm+y^^m;TUdORMeyYMlqot?{Gx1cYlxatNPR?xH zlCEL+y`DiELVGkvUhvwh|M zb!Y!)a|AHRX#t-$EdC>wfq$Ts$|Fc+of0JIypn$fUzb59Dz${+T6kuOb#VlV?nV(T z<=nbBya9EU#pX z+^DVU+}tWHTt2od?q(BOuOF6aXOte2M`Nw3zavON&vD7WR zk}jq8S1t2=@^-DS4pDEnwaok4x2*DM+-_~IczUA|X55awx)QePcFX%?U*;Z|dr|D& zA1&K&*B|k*)Rs-zMyuZGv_#vyjrO$ib^kIKX=M+_t#+=E8bM-i@cEhKHzwMz496c2 z1YmABPeeP_M8gW`I`y1**1elAMk^0bt_T>zN<_g^FoFM|R^j&x=b4^Ax;|ugQ9Kxg z&P1ay`BO2UcmKz!ZGd+n8=zVy zgiaz>5Q?e;!HLG41FSK)bg>JgWNZ_P5_JU`i^E({%?n|$+8||DEOoJqN;kgRa&q^Q;XREArp|{SP|B{B+c*om*4?1qz`$&>K7TV?K3v{s-k(xC`V`Gx1ctAq0$H z4LhI@Zv@=KpE6MWvV6Mz8NM0w@A1thtbfWkYeWI~W&m{3ku2-Z*7O~doWw?(f5tas zratAH&4$I`Mp?WfT3fD4c_+a@OuS+lk$&OU&dkxW^+3kkRP+49<;^LukzMlh=JIP# z6P=4DhTbu(6chVJ`RQu6Xh!!3_PXEPb$JjEn=a{w`G&@Lql!ZGN<_|aU!$m2)CoM9 zv(V!1>VqqU7pCb)(>S&65pGV44831{Sw=2&@aoy;-pK>PfCmO4Spnu5yxA5ua;X}@ z);W`eK?4E|TIzVZ|5nG{Kd^lM&;S&`N*2p2^K4+IXhxLd$Q!rWlw~MIFiK~~G6j?u zhWgl+LgZ~K%Bm``NG!^dQ*|p-vR&kDYhdBenXI@0QTgZ7&Rf8*&q$eP&J^$g-NC0O zwJLypG%Y%rAecynx;F#^TeV}L)=WGEl_Kc7{PU+n@0Sih^Y35!1$1bgRuTSIpU9k7 zpeFvw_U=mx@F(BzkG{yi`c(f=z=IS4>=@+V9BbvXWfKZxA~6A-`X$p-OA3L|XZ*D^ zpkP9Fa>a=FHF+{7l^%P6wG!dKQYyrIWkxX$1RD+6!a>eNDakd}V z3s(l>H6$}>22)C=YmDzjVkqGCL=n`l|*NVH_cC^1UTVzCW@3Z$?Wnu}6$M^2-;V|}LNum(y$4j7q z$ipdvU@*1wgBTfFjDz6~l_k&-V%^fMvBHsHyewlL5Zvk^qkDFh_A{?)?~GR|7tykcbHxcd?Z|7q?i~Hm^(< zvROd@d%|QcOBOr5q_aR9xuryYIAc^oVtBk#(q&3pB}-Mefg6jyrjZm&iBHNZdt1{E z09#mQZGw>;Tc&DsxB_s!LM=0<>a1{>x1+ZF8DBwO`Se-(-#tRQ-9GoC@OD)wN4NnIUFUAd|^9UnGjv?1tI$v5S#g#S6Qg{iwPSjHJ&+Xeh6iG0}l)IdA-nS z2FX$p;wm)<7aTS!)4Eyp-}YV}M>mfac)-to?Fwhss5HsJtHQB~*ebUs*#7ul8PLm3 zlax>w`h#xz!pegweNT+UQC#e8_ghrS4u`YWWz~msmiK%D$FB!d?zF&M|CABdGW^Np zfhhHf5O*Zkj{T)*p5q+ec<@_;qC5MA#qU=l;5xCNCTk5hJ;i|4tgNw0V6F+v%|hew z##PvI?!%MR7tE~S#!PT@An9|CDi^Xp+HSd5VT?{Wk!kmG$^U~vOU~76g2mfGnIG>C z8qIaw8hKRNn`JE2KI(7A#ZI^LOzrb#661j1ZVMw^Uda*T2nI)w|5IQ4_TILWn%bJn zhVj|2jpjamwrR&Oe#Wtdc_iv4>Rj^5v9$;F;|?w7XO7*#`iPsoR7Ht)@Liz;MEQQZo$AA5m%5X9QUx=|Hli-J^W4gt?WSdH2OlXv-x875w zeR7I!-NgFP-`~&IrXq0Y`ixZa$^B2Q7>+JzX2%1NW-eGxKU?zvCoi{_3~5IvzQpXM zV-MLrT9->2+2OIs4`oRw>wMF3mEqCzxu{}yTy0?1u#7AN#;bSCSfdM;omy&-TOU%J zs+FwDxXbNqV2X3jtgeeDcf#c+q}^S`gp-dbUn3s(o)dae!iS$y;2p{FkVcR7#yb(T z662(7p8WX+Zw@%0#56?Z8I8s1PNTIO{_F4&%$K~etjf(j_PAeOEtR{bp~H>DhD=ZY zX#M047rC-uo}3OpT6vcz>ux^cHHh1C_XYzm7bKG>|s$7OOq9IlWAzP|ej?Ucp4H-b*~`aEP6bMOg{+ zEnT$s)3$d5#K4|InpsJX5%<~{*wDV@>fO*2 z< zaIzQ^lKf;o#ohq7tFg?y;2<6Di4wKzhbGOzv<=@HV_U71GN^|6VZTBSf%A@(u=Hak z^ScHJ6=5X<(uiS;z8EfJgB@_WJJDrMx8+YTJ5_Hb!C$mLNSI4SP|~B8T(hy+1*Z5H<6oiEv1u z0Y7Z|e0WyKVz82@4`MDRFGTW_jcVH5L=l~Pg*5A?2qA99uGtHfns<*82NtJVhTUt9 zE{aqq_l@0cv@CvTdwHpwsU_H^Z<}H6i@pr1V9G%pm60orcyBI=vDS8Y9^19`L7RO+;~!|m?~^X z(2-HkAQQ;WC@~N|VR^qqrihC-et%=40yba%ITHvz7?)SY2SFjBayHVeck^S#A&XWu z|5BR>Goi)v)-&Mv?S*>*=kT=T=+w;J?H9=|1hTa3J$YzKtA>ca{6^xjqR5qJ&zfBy zwwGQ_-1*?L+&@Kep_ebi*+XYmNyYS9#|QVFJ_TYgk8IBOyOX{#%rvno-r_I(kqnir z^#bEd4kC?XU9RpdaA( zF%-W)7=IZ<@zXH)(ShHu-uwz21Ns!FG4po;?vEDWeg(V&Ov^v|e$cmm8R#gWLwT^m zUud;oOSUEw!RTb7iv015QlaRCOy#nGN=FE(qy(N^U15I$F+QwvYhrO<0{ewKJm*0K ze-bqTy_x?UY62R|zl@rI`sX4Mm7nwXH#UcSqWtW!nx$=J+!RAg-cRJssh4<(*Hl#7v;IMJZc3quGp?oa6K0Bf zX$Rd)c0uUsSur{B4RUkv4xXA-q&zq3DXA~1qpOPT-s^Sm6dBHVFY$sr=P8ZexU15` zsppzn^Eg7Do6o$b_M=hXZohw0dpk|asI5vZOS^=;y6q;@&Ex)Uwdgp_Cg~F=n3e?t zcmnJHPFR9fpb$fyWIimqymdk_Q-O7U6jLCi5RW)>y$GKZm9Zp2P#01vNzN3IAK}8Z zT7t)jY9n?Aq=tsiUxvT@bTWq?zykSzoPeAXguHO-g)OU`pA?MnTX9=PcwMUSJ|O7C zS3FQ>DjrF4CFo{2N3m=ykx(p)z>{M6MDlBxH@y=q6hV9zB>UQ`Rzq0?uFJ1vu`E>L zrL5lEl$$6Wk7SA=e;(mhGMS^U_vA5&2IDkDxi^T68GlRp&b2fp5!C%k-DZWx(4oOe z`|Iu3yD@nmX>AzX^<8>$aD3TOvA_^6PdXj1ZuxdZ%;DoKysh!>z}J?d_UY``%JpEb z^Xa=Y>9+b^{y^4FxC}&V@xICGei;em12Rw0FDV3 zcxHg}$$-tE40wB=2Uh%aTKf$maoSzQgZuyhRoEMdgiZa;!tke){d&MsUqO~YYU%R2uOP{XHXBfUOE}Z#*76B50x{H%ZPZ&BeNj3u~ zbwId0-d7h+=#NBzADyWyvO$$P;`7CzjQ=1&UIoy+gynCEUlNN%WY>Mn?`-xU76Thq zAL6w5oo>O^e{S7qDjkW6!sQ0xr0R{p#qhXT4p=vaqrwEJw{o3>18RPIfOC)iCoNUK z3_{bd@IQ1Ej!Ru)h`^4H=afkeh(WTUi`7BrKV5qWmMQRti2Q~5aSCA~FN&)Q6Lo>Y zlUX#{CS>bhNT*|Iy>N?23RKGDR*~692`n7Rl7zz>vZ*g0PnAm}e@-+BkwL}^pX;kQ zDAy{}PjMV#YT8h*HyRfeu}i9+`$x$Dpz`A#g$V`~mKv9Yz!(WD&g}N~hbl-IvIx|f zBByYhriQmz${{Ln`eRmmHOP$f=_C$AbnDi$D~&uID&1-|qNNVF z%mzTcR0K%gi8owEFT~{C?7V6EXe3YCC6*!Q#>lIM=F2Z$AJwlt8d(e8q-B5m@o+yC zL;bmdioe~l|8{TZwS&($O3d#!X$RC`@ITdnFKpBdB>9w<5R5Lvumr}_v|b7!`p@d+ z%B^As?Bq)&1ThtW^KW62fC?qK1|ji*1ew4{pOi~jwyxlQBq5SV6+d=>bkz5l*cg!izd-a9Iz#+u$%H;9 zu>Jab|MmC}?7x2c8leYbfa&wsggw7xIzB+IbDG_qK(o8rMKOA0z~^?LwxBocv~Jdd zRe&1_$aOx`=2+?>qXclD#$$!zN$3hV`w*A4`w^^UKC2L?Qt<@&hikzuk_GelQpZjWiILXr3IrXUVzg3R*jo8ruglBsg> z%9@ZzQ{{vCX4_A46fSQWf>ouL6(7C3F)4 zqZYs8QWr)0klk_hb|(Co1S?vA@8h+YU?Da_Ke7XZsia$_d=DF`pH8*8U%5I11|gBsCBFxNQi1X;rW5NNru`8JgpvAQ&L(1C z5cXfzK*O(lO?V=lFKQy_U)4nZVGTS}6Iqo=L?-qZ&fqBNPvc)3wsi9 zRZ7p(K@6cm`p2=R(3`UOmP-DE^L9KS`UXdeD#f5|DiMi|D+rX*3lhU{v2mmr&ZmEl z-_k#7Xe#;zr7oO)ic*KAAOYa&1-*e-Db_TQ^CXfVy$k65c>ZaZg@`XB=9l_~YMSua z1?Km|VTp*0H@HeAGMHR#iv`}S4P~(U&as56m8qn_ny7-~IX8wP731XZt|v20lp-b@ z<_sRtAS2S-7k(s3HJz?Ezwd)kd06!{TE(^B&)36IzTNHZ=JQ9*|IjZqe5}om45Jvf zSb_=&hIYqYGBVWBaWRXgq-NiLroP`hxi82t&`L$034ChMcU3bXt| zMBs@3;0J0o#6srYn2e9S3oAps5?YXpdtC!4?(`j>ReX(iXzm7|jQ9&VKNy=Ec|;zO zb^AE()k2c_4bgS$JgLAbb-`Wskq?shi}RE}GHRx1dy%yyo1i*MYiRZfgc0j)^GYw7 z+Grrph1}PnDF}}C(>4gBNwxkj*53h)>{sO~%1f48dn?LNyKE~Q6PW-vmEu8p<|_Lp zUFOQ_rt+=o`sGZ!ibfpfs?2*&+BU0ha501GyHiQd&Dg(LFYta_Q{Vw6Qz6GvR|p27 z;4|^PeDP4C6ypvr=fdt-tShG3{7x&9fg~uliYQ`cXHz#ce8~X)w6mQV3v@U@jqFiS zd9W2t?^bB^iQ7$|k)2Mb8d;U*f=h z!GchM`?>)9H!(6OpetA&3-vb_hHn*@Gdp^WKfKwKjlg0gM>ht+UyWx{YdYQR-A`jS zY3j>RrAJQ1CWa3XQ&}GZxL$MmgUN+3#ZtbG;EH`}cw~v9CmorM<`+_#KUYCUgJqVlj+BTEt}GFrcaOWlWBNv%`x60*MG)o4qC#B2<90j6j%?tpCP2x z8E@6MK6QnAA&bmn;Ix5sg4d?@i=1A_BA^-lU$WWT02m*LOzZhzg3T4oa3*o=LLr7h zvm$whF^1wq!3wh?Jn2XqP?n)BV_B?6=1OT&=rLn#B3(s!g@_D^O=(R9?0NEsG7xBg z3Z4!PJUvhp(CIkkC-R@>*vQ6V;uv zDgN34$1#r!WR(XL-`<#^C6gzyWPIs>&nqtPm4qfsC-M`^LlxhW=+<=l=tpVgfeyH! zo7~khvI5oTgOd@Hr5sV#+wz(lT2-cxDx`h*Ud=Q*J^lPx-YpEL$Rlj-d3W0D=bfJI zgMPY~Z#?hvO<~ZqPjg#-3Rpiw8vwk?VSm=Fuv-88p@n^IPWpR9ddygy2=_w4WV`Oyo zj~K)7EFw@|8U}slO(Sw!c!+4Cj!RBNb}N^0GTjId)vF-v7Oyo~(7{IYqCsIuxaln- z!88N!y_oa~N0wN6(@4~vtCInuG6?4Jas_mF3F@37n#zK_8>>l*lMhrB)HP>SE+~<4 zmZaz>PV{1newye>|H`wl%z)!<7|n9(*TDjP`NGg}`RNz_r327Y{k^v)_B;OTd+Q&) z_E_aCBT2*xHqtS{~koav$(t`((iA#Op2>i>IM6D~m!&$WR7DCuOE9tQm*WG+G>$J=0k=|xM zOLOXeTzPqJ{?!rFc4~!L*3NU??Y{Op6HT_7QH#x_z!(>$<91KO8D0l@3?V-cSF#py zuX>Bv!$#XT(bIHB+GHk26M^)q&xiCpT<_t+TzWU_+S1(%zZ7byI}(Gh<%_`jE=P6| z0V&Ahx%hjXTNtr)3js#>)|8>dqB3*A$aFJ#hS&lOSvEAPhgsfn76T>*tS$^DS0fNo zjl)SB)2Jn95Hu$ZaeW9gBe+7>7K5eV6wime@(WpUbKkyvDRLiS_KDFRm5z~#5*=9E zNsfSSQ33TBvDk45rfb3Dtxkk)$Wb6j?8}}CnvJ9$l1z9dToR8%;0@}Ny<^^&M0Z(UO2B1FGLD+6Gnp}=ND+i*wLBp(ZaI>} z;l6`6Q2$~uS2m(En!$}hxmX5?E<}FPYO?5xs{{hm!RA!FN(xg9alPGGo|0awduFPo zUIRt1ss>|I&1k#!-9ZE5X*SI|-Ia>xXwB?TTd!}4-f#D)HL6#DV<(^WV$>TDKhVvM zPG>P1&Kk4LLFHn!F1>le6?#N)TPKAlIEZZPkZT)qjWko~q3`m``L6CJbfug8dn*G; z%tpf30^bgU%9bpmtl5&<}Ryy?{;OF=QUlv zm-nk}f(@@swayou9IfF8Wa1OeyXH(zWoi`i($3m~BajS&!iLi3v|8op7QKpMUQ&dj zYEDf$gos#Y1QR%3HnF$hY{{}pFleFB=g9RkblI{Q& z&_or9@}W&5+lCosYKbs(Bp)y`4s|#(Ewc=IS6A1=WET9UXR`Hl{b`pp2HhgKtR4q( zBh(ZlQxz#^;Ggazc)C>bp*w2tw7ZApl`Aq7=qh`8SruCP3MptTU<>C zO>k_=xz6p&|MQ*O0KV4Ve0fTMJ|0f)Q(Oqcp-WQ~i-TfQAj8DDUXZLAXtW#KT2qFxFI!;|-ZzLYQX|(okzIY^|2zfR{xiB#R z^qVw_+P5L-paAsA4yMW8Qr2PcUF)1vOa#bVK_If{9aQUdSk@jRN((YJ>=ZT{CkIg<-v#l zf9&x2fs%KE{6+bM0vRq;nj#^000EKya$}Ke89)y@v1eJ2BFg{Rjt<+NJqdD zvhnb%n*S#6@}>6X@YS0EJ{?<(5)QCNL1f^MU+NA;B?MU10MH^5nGBdwIJYwrVGC2$>uN{elRtKLd6-} z6?^L#(J;;7MsT0|WwK$8_bQ2(3tTOk$;?MKS@Nzw$ao?+lseIzH}Wdi@1qJtqy&*{ z)3sT5znE4jWP#lC@fhLWgGr-=D+?zeM26E=?|JdNzUPlN4L|)TKRxiT{#rkZh@V~@df@c?e&vh& zE$aIhMScIHpYu;%{CoiXt>OBM{T?qBv9qnlpM3d08n6Frr#k)ef75>c3heBE?Nj|I zPJTMCL+|SR$Njt5_xr`ZpT5bT9)P~$(>k}oZ*^|ut_X2@piHI?2*rvAUO>T#W~f^R z>Sf$?6AWVo58^N{TNd-jn_rE-c)gS*LWQa?m|d=i$GeVtDCOb}-RN~Ls_W@2zWw(6 zNd+URQn#2UZE!c96i9~z!FxBDOqPpjnN|<-u0AR-lJ;oyX`~-dqUer%o_3ml8`rX7PO*AIn?M?9}5YAs^uQhf=x7PAB6Bs8kD95wUIPBQUro9kbW z0Nr@c(7{YuwL8MuGrozm5ywJ+U=c%R)2S2vd!VW4dO5j;nt?3w+>0; zr8}An+Uuc5@uwOBF9${%&Q|yD32#olI=thYMtg- zd%kM@qtJ)G{(oI{7W$cgy*m4Coc*0YoeE@%{P{8`=!*~@^h5l5SsVJZ)9Uqk;brr% z#9$;0SZ!o6s@_0U3~GA_m`XYdifJ$TQ$%(i@CUuL%?xOvOV8af9sN zW0^b*!$2VyW>lpL2sl?l9U?aic2{Skq^nfuuWm)*0 z3vg%=*e(0gM++XrQj&(=WKgA)iM#}(uW$1Yh38u!8xSGztqpWTrd<6CFnk^~_V6GS8LElLH$5#oS}oK3o8@Y!Lt2e4@#B+*>YJ&zeapSp#C z(qYc3fUrNR0%D(50fo4@@?XTK&km3 zgsebc`ai`q0-e{>GV)nz_Scz6(7^hu=(iu>N3jUtyOdGHf$@XG;6(QVpy3c)7?X+rsPNi=HsPy~isr1I*sPui26kM^2+N=)~NZ2W=Dre35 zhvi3dTTr-n*HhwVbJ?n$dBqXSAN45l&#l@AH3~2ffAaR!!HN-4Z9@6T-m`Qg>V^!P zSgTWxg`LMRG9|rc2d*F+b}}uCGK&(!yD=5Uv=tDxz2t%(+!cL+~;Ld2C?P_%MgJ(^yIlDy$1O`(T9cw#nD33>=sIgpkQ;s3#b{vs}%szhyyF~o_oEk5a(9pM~J!kgVIY`s^G{wG?R(^S*XdVVs`3P zV)Qk5AD+l5mEa9wKHD3kc^D&5DKl||S2L3%%|wGHd1cnc{z!90vn>2VSRcw| zD)n|Xgv@Owot4!X4*F15AJ6r%nwv4p)h(?JDi38wdWO*3SOe}6-HP?!Hn%cQfyY+s z|J258m*0ePc>e>j?RMc+0aC3j9VVwoS?{>=j%TWLU+A-&^@%z!?v;wshn-MdH}vv) zYg64jbu*Xmcz<;ziN4dIMv5Qr3I=hyJfeTiFj6XHL~t{KR2(XFKld`_R%7sl{T5;xgt zAduxNm!UHxD~Tvk&@xTN(`@xCAxe^+wXsb0JoGNp^0dUWPLUp@VaUF?XGxo+aMWa7 zq=&$$Z6Jlpm!3*3(nM42_QVaxMEi-krCu^$zp`g;$#jZUc_#!bz&|HF^`(F1;Bm2G z^;`*A#Kx>lUgdPR%))Ky*|e@L+|dw%5l!}f%*wKpV7t*|vu zsX9q^ww5A^1&C@r@M&!Qt-&q}LWCMuIpb8mu`A9z;h=hy_weVby4R z_FmaUF-(aGP{HP2x=)6SGIcRC$zm*8Oszs)*XdG!m_p7+^tN64?s9}HZSeAwv}z!Y zKuoZpdzn@UVx>=YMruKKCDLT7{`z5cSDVuUmz&(# zRqBtCIn2IEuSY5;-jfw+w!m%l5=K0)`S^KH$12a~ErKkL&j~GLF_66VDvp*MmGnXY z7WqVeh_EyRRj8cCOnm5(&ibOq{vM%2M!tMI4;hSK5! zYbO4tRN=YTkI1Z-<;ZE7-A#?2bWS0GP`I8R6UoXrh^U0|JUAi2Q-ys@0XBZ zLWv1YP(VV_B%ltm5BW}dH^`AzYNIqI(Eg@tKJ^41}8O5vIfOa%=nsX(*PhNWwmA=jGb z-n=jQewlJ;WxS3GO57v!fe$l5 ztR&^^wKDJWR4s)CIw#gWJh#R8p7i^}x`FM*&(@w@ab08OwN1XisLsz?-+welW!=?t zyYF{ZL8TuL+IhTso_%->5)%JkB#Sw?d^PhKi9cHgtbf8CW^Zc8qID624! zXjWFr%vf;Jq`oz8$)RhZyQ=%Hba-5wvgeO2Vdu?`^}xc!%4cS*Bya|&$8Ofr%nR#T z`CDGB+IqJu*82}eOj|zdAgePZGBzkP=I5FU?_~iguP}?Wv4g5EcTJsK;-4XLDoMuJ zzLhqHrAvZ^%b1;O=w?H-NhiCk@P_Y9Gq!;%EY?(dv~#h22E*CaD2J%UTGZ0x z;;=kJ{_;`}Rr?P60PkILOIMtx`R($FHJ#}mxWWJ7iVXqs{t0XEM&<{u+h^C8&xi^L zDoFMk+Gu_Z&O0`|0I;?46W*Nn6+X!{09<*H+3=l$Albd?~(0FQ$XWQyUfbe*fmjp7PC?d4)TPatE97ww-iYx#+&=9jl6 zH*wE#>F4@G`UER0p|?hXCKOHhu{tYyZpf?G;J z#bC7j@yC}vmue)JcK8NSYA-FYh^HFWFNrzMln-T_>+^f}nYc%kVJuowG>uaPUIo94j zVw#&W{`$Rb?adjTp%S)+UE5sWmvqscEe%)3t7Wjf87hC4Hs*iIp}`!1I6wUbcHaTl z^NAo#>lafJ>~)i{Nag%WsX5+T2-VAq-`PAY4y8GheS^nOn9UWx?1 zWPfp6A!oOPRB15th`641X<4>lE>~+fV+3NZM>cnhO;L@gM0Z=$#4sU5gqqst?o@4X z*vC#;vmp{d3kpxSC7;^WK!?j3%zfRi)|enJyPTT!qO&dujx?j1?C>Kpr|Fx$W0SDW zlv$F33Vy~wA|M6=LIDH{*!YB`PC|m0NIHN(e17BTDF84@Vg@EjzCyVQ$x@7wOaN!H z9$t&_Qh<%{FcI!_f~n-cBJOm>Q!+c>K{*izHo)Cv7p4-r?xWJgEjY}~<;(HRU4$xp zYL4w2Uv`#zHol}ds-Fi)Z3|f>i1c(D_6`t{!228|*Q{592?gua>$Z-A zNqQY%lYE*ggrxri9yKNYrkWcpjMviq92Nu|wPU@_qPsYlCzbn5Xc9O0Ej44(f&8I(SBgyHu0$hLp@QG-UKr%!w3(dF`m!|V+Y_PqC$~eQ{Jil zOT8A9uDbU4{QtNW0G1EG0%KB^BS=8AmlmbWtPi z?Yd}dJQ!W{;NaG-c+W^gH)CmnU3Y@>F0kKX5vNr>Y4%BmPqIOpoo|X-uF=(SlfmmM z+hD)I%gedq{Js&&}Kh|z}g{9m1Fo4&HC<7zwdDqj$CaV&!GqH^{1^gGh4A$VFaZ#iW zpSvR3A|9USx4(O#Hw)C1Dw3i6k>H&tKadxcZ>>HRm(MUF1Qk(b9^ndYys~k{7V4$c zf>argV1T;4&2{MX=G&SxXf~e+PbW?WvXXD9lfdiy&sc}}FXQQ-N%E<;^g+XxW5Z%B z;~ZE|>_Bp%dKyZ@3dRMcRuW*cUZIuTu9j4keiY2~MV>7%6C#M53I|^*w9Q=%Y0F}h zyc-gc(guF)aI9r23gW7RlM!S}-U>=)K>0MS7_i=ku?quvn;cl6>@P`>zi9Lu0W7eM z_CP>7n86Qbq@^%=)}IArEFqwPjNIq~GATG0uO38Nw9C#GK;A z;`3r}HrYq`6Z6nGsNoxfN9PMj`cq8^b&onyTo2mbS&o6iiU>872M)&{Un}*#U^dHf zuzyiS=$VE^rp8}zfelLsi_KI)K!|P4ZYtC1w_m?#Y@=gYP0>zAnp$b|H}-@&{pNp~ z>S(ZRvy7hdbe59UN|p8X-G z1vz+c*&qJtd&oY>cxTEXObdCruZnx7t*nB3S9pRyyNj;8p|30c|4}-)nA4jbdi+r@ zNX&|VxF_Oj@WY%Ynsa6A=0}y?8E*+TUD=Ma51)c=E~~iS zkTk0zo1V0$`WG+Pftm-s)8tDp=e`}Nc}Y(UJqi5m$gMp)yLxraYpZnb$un=Jg;&XI z9MCJTb$-IFk#eloIVC^&tX>Pc;w`sQIzII9f&Quk&J`WU9UmW^uKncsnL)~m1E;VT z-mXh**zOULAXri3fqy?CgoMbPO{9P)2xjGhpN1&=L8g9?vflxwy3oX_z$ytgoj?_A zIvL&JKu=U2K7N!1YRpoe?B|`9aex#-b6LChXXYUxuFF4})WMm?b$jwd2VSZ{L@6*{ zN`aX_Vwb)#WYZh*Zg3hc#6~$#+|b)fOG4VrPZ5*f95bG;8Kd!92;ZIrEksmT9=op0 z-&*q#8#R{r0Dpyv;DC=&000jc5T?9_H zulil2C&?^ikg!cu6yE9!AhiehR!M$a<#%BpzeD?65v|qbtLglSPKW`y0Hq@-y-sVal=C5h=O+H0ywN1V@3)_n_y++5q%k^7+vBr<(q&H-u{02KofQEe`ohTzeE)d zSOJp(9{j!ufFqPm+TrzaFiR64mXs%nMyt$~0~%;?NvLGS9jzoXF?OC6%Cpa@pk*g? zid7N90!WQj-^2j8&K8cDwnTi=C1YusI8y6JN;r(J1 z{})$${Kb&^ICzR8u`e%QOanS)#@vR&0-FTXCd6E*zB(foAU;Q1I#U4*VByYI%hPB| z$7|$hJ|{|w{5z8(V6%}7@H3dyMuYCT2@r#k zv0O4R8IFwVMRU8xyW0$gNBi1gKM1 z57R(pK_P(Nbx5G4jJ7+eFPNm3q6VcYNLw_jImZEZibdFCdFOK=c1$k!=&E`Q4jxq( z)DCqohd`m@Kw^&WYeLFvV;ipE4K7N=d`lu`?DhSDTQ%{i1UFX{p8Z#aXMC#@yedTD z*>{F#Lc?&O5B~F>FK7UwSm9e^g>TtMFjl|-L@=|pgGxr}RdUG< zfDYPf9_}K!DP9V08_Et-OG;6lhf~Ds71{69kdGiU3?4YdYq}KA#ktIgiG{jrE<^%# z5)i2Qfjo=Cz$H`V+z&j_D-wejSW?;%7O}zcD3dTm(P1BW3dbY!ZV|>XBqmoIepiZQ z#Bj=9B@GR$oTGV~j&Pa5jnN+$nZv{{6QLsnZy8Yt@wW>h#2?tY~oi_y6uv*2T9MT=En>dxoKfON~)3SSd^3)|?jh$aJ+w zaxwSzMJaW4emWi+zJz(nE>{En5|8qAb2VKq{amGJzTtC(*7sAdU*$H<`u^*y`lLVX YcVDr+aQQfA7SJ{ZPgg&ebxsLQ05i2#p8x;= literal 0 HcmV?d00001 diff --git a/include/apricorn_tree.h b/include/apricorn_tree.h new file mode 100644 index 0000000000..fc9e95b438 --- /dev/null +++ b/include/apricorn_tree.h @@ -0,0 +1,15 @@ +#ifndef GUARD_APRICORN_TREE_H +#define GUARD_APRICORN_TREE_H + +#include "constants/apricorn_tree.h" + +bool8 IsApricornTreePicked(u32 id); +void SetApricornTreePicked(u32 id); + +void DailyResetApricornTrees(void); +void ObjectEventInteractionGetApricornTreeData(void); +void ObjectEventInteractionPickApricornTree(void); +enum ApricornType GetApricornTypeByApricornTreeId(u32 id); +u8 GetApricornCountByApricornTreeId(u32 id); + +#endif //GUARD_APRICORN_TREE_H diff --git a/include/constants/apricorn_tree.h b/include/constants/apricorn_tree.h new file mode 100644 index 0000000000..14b111adbd --- /dev/null +++ b/include/constants/apricorn_tree.h @@ -0,0 +1,90 @@ +#ifndef GUARD_CONSTANTS_APRICORN_TREE_H +#define GUARD_CONSTANTS_APRICORN_TREE_H + +#include "constants/items.h" + +// Apricorn lookup table, added to allow adding new apricorns without being forced to rearrange the item constants. +enum ApricornType +{ + APRICORN_RED = ITEM_RED_APRICORN, + APRICORN_BLUE = ITEM_BLUE_APRICORN, + APRICORN_YELLOW = ITEM_YELLOW_APRICORN, + APRICORN_GREEN = ITEM_GREEN_APRICORN, + APRICORN_PINK = ITEM_PINK_APRICORN, + APRICORN_WHITE = ITEM_WHITE_APRICORN, + APRICORN_BLACK = ITEM_BLACK_APRICORN, + APRICORN_BERRY_CHERI = ITEM_CHERI_BERRY, + APRICORN_BERRY_CHESTO = ITEM_CHESTO_BERRY, + APRICORN_BERRY_PECHA = ITEM_PECHA_BERRY, + APRICORN_BERRY_RAWST = ITEM_RAWST_BERRY, + APRICORN_BERRY_ASPEAR = ITEM_ASPEAR_BERRY, + APRICORN_BERRY_LEPPA = ITEM_LEPPA_BERRY, + APRICORN_BERRY_ORAN = ITEM_ORAN_BERRY, + APRICORN_BERRY_PERSIM = ITEM_PERSIM_BERRY, + APRICORN_BERRY_LUM = ITEM_LUM_BERRY, + APRICORN_BERRY_SITRUS = ITEM_SITRUS_BERRY, + APRICORN_BERRY_FIGY = ITEM_FIGY_BERRY, + APRICORN_BERRY_WIKI = ITEM_WIKI_BERRY, + APRICORN_BERRY_MAGO = ITEM_MAGO_BERRY, + APRICORN_BERRY_AGUAV = ITEM_AGUAV_BERRY, + APRICORN_BERRY_IAPAPA = ITEM_IAPAPA_BERRY, + APRICORN_BERRY_RAZZ = ITEM_RAZZ_BERRY, + APRICORN_BERRY_BLUK = ITEM_BLUK_BERRY, + APRICORN_BERRY_NANAB = ITEM_NANAB_BERRY, + APRICORN_BERRY_WEPEAR = ITEM_WEPEAR_BERRY, + APRICORN_BERRY_PINAP = ITEM_PINAP_BERRY, + APRICORN_BERRY_POMEG = ITEM_POMEG_BERRY, + APRICORN_BERRY_KELPSY = ITEM_KELPSY_BERRY, + APRICORN_BERRY_QUALOT = ITEM_QUALOT_BERRY, + APRICORN_BERRY_HONDEW = ITEM_HONDEW_BERRY, + APRICORN_BERRY_GREPA = ITEM_GREPA_BERRY, + APRICORN_BERRY_TAMATO = ITEM_TAMATO_BERRY, + APRICORN_BERRY_CORNN = ITEM_CORNN_BERRY, + APRICORN_BERRY_MAGOST = ITEM_MAGOST_BERRY, + APRICORN_BERRY_RABUTA = ITEM_RABUTA_BERRY, + APRICORN_BERRY_NOMEL = ITEM_NOMEL_BERRY, + APRICORN_BERRY_SPELON = ITEM_SPELON_BERRY, + APRICORN_BERRY_PAMTRE = ITEM_PAMTRE_BERRY, + APRICORN_BERRY_WATMEL = ITEM_WATMEL_BERRY, + APRICORN_BERRY_DURIN = ITEM_DURIN_BERRY, + APRICORN_BERRY_BELUE = ITEM_BELUE_BERRY, + APRICORN_BERRY_OCCA = ITEM_OCCA_BERRY, + APRICORN_BERRY_PASSHO = ITEM_PASSHO_BERRY, + APRICORN_BERRY_WACAN = ITEM_WACAN_BERRY, + APRICORN_BERRY_RINDO = ITEM_RINDO_BERRY, + APRICORN_BERRY_YACHE = ITEM_YACHE_BERRY, + APRICORN_BERRY_CHOPLE = ITEM_CHOPLE_BERRY, + APRICORN_BERRY_KEBIA = ITEM_KEBIA_BERRY, + APRICORN_BERRY_SHUCA = ITEM_SHUCA_BERRY, + APRICORN_BERRY_COBA = ITEM_COBA_BERRY, + APRICORN_BERRY_PAYAPA = ITEM_PAYAPA_BERRY, + APRICORN_BERRY_TANGA = ITEM_TANGA_BERRY, + APRICORN_BERRY_CHARTI = ITEM_CHARTI_BERRY, + APRICORN_BERRY_KASIB = ITEM_KASIB_BERRY, + APRICORN_BERRY_HABAN = ITEM_HABAN_BERRY, + APRICORN_BERRY_COLBUR = ITEM_COLBUR_BERRY, + APRICORN_BERRY_BABIRI = ITEM_BABIRI_BERRY, + APRICORN_BERRY_CHILAN = ITEM_CHILAN_BERRY, + APRICORN_BERRY_LIECHI = ITEM_LIECHI_BERRY, + APRICORN_BERRY_GANLON = ITEM_GANLON_BERRY, + APRICORN_BERRY_SALAC = ITEM_SALAC_BERRY, + APRICORN_BERRY_PETAYA = ITEM_PETAYA_BERRY, + APRICORN_BERRY_APICOT = ITEM_APICOT_BERRY, + APRICORN_BERRY_LANSAT = ITEM_LANSAT_BERRY, + APRICORN_BERRY_STARF = ITEM_STARF_BERRY, + APRICORN_BERRY_ENIGMA = ITEM_ENIGMA_BERRY, + APRICORN_BERRY_MICLE = ITEM_MICLE_BERRY, + APRICORN_BERRY_CUSTAP = ITEM_CUSTAP_BERRY, + APRICORN_BERRY_JABOCA = ITEM_JABOCA_BERRY, + APRICORN_BERRY_ROWAP = ITEM_ROWAP_BERRY, + APRICORN_BERRY_ROSELI = ITEM_ROSELI_BERRY, + APRICORN_BERRY_KEE = ITEM_KEE_BERRY, + APRICORN_BERRY_MARANGA = ITEM_MARANGA_BERRY, +}; + +// Trees +#define APRICORN_TREE_NONE 0 + +#define APRICORN_TREE_COUNT 0 + +#endif //GUARD_CONSTANTS_APRICORN_TREE_H diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index eacd3b3a2a..c20c2c79c3 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -246,11 +246,12 @@ #define OBJ_EVENT_GFX_POKE_BALL 239 #define OBJ_EVENT_GFX_OW_MON 240 #define OBJ_EVENT_GFX_LIGHT_SPRITE 241 +#define OBJ_EVENT_GFX_APRICORN_TREE 242 // NOTE: The maximum amount of object events has been expanded from 255 to 65535. // Since dynamic graphics ids still require at least 16 free values, the actual limit // is 65519, but even considering follower Pokémon, this should be more than enough :) -#define NUM_OBJ_EVENT_GFX 242 +#define NUM_OBJ_EVENT_GFX 243 // These are dynamic object gfx ids. diff --git a/include/event_object_movement.h b/include/event_object_movement.h index a9d1e61277..4ec46709e3 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -512,4 +512,6 @@ bool8 MovementAction_EmoteX_Step0(struct ObjectEvent *, struct Sprite *); bool8 MovementAction_EmoteDoubleExclamationMark_Step0(struct ObjectEvent *, struct Sprite *); bool8 PlayerIsUnderWaterfall(struct ObjectEvent *objectEvent); +u8 GetObjectEventApricornTreeId(u8 objectEventId); + #endif //GUARD_EVENT_OBJECT_MOVEMENT_H diff --git a/include/global.h b/include/global.h index ff0b6f79e1..3045959808 100644 --- a/include/global.h +++ b/include/global.h @@ -14,6 +14,7 @@ #include "constants/vars.h" #include "constants/species.h" #include "constants/pokedex.h" +#include "constants/apricorn_tree.h" #include "constants/berry.h" #include "constants/maps.h" #include "constants/pokemon.h" @@ -134,6 +135,8 @@ #define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT) #define NUM_TRENDY_SAYING_BYTES ROUND_BITS_TO_BYTES(NUM_TRENDY_SAYINGS) +#define NUM_APRICORN_TREE_BYTES ROUND_BITS_TO_BYTES(APRICORN_TREE_COUNT) + // This produces an error at compile-time if expr is zero. // It looks like file.c:line: size of array `id' is negative #define STATIC_ASSERT(expr, id) typedef char id[(expr) ? 1 : -1]; @@ -252,6 +255,9 @@ struct SaveBlock3 u8 dexNavSearchLevels[NUM_SPECIES]; #endif u8 dexNavChain; +#if APRICORN_TREE_COUNT > 0 + u8 apricornTrees[NUM_APRICORN_TREE_BYTES]; +#endif }; /* max size 1624 bytes */ extern struct SaveBlock3 *gSaveBlock3Ptr; diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index c203065899..a14fd18813 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -612,6 +612,8 @@ $(OBJEVENTGFXDIR)/berry_trees/rowap.4bpp: %.4bpp: %.png $(OBJEVENTGFXDIR)/berry_trees/micle.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 +$(OBJEVENTGFXDIR)/misc/apricorn_tree.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 2 -mheight 2 $(OBJEVENTGFXDIR)/misc/breakable_rock.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 diff --git a/src/apricorn_tree.c b/src/apricorn_tree.c new file mode 100644 index 0000000000..b7784a6a85 --- /dev/null +++ b/src/apricorn_tree.c @@ -0,0 +1,86 @@ +#include "global.h" +#include "apricorn_tree.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "event_scripts.h" +#include "item.h" +#include "random.h" +#include "string_util.h" +#include "data/apricorns.h" + +void DailyResetApricornTrees(void) +{ +#if (APRICORN_TREE_COUNT > 0) + memset(&gSaveBlock3Ptr->apricornTrees[0], 0, NUM_APRICORN_TREE_BYTES); +#endif +} + +void ObjectEventInteractionGetApricornTreeData(void) +{ + u32 id = GetObjectEventApricornTreeId(gSelectedObjectEvent); + gSpecialVar_0x8004 = GetApricornTypeByApricornTreeId(id); + gSpecialVar_0x8005 = GetApricornCountByApricornTreeId(id); + + CopyItemNameHandlePlural(gSpecialVar_0x8004, gStringVar1, gSpecialVar_0x8005); +} + +void ObjectEventInteractionPickApricornTree(void) +{ + u32 id = GetObjectEventApricornTreeId(gSelectedObjectEvent); + enum ApricornType apricorn = GetApricornTypeByApricornTreeId(id); + gSpecialVar_0x8006 = CheckBagHasSpace(apricorn, GetApricornCountByApricornTreeId(id)); + + if (gSpecialVar_0x8006) + { + AddBagItem(apricorn, GetApricornCountByApricornTreeId(id)); + SetApricornTreePicked(id); + } + gSpecialVar_Result = GetItemPocket(apricorn); +} + +enum ApricornType GetApricornTypeByApricornTreeId(u32 id) +{ + if (APRICORN_TREE_COUNT > 0) + return gApricornTrees[id].apricornType; + else + return 0; +} + +u8 GetApricornCountByApricornTreeId(u32 id) +{ + if (IsApricornTreePicked(id)) + return 0; + + if (APRICORN_TREE_COUNT > 0) + { + if (gApricornTrees[id].maximum > gApricornTrees[id].minimum) + return gApricornTrees[id].minimum + Random() % (gApricornTrees[id].maximum - gApricornTrees[id].minimum); + else + return gApricornTrees[id].minimum; + } + else + return 0; +} + +bool8 IsApricornTreePicked(u32 id) +{ + if (id > APRICORN_TREE_COUNT) + return TRUE; + +#if (APRICORN_TREE_COUNT > 0) + return gSaveBlock3Ptr->apricornTrees[id / 8] & (1 << (id % 8)); +#else + return TRUE; +#endif +} + +void SetApricornTreePicked(u32 id) +{ + if (id > APRICORN_TREE_COUNT) + return; + +#if (APRICORN_TREE_COUNT > 0) + u8 *flagByte = &gSaveBlock3Ptr->apricornTrees[id / 8]; + *flagByte = (*flagByte) | (1 << (id % 8)); +#endif +} diff --git a/src/clock.c b/src/clock.c index 142e62ebf2..2440f5b5a6 100644 --- a/src/clock.c +++ b/src/clock.c @@ -13,6 +13,7 @@ #include "tv.h" #include "wallclock.h" #include "constants/form_change_types.h" +#include "apricorn_tree.h" static void UpdatePerDay(struct Time *localTime); static void UpdatePerMinute(struct Time *localTime); @@ -55,6 +56,7 @@ static void UpdatePerDay(struct Time *localTime) SetShoalItemFlag(daysSince); SetRandomLotteryNumber(daysSince); UpdateDaysPassedSinceFormChange(daysSince); + DailyResetApricornTrees(); *days = localTime->days; } } diff --git a/src/data/apricorns.h b/src/data/apricorns.h new file mode 100644 index 0000000000..4f76f30648 --- /dev/null +++ b/src/data/apricorns.h @@ -0,0 +1,18 @@ +struct ApricornTree +{ + u8 minimum; + u8 maximum; + enum ApricornType apricornType; +}; + +const struct ApricornTree gApricornTrees[APRICORN_TREE_COUNT] = +{ + #if APRICORN_TREE_COUNT > 0 + [APRICORN_TREE_NONE] = + { + .minimum = 1, + .maximum = 1, + .apricornType = APRICORN_RED, + }, + #endif +}; diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index e3d2c674ad..424d4224f3 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -465,3 +465,5 @@ const u16 gObjectEventPal_StrangeBall[] = INCBIN_U16("graphics/object_events/pic const u32 gFieldEffectObjectPic_CaveDust[] = INCBIN_U32("graphics/field_effects/pics/cave_dust.4bpp"); const u16 gFieldEffectObjectPalette_CaveDust[] = INCBIN_U16("graphics/field_effects/palettes/cave_dust.gbapal"); + +const u32 gObjectEventPic_ApricornTree[] = INCBIN_U32("graphics/object_events/pics/misc/apricorn_tree.4bpp"); diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index 91b3ab2c9d..5b1c891eb4 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -4690,3 +4690,22 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BallLight = { .images = gFieldEffectObjectPicTable_BallLight, .affineAnims = gDummySpriteAffineAnimTable, }; + +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ApricornTree = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NPC_3, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, + .size = 128, + .width = 16, + .height = 16, + .paletteSlot = PALSLOT_NPC_3, + .shadowSize = SHADOW_SIZE_S, + .inanimate = TRUE, + .compressed = FALSE, + .tracks = TRACKS_NONE, + .oam = &gObjectEventBaseOam_16x16, + .subspriteTables = sOamTables_16x16, + .anims = sAnimTable_Inanimate, + .images = sPicTable_ApricornTree, + .affineAnims = gDummySpriteAffineAnimTable, +}; diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index 117187739b..a239bce993 100755 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -248,6 +248,7 @@ extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Storyteller extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giddy; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan1; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan2; +extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ApricornTree; const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM_OBJ_EVENT_GFX] = { [OBJ_EVENT_GFX_BRENDAN_NORMAL] = &gObjectEventGraphicsInfo_BrendanNormal, @@ -492,6 +493,7 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_POKE_BALL] = &gObjectEventGraphicsInfo_PokeBall, [OBJ_EVENT_GFX_OW_MON] = &gObjectEventGraphicsInfo_Follower, [OBJ_EVENT_GFX_LIGHT_SPRITE] = &gObjectEventGraphicsInfo_BallLight, + [OBJ_EVENT_GFX_APRICORN_TREE] = &gObjectEventGraphicsInfo_ApricornTree, }; const struct ObjectEventGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = { diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index c1f8fd6f1c..06d353b44d 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -1356,3 +1356,7 @@ static const struct SpriteFrameImage sPicTable_KirliaOld[] = { static const struct SpriteFrameImage sPicTable_RubySapphireMay[] = { overworld_ascending_frames(gObjectEventPic_RubySapphireMayNormal, 2, 4), }; + +static const struct SpriteFrameImage sPicTable_ApricornTree[] = { + overworld_frame(gObjectEventPic_ApricornTree, 2, 2, 0), +}; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 53d17bfaef..f11a626be1 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -11544,3 +11544,8 @@ bool8 MovementAction_SurfStillRight_Step1(struct ObjectEvent *objectEvent, struc } return FALSE; } + +u8 GetObjectEventApricornTreeId(u8 objectEventId) +{ + return gObjectEvents[objectEventId].trainerRange_berryTreeId; +} From 61e06cae087b62e6a45e9b4da679d295f7230fed Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 14 Nov 2025 22:49:47 +0100 Subject: [PATCH 162/183] Fix Apricorns with OW_SHOW_ITEM_DESCRIPTIONS not off (#8253) Co-authored-by: Hedara --- data/scripts/apricorn_tree.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/scripts/apricorn_tree.inc b/data/scripts/apricorn_tree.inc index e336437be0..019b2b76b0 100644 --- a/data/scripts/apricorn_tree.inc +++ b/data/scripts/apricorn_tree.inc @@ -30,7 +30,7 @@ ApricornTree_EventScript_PickApricorn:: .endif delay 10 .if OW_SHOW_ITEM_DESCRIPTIONS != OW_ITEM_DESCRIPTIONS_OFF - showberrydesc + showberrydescription .endif playfanfare MUS_OBTAIN_BERRY waitmessage @@ -40,7 +40,7 @@ ApricornTree_EventScript_PickApricorn:: waitmessage waitbuttonpress .if OW_SHOW_ITEM_DESCRIPTIONS != OW_ITEM_DESCRIPTIONS_OFF - hideitemdesc + hideitemdescription .endif release end From 1d754945dd7aa6ffb7b7b30c474cd974dcaf0fc3 Mon Sep 17 00:00:00 2001 From: Estellar <137097857+estellarc@users.noreply.github.com> Date: Sat, 15 Nov 2025 19:41:08 -0300 Subject: [PATCH 163/183] Small bg drawing optimization --- src/bg.c | 54 ++++++++++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/src/bg.c b/src/bg.c index bfc719a25f..9080adf22c 100644 --- a/src/bg.c +++ b/src/bg.c @@ -911,8 +911,6 @@ void CopyBgTilemapBufferToVram(u32 bg) void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height) { - u16 destX16; - u16 destY16; u16 mode; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) @@ -922,11 +920,11 @@ void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 w case BG_TYPE_NORMAL: { const u16 *srcCopy = src; - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (u32 j = destY; j < (destY + height); j++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) + for (u32 i = destX; i < (destX + width); i++) { - ((u16 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *srcCopy++; + ((u16 *)sGpuBgConfigs2[bg].tilemap)[((j * 0x20) + i)] = *srcCopy++; } } break; @@ -935,11 +933,11 @@ void CopyToBgTilemapBufferRect(u32 bg, const void *src, u8 destX, u8 destY, u8 w { const u8 *srcCopy = src; mode = GetBgMetricAffineMode(bg, 0x1); - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (u32 j = destY; j < (destY + height); j++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) + for (u32 i = destX; i < (destX + width); i++) { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *srcCopy++; + ((u8 *)sGpuBgConfigs2[bg].tilemap)[((j * mode) + i)] = *srcCopy++; } } break; @@ -958,7 +956,6 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 u16 screenWidth, screenHeight, screenSize; u16 var; const void *srcPtr; - u16 i, j; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { @@ -969,11 +966,11 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 { case BG_TYPE_NORMAL: srcPtr = src + ((srcY * srcWidth) + srcX) * 2; - for (i = destY; i < (destY + rectHeight); i++) + for (u32 j = destY; j < (destY + rectHeight); j++) { - for (j = destX; j < (destX + rectWidth); j++) + for (u32 i = destX; i < (destX + rectWidth); i++) { - u16 index = GetTileMapIndexFromCoords(j, i, screenSize, screenWidth, screenHeight); + u16 index = GetTileMapIndexFromCoords(i, j, screenSize, screenWidth, screenHeight); CopyTileMapEntry(srcPtr, sGpuBgConfigs2[bg].tilemap + (index * 2), palette1, tileOffset, palette2); srcPtr += 2; } @@ -983,11 +980,11 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 case BG_TYPE_AFFINE: srcPtr = src + ((srcY * srcWidth) + srcX); var = GetBgMetricAffineMode(bg, 0x1); - for (i = destY; i < (destY + rectHeight); i++) + for (u32 j = destY; j < (destY + rectHeight); j++) { - for (j = destX; j < (destX + rectWidth); j++) + for (u32 i = destX; i < (destX + rectWidth); i++) { - *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * i) + j)) = *(u8 *)(srcPtr) + tileOffset; + *(u8 *)(sGpuBgConfigs2[bg].tilemap + ((var * j) + i)) = *(u8 *)(srcPtr) + tileOffset; srcPtr++; } srcPtr += (srcWidth - rectWidth); @@ -999,8 +996,6 @@ void CopyRectToBgTilemapBufferRect(u32 bg, const void *src, u8 srcX, u8 srcY, u8 void FillBgTilemapBufferRect_Palette0(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height) { - u16 x16; - u16 y16; u16 mode; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) @@ -1008,21 +1003,21 @@ void FillBgTilemapBufferRect_Palette0(u32 bg, u16 tileNum, u8 x, u8 y, u8 width, switch (GetBgType(bg)) { case BG_TYPE_NORMAL: - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - ((u16 *)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; + ((u16 *)sGpuBgConfigs2[bg].tilemap)[((j * 0x20) + i)] = tileNum; } } break; case BG_TYPE_AFFINE: mode = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum; + ((u8 *)sGpuBgConfigs2[bg].tilemap)[((j * mode) + i)] = tileNum; } } break; @@ -1041,7 +1036,6 @@ void WriteSequenceToBgTilemapBuffer(u32 bg, u16 firstTileNum, u8 x, u8 y, u8 wid u16 mode2; u16 attribute; u16 mode3; - u16 x16, y16; if (!IsInvalidBg(bg) && !IsTileMapOutsideWram(bg)) { @@ -1051,22 +1045,22 @@ void WriteSequenceToBgTilemapBuffer(u32 bg, u16 firstTileNum, u8 x, u8 y, u8 wid switch (GetBgType(bg)) { case BG_TYPE_NORMAL: - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); + CopyTileMapEntry(&firstTileNum, &((u16 *)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(i, j, attribute, mode, mode2)], paletteSlot, 0, 0); firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } break; case BG_TYPE_AFFINE: mode3 = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + for (u32 j = y; j < (y + height); j++) { - for (x16 = x; x16 < (x + width); x16++) + for (u32 i = x; i < (x + width); i++) { - ((u8 *)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; + ((u8 *)sGpuBgConfigs2[bg].tilemap)[(j * mode3) + i] = firstTileNum; firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } From 7c046eb3b8b8b431f66ff8e4b4789688f20eb19c Mon Sep 17 00:00:00 2001 From: Montblanc Date: Sun, 16 Nov 2025 03:52:07 -0800 Subject: [PATCH 164/183] Fixed bKGD for last_used_ball_r_cycle.png (#8261) --- .../battle_interface/last_used_ball_r_cycle.png | Bin 344 -> 247 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/battle_interface/last_used_ball_r_cycle.png b/graphics/battle_interface/last_used_ball_r_cycle.png index 0a73148e15f5019de534aa76f794372d159a51e6..55b7bc7c0c7b587cb11fca68a54fe15ce0004cf6 100644 GIT binary patch delta 172 zcmV;d08{_i0`~!s7#Roy0000?P=%ZT000DMK}|sb0I`mI`%#mTdq012Nkl|6CKINK1uLhu*ODq|pIViXv5YQgc8|K-F{d7y^~3eGcFe0}$Sz zodzf_cs9I%?S=(_`U?jTV|0KmK!DFdF4w4J7v$1G6Jjo}-JmWnFnz`RK&&2+{Sy@Z ar4uLiC;@@B(((WR000O{MNUMnLSTZV+eJVC delta 269 zcmey)c!OzzL^2CA0|P_nf{eL9ioL|s*OmP_tE?!q&N{jK!ayPM64!{5;QX|b^2DN4 z26rEq06%wyveY64V?C3?)+G;tN;pai{M>;u#y~cMSA(WJkYY)9^mSxl*x1kgCy{lc zp?y7LlDE4{wg089e}J+zo-U3d6?2jkBv@A@n9Df)xU>46icq@Fh zB2)hQ>C@Lo#l^*y@+)n4uNRO|DH`zLU3LpY1nVY-Hm;DyXo2XkgRJk?F*R@HV3d#$ zT`=!J?@ot%JSvTT6Aqk-TXA6Bb_3B1C)m{3H5%mA*n3!-CoX9dWMHs;7n0?fqfiNQ NuBWS?%Q~loCIGJ|T+;vm From 48f15b14a2b9e8ca049b7514664a2749e9780c27 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Sun, 16 Nov 2025 14:15:06 -0600 Subject: [PATCH 165/183] Follower NPCs no longer move if the player would be forced back onto the same tile. (#8260) --- include/follower_npc.h | 7 ++ include/global.h | 4 +- src/field_player_avatar.c | 8 +- src/follower_npc.c | 178 ++++++++++++++++++++++++++++++++++---- 4 files changed, 176 insertions(+), 21 deletions(-) diff --git a/include/follower_npc.h b/include/follower_npc.h index 5a2ab0e545..680a3b6799 100644 --- a/include/follower_npc.h +++ b/include/follower_npc.h @@ -81,6 +81,13 @@ enum FollowerNPCHandleEscalatorFinishTaskStates MOVEMENT_FINISH }; +enum FollowerNPCForcedMovementStates +{ + FNPC_FORCED_NONE, + FNPC_FORCED_FOLLOW, + FNPC_FORCED_STAY +}; + #define FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES 0x1 #define FNPC_NONE 0 diff --git a/include/global.h b/include/global.h index 3045959808..e6dd40906f 100644 --- a/include/global.h +++ b/include/global.h @@ -222,9 +222,9 @@ struct NPCFollower { u8 inProgress:1; u8 warpEnd:1; - u8 createSurfBlob:3; + u8 createSurfBlob:2; u8 comeOutDoorStairs:2; - u8 forcedMovement:1; + u8 forcedMovement:2; u8 objId; u8 currentSprite; u8 delayedState; diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 89fb3a2bb8..bbc1e16bfe 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -349,7 +349,7 @@ void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys) DoPlayerAvatarTransition(); if (TryDoMetatileBehaviorForcedMovement() == 0) { - if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) != FALSE) + if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) != FNPC_FORCED_NONE) { gPlayerAvatar.preventStep = TRUE; CreateTask(Task_MoveNPCFollowerAfterForcedMovement, 1); @@ -501,7 +501,7 @@ static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8)) { if (collision == COLLISION_LEDGE_JUMP) { - SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FALSE); + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_NONE); PlayerJumpLedge(direction); } @@ -512,8 +512,8 @@ static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8)) } else { - if (PlayerHasFollowerNPC()) - SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, TRUE); + if (PlayerHasFollowerNPC() && GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) != FNPC_FORCED_STAY) + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_FOLLOW); playerAvatar->runningState = MOVING; moveFunc(direction); diff --git a/src/follower_npc.c b/src/follower_npc.c index 8bc3a61697..d6af0abad2 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -4,6 +4,7 @@ #include "battle.h" #include "battle_setup.h" #include "battle_tower.h" +#include "bike.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" @@ -52,6 +53,8 @@ static void TurnNPCIntoFollower(u32 localId, u32 followerFlags, u32 setScript, c static u32 GetFollowerNPCSprite(void); static bool32 FollowerNPCHasRunningFrames(void); static bool32 IsStateMovement(u32 state); +static u32 GetNewPlayerMovementDirection(u32 state); +static bool32 IsPlayerForcedOntoSameTile(u8 metatileBehavior, u8 direction); static u32 GetPlayerFaceToDoorDirection(struct ObjectEvent *player, struct ObjectEvent *follower); static u32 ReturnFollowerNPCDelayedState(u32 direction); static void TryUpdateFollowerNPCSpriteUnderwater(void); @@ -351,6 +354,115 @@ static bool32 IsStateMovement(u32 state) return TRUE; } +// Because we want the NPC follower's movements to happen simultaneously with the player's, +// we need to set the follower's movement before the player object's movementDirection parameter gets set. +// This function allows us to determine the player's new movement direction before it gets set. +static u32 GetNewPlayerMovementDirection(u32 state) +{ + switch (state) + { + case MOVEMENT_ACTION_WALK_SLOW_DOWN: + case MOVEMENT_ACTION_WALK_NORMAL_DOWN: + case MOVEMENT_ACTION_WALK_FAST_DOWN: + case MOVEMENT_ACTION_WALK_FASTER_DOWN: + case MOVEMENT_ACTION_PLAYER_RUN_DOWN: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN: + case MOVEMENT_ACTION_JUMP_DOWN: + return DIR_SOUTH; + case MOVEMENT_ACTION_WALK_SLOW_UP: + case MOVEMENT_ACTION_WALK_NORMAL_UP: + case MOVEMENT_ACTION_WALK_FAST_UP: + case MOVEMENT_ACTION_WALK_FASTER_UP: + case MOVEMENT_ACTION_PLAYER_RUN_UP: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP: + case MOVEMENT_ACTION_JUMP_UP: + return DIR_NORTH; + case MOVEMENT_ACTION_WALK_SLOW_LEFT: + case MOVEMENT_ACTION_WALK_NORMAL_LEFT: + case MOVEMENT_ACTION_WALK_FAST_LEFT: + case MOVEMENT_ACTION_WALK_FASTER_LEFT: + case MOVEMENT_ACTION_PLAYER_RUN_LEFT: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT: + case MOVEMENT_ACTION_JUMP_LEFT: + return DIR_WEST; + case MOVEMENT_ACTION_WALK_SLOW_RIGHT: + case MOVEMENT_ACTION_WALK_NORMAL_RIGHT: + case MOVEMENT_ACTION_WALK_FAST_RIGHT: + case MOVEMENT_ACTION_WALK_FASTER_RIGHT: + case MOVEMENT_ACTION_PLAYER_RUN_RIGHT: + case MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT: + case MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT: + case MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT: + case MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT: + case MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT: + case MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT: + case MOVEMENT_ACTION_JUMP_RIGHT: + return DIR_EAST; + default: + return DIR_NONE; + } +} + +static bool32 IsPlayerForcedOntoSameTile(u8 metatileBehavior, u8 direction) +{ + u8 oppositeDirection = DIR_NONE; + + switch (metatileBehavior) + { + case MB_WALK_EAST: + case MB_SLIDE_EAST: + case MB_EASTWARD_CURRENT: + oppositeDirection = DIR_WEST; + break; + case MB_WALK_WEST: + case MB_SLIDE_WEST: + case MB_WESTWARD_CURRENT: + oppositeDirection = DIR_EAST; + break; + case MB_WALK_NORTH: + case MB_SLIDE_NORTH: + case MB_NORTHWARD_CURRENT: + oppositeDirection = DIR_SOUTH; + break; + case MB_WALK_SOUTH: + case MB_SLIDE_SOUTH: + case MB_SOUTHWARD_CURRENT: + case MB_MUDDY_SLOPE: + case MB_WATERFALL: + oppositeDirection = DIR_NORTH; + break; + default: + return FALSE; + } + + if (oppositeDirection == direction) + return TRUE; + + return FALSE; +} + +void GetXYCoordsPlayerMovementDest(u32 direction, s16 *x, s16 *y) +{ + *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; + *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; + MoveCoords(direction, x, y); +} + static u32 GetPlayerFaceToDoorDirection(struct ObjectEvent *player, struct ObjectEvent *follower) { s32 delta_x = player->currentCoords.x - follower->currentCoords.x; @@ -760,6 +872,9 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc u32 nextBehavior; u32 noSpecialAnimFrames = (GetFollowerNPCSprite() == GetFollowerNPCData(FNPC_DATA_GFX_ID)); u32 delayedState = GetFollowerNPCData(FNPC_DATA_DELAYED_STATE); + s16 playerDestX, playerDestY; + u32 playerMoveDirection = GetNewPlayerMovementDirection(state); + u32 newPlayerMB; MoveCoords(direction, &followerX, &followerY); nextBehavior = MapGridGetMetatileBehaviorAt(followerX, followerY); @@ -769,6 +884,24 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc if (!IsStateMovement(state) && delayedState) return MOVEMENT_ACTION_NONE; + // Follower won't move if player is forced back onto the same tile. + if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) == FNPC_FORCED_STAY) + return MOVEMENT_ACTION_NONE; + + GetXYCoordsPlayerMovementDest(playerMoveDirection, &playerDestX, &playerDestY); + newPlayerMB = MapGridGetMetatileBehaviorAt(playerDestX, playerDestY); + + if (IsPlayerForcedOntoSameTile(newPlayerMB, playerMoveDirection) + && !(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE && playerMoveDirection == DIR_NORTH && newPlayerMB == MB_MUDDY_SLOPE && GetPlayerSpeed() >= PLAYER_SPEED_FAST)) + { + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_STAY); + SetFollowerNPCData(FNPC_DATA_DELAYED_STATE, 0); + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ON_FOOT) + ObjectEventSetHeldMovement(follower, GetFaceDirectionAnimNum(follower->facingDirection)); + + return MOVEMENT_INVALID; + } + if (IsStateMovement(state) && delayedState) { // Lock face direction for Acro side jump. @@ -1588,25 +1721,40 @@ void Task_MoveNPCFollowerAfterForcedMovement(u8 taskId) struct ObjectEvent *follower = &gObjectEvents[GetFollowerNPCObjectId()]; struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; - // The NPC will take an extra step and be on the same tile as the player. - if (gTasks[taskId].tState == NPC_INTO_PLAYER && ObjectEventClearHeldMovementIfFinished(player) != 0 && ObjectEventClearHeldMovementIfFinished(follower) != 0) + // If follower moved during player's forced momvements. + if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) == FNPC_FORCED_FOLLOW) { - if (follower->currentMetatileBehavior == MB_MUDDY_SLOPE) - follower->facingDirectionLocked = TRUE; + // The NPC will take an extra step and be on the same tile as the player. + if (gTasks[taskId].tState == NPC_INTO_PLAYER && ObjectEventClearHeldMovementIfFinished(player) != 0 && ObjectEventClearHeldMovementIfFinished(follower) != 0) + { + if (follower->currentMetatileBehavior == MB_MUDDY_SLOPE) + follower->facingDirectionLocked = TRUE; - ObjectEventSetHeldMovement(follower, GetWalkFastMovementAction(DetermineFollowerNPCDirection(player, follower))); - gTasks[taskId].tState = ENABLE_PLAYER_STEP; - return; + ObjectEventSetHeldMovement(follower, GetWalkFastMovementAction(DetermineFollowerNPCDirection(player, follower))); + gTasks[taskId].tState = ENABLE_PLAYER_STEP; + return; + } + // Hide the NPC until the player takes a step. Reallow player input. + else if (gTasks[taskId].tState == ENABLE_PLAYER_STEP && ObjectEventClearHeldMovementIfFinished(follower) != 0) + { + follower->facingDirectionLocked = FALSE; + HideNPCFollower(); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_NONE); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(taskId); + } } - // Hide the NPC until the player takes a step. Reallow player input. - else if (gTasks[taskId].tState == ENABLE_PLAYER_STEP && ObjectEventClearHeldMovementIfFinished(follower) != 0) + // If player was forced back onto the same tile. + else if (GetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT) == FNPC_FORCED_STAY) { - follower->facingDirectionLocked = FALSE; - HideNPCFollower(); - SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); - SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FALSE); - gPlayerAvatar.preventStep = FALSE; - DestroyTask(taskId); + if (ObjectEventClearHeldMovementIfFinished(player) != 0) + { + SetFollowerNPCData(FNPC_DATA_FORCED_MOVEMENT, FNPC_FORCED_NONE); + SetFollowerNPCData(FNPC_DATA_DELAYED_STATE, 0); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(taskId); + } } } From 0dd73131d02ef1107cb68f3bcbfc9b39fec916ad Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 17 Nov 2025 09:15:45 -0300 Subject: [PATCH 166/183] Test type enum indentation --- include/test/battle.h | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/include/test/battle.h b/include/test/battle.h index d0f0458a7e..245b15fa0d 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -194,9 +194,9 @@ * ASSUME(GetMoveEffect(MOVE_POISON_STING) == EFFECT_POISON_HIT); * } * - * SINGLE_BATTLE_TEST(name, results...), DOUBLE_BATTLE_TEST(name, results...), MULTI_BATTLE_TEST(name, results...), + * SINGLE_BATTLE_TEST(name, results...), DOUBLE_BATTLE_TEST(name, results...), MULTI_BATTLE_TEST(name, results...), * TWO_VS_ONE_BATTLE_TEST(name, results...), and ONE_VS_TWO_BATTLE_TEST(name, results...) - * Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- battles. The names should start with + * Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- battles. The names should start with * the name of the mechanic being tested so that it is easier to run all the related tests. results contains variable * declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. * The main differences for doubles, 2v2, 2v1, and 1v2 are: @@ -204,7 +204,7 @@ * - Instead of player and opponent there is playerLeft, playerRight, * opponentLeft, and opponentRight. * - * AI_SINGLE_BATTLE_TEST(name, results...), AI_DOUBLE_BATTLE_TEST(name, results...), + * AI_SINGLE_BATTLE_TEST(name, results...), AI_DOUBLE_BATTLE_TEST(name, results...), * AI_MULTI_BATTLE_TEST(name, results...), AI_TWO_VS_ONE_BATTLE_TEST(name, results...), and AI_ONE_VS_TWO_BATTLE_TEST(name, results...) * Define battles where opponent mons are controlled by AI, the same that runs * when battling regular Trainers. The flags for AI should be specified by @@ -334,34 +334,34 @@ * Note if Moves is specified then MOVE will not automatically add moves * to the moveset. * - * For tests using MULTI_BATTLE_TEST, AI_MULTI_BATTLE_TEST, TWO_VS_ONE_BATTLE_TEST, - * AI_TWO_VS_ONE_BATTLE_TEST, ONE_VS_TWO_BATTLE_TEST, and AI_ONE_VS_TWO_BATTLE_TEST, + * For tests using MULTI_BATTLE_TEST, AI_MULTI_BATTLE_TEST, TWO_VS_ONE_BATTLE_TEST, + * AI_TWO_VS_ONE_BATTLE_TEST, ONE_VS_TWO_BATTLE_TEST, and AI_ONE_VS_TWO_BATTLE_TEST, * the below must be used instead of PLAYER(species) and OPPONENT(species). - * MULTI_PLAYER(species), MULTI_PARTNER(species), MULTI_OPPONENT_A(species), and - * MULTI_OPPONENT_B(species) Adds the species to the player's, player partner's, + * MULTI_PLAYER(species), MULTI_PARTNER(species), MULTI_OPPONENT_A(species), and + * MULTI_OPPONENT_B(species) Adds the species to the player's, player partner's, * opponent A's, or opponent B's party, respectively. * Pokemon can be customised as per the guidance for PLAYER(species) and OPPONENT(species). - * The functions assign the Pokémon to the party of the trainer at B_POSITION_PLAYER_LEFT, + * The functions assign the Pokémon to the party of the trainer at B_POSITION_PLAYER_LEFT, * B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_LEFT, and B_POSITION_OPPONENT_RIGHT, respectively. * MULTI_PLAYER(species) and MULTI_OPPONENT_A(species) set Pokémon starting at party index 0, - * while MULTI_PARTNER(species) and MULTI_OPPONENT_B(species) set Pokémon starting at party + * while MULTI_PARTNER(species) and MULTI_OPPONENT_B(species) set Pokémon starting at party * index 3. * For ONE_VS_TWO tests, MULTI_PLAYER(species) must be used for all player-side Pokémon, * and for TWO_VS_ONE tests, MULTI_OPPONENT_A(species) must be used for all opponent-side - * Pokémon. + * Pokémon. * All MULTI_PLAYER(species) Pokémon must be set before any MULTI_PARTNER(species) Pokémon, * and all MULTI_OPPONENT_A(species) must be set before any MULTI_OPPONENT_B(species) Pokémon, * else Pokémon will be set in the incorrect parties in the test. * Note where a side in a test has two trainers, the test setup manages the assigning of correct - * multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A - * Pokémon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B + * multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A + * Pokémon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B * Pokémon may be referenced using indexes 3, 4, and 5. * * AI_FLAGS * Specifies which AI flags are run for all battlers during the test. Has use only for AI tests. * The most common combination is AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT) * which is the general 'smart' AI. - * + * * BATTLER_AI_FLAGS * Specifies additional AI flags to be applied to specific battlers (battler 0/1/2/3). Has use only for AI tests. * Must be used strictly after AI_FLAGS(flags), which overwrites all existing flags. @@ -567,7 +567,19 @@ #define MAX_QUEUED_EVENTS 30 #define MAX_EXPECTED_ACTIONS 10 -enum { BATTLE_TEST_SINGLES, BATTLE_TEST_DOUBLES, BATTLE_TEST_WILD, BATTLE_TEST_AI_SINGLES, BATTLE_TEST_AI_DOUBLES, BATTLE_TEST_MULTI, BATTLE_TEST_AI_MULTI, BATTLE_TEST_TWO_VS_ONE, BATTLE_TEST_AI_TWO_VS_ONE, BATTLE_TEST_ONE_VS_TWO, BATTLE_TEST_AI_ONE_VS_TWO }; +enum { + BATTLE_TEST_SINGLES, + BATTLE_TEST_DOUBLES, + BATTLE_TEST_WILD, + BATTLE_TEST_MULTI, + BATTLE_TEST_TWO_VS_ONE, + BATTLE_TEST_ONE_VS_TWO, + BATTLE_TEST_AI_SINGLES, + BATTLE_TEST_AI_DOUBLES, + BATTLE_TEST_AI_MULTI, + BATTLE_TEST_AI_TWO_VS_ONE, + BATTLE_TEST_AI_ONE_VS_TWO +}; typedef void (*SingleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *); typedef void (*DoubleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); From 8c2d31b7921bf04b510ef2549e6f4e4ddf820f42 Mon Sep 17 00:00:00 2001 From: moostoet <70690976+moostoet@users.noreply.github.com> Date: Tue, 18 Nov 2025 23:41:04 +0100 Subject: [PATCH 167/183] Add AI flag AI_FLAG_KNOW_OPPONENT_PARTY to know all species in party (#8290) --- include/constants/battle_ai.h | 1 + src/battle_ai_main.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index c6277bf9b5..89cfd08ed0 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -38,6 +38,7 @@ #define AI_FLAG_ASSUME_STAB AI_FLAG(28) // AI knows player's STAB moves, but nothing else. Restricted version of AI_FLAG_OMNISCIENT. #define AI_FLAG_ASSUME_STATUS_MOVES AI_FLAG(29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. #define AI_FLAG_ATTACKS_PARTNER AI_FLAG(30) // AI specific to double battles; AI can deliberately attack its 'partner.' +#define AI_FLAG_KNOW_OPPONENT_PARTY AI_FLAG(31) // AI knows all the species in the player's party, but not moves/items/abilities unless they've been seen. // The following options are enough to have a basic/smart trainer. Any other addtion could make the trainer worse/better depending on the flag #define AI_FLAG_BASIC_TRAINER (AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 75cd0fdd1d..1ab83e2c67 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -447,6 +447,7 @@ void Ai_InitPartyStruct(void) { u32 i; bool32 isOmniscient = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); + bool32 hasPartyKnowledge = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_KNOW_OPPONENT_PARTY) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_KNOW_OPPONENT_PARTY); struct Pokemon *mon; gAiPartyData->count[B_SIDE_PLAYER] = CalculatePlayerPartyCount(); @@ -467,13 +468,16 @@ void Ai_InitPartyStruct(void) // Find fainted mons for (i = 0; i < gAiPartyData->count[B_SIDE_PLAYER]; i++) { + mon = &gPlayerParty[i]; if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) gAiPartyData->mons[B_SIDE_PLAYER][i].isFainted = TRUE; + if (isOmniscient || hasPartyKnowledge) + gAiPartyData->mons[B_SIDE_PLAYER][i].species = GetMonData(mon, MON_DATA_SPECIES); + if (isOmniscient) { u32 j; - mon = &gPlayerParty[i]; gAiPartyData->mons[B_SIDE_PLAYER][i].item = GetMonData(mon, MON_DATA_HELD_ITEM); gAiPartyData->mons[B_SIDE_PLAYER][i].heldEffect = GetItemHoldEffect(gAiPartyData->mons[B_SIDE_PLAYER][i].item); gAiPartyData->mons[B_SIDE_PLAYER][i].ability = GetMonAbility(mon); From c9e83dadbdac04c153fcd37fbaeb5268665bbcfd Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Wed, 19 Nov 2025 09:27:34 -0500 Subject: [PATCH 168/183] Added missing 'coolness' string (#8274) --- src/contest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contest.c b/src/contest.c index 2575924e26..fcebf53aba 100644 --- a/src/contest.c +++ b/src/contest.c @@ -715,7 +715,7 @@ const struct ContestCategory gContestCategoryInfo[CONTEST_CATEGORIES_COUNT + 1] [CONTEST_CATEGORY_COOL] = { .name = COMPOUND_STRING("COOL"), - .condition = COMPOUND_STRING(""), + .condition = COMPOUND_STRING("coolness"), .generic = COMPOUND_STRING("COOL Move"), .negativeTrait = COMPOUND_STRING("shyness"), .palette = 13, From 6aa84c8fa17f3053ead9222068f7dfb46c52e6eb Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Wed, 19 Nov 2025 16:06:52 +0100 Subject: [PATCH 169/183] Canceller -> Canceler rename --- include/battle.h | 2 +- include/battle_util.h | 72 +++++++------- src/battle_main.c | 2 +- src/battle_script_commands.c | 14 +-- src/battle_util.c | 178 +++++++++++++++++------------------ 5 files changed, 134 insertions(+), 134 deletions(-) diff --git a/include/battle.h b/include/battle.h index 9fd35f7329..74985151bd 100644 --- a/include/battle.h +++ b/include/battle.h @@ -619,7 +619,7 @@ struct EventStates enum FirstTurnEventsStates beforeFristTurn:8; enum FaintedActions faintedAction:8; enum BattlerId faintedActionBattler:4; - enum MoveSuccessOrder atkCanceller:8; + enum MoveSuccessOrder atkCanceler:8; enum BattleIntroStates battleIntro:8; u32 padding:24; }; diff --git a/include/battle_util.h b/include/battle_util.h index 1dfd71ad80..068f138264 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -98,39 +98,39 @@ struct TypePower enum MoveSuccessOrder { - CANCELLER_CLEAR_FLAGS, - CANCELLER_STANCE_CHANGE_1, - CANCELLER_SKY_DROP, - CANCELLER_RECHARGE, - CANCELLER_ASLEEP_OR_FROZEN, - CANCELLER_POWER_POINTS, - CANCELLER_OBEDIENCE, - CANCELLER_TRUANT, - CANCELLER_FLINCH, - CANCELLER_DISABLED, - CANCELLER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop - CANCELLER_TAUNTED, - CANCELLER_IMPRISONED, - CANCELLER_CONFUSED, - CANCELLER_PARALYSED, - CANCELLER_INFATUATION, - CANCELLER_BIDE, - CANCELLER_Z_MOVES, - CANCELLER_CHOICE_LOCK, - CANCELLER_CALLSUBMOVE, - CANCELLER_THAW, - CANCELLER_STANCE_CHANGE_2, - CANCELLER_ATTACKSTRING, - CANCELLER_PPDEDUCTION, - CANCELLER_WEATHER_PRIMAL, - CANCELLER_MOVE_FAILURE, - CANCELLER_POWDER_STATUS, - CANCELLER_PRIORITY_BLOCK, - CANCELLER_PROTEAN, - CANCELLER_EXPLODING_DAMP, - CANCELLER_MULTIHIT_MOVES, - CANCELLER_MULTI_TARGET_MOVES, - CANCELLER_END, + CANCELER_STANCE_CHANGE_1, + CANCELER_CLEAR_FLAGS, + CANCELER_SKY_DROP, + CANCELER_RECHARGE, + CANCELER_ASLEEP_OR_FROZEN, + CANCELER_POWER_POINTS, + CANCELER_OBEDIENCE, + CANCELER_TRUANT, + CANCELER_FLINCH, + CANCELER_DISABLED, + CANCELER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop + CANCELER_TAUNTED, + CANCELER_IMPRISONED, + CANCELER_CONFUSED, + CANCELER_PARALYSED, + CANCELER_INFATUATION, + CANCELER_BIDE, + CANCELER_Z_MOVES, + CANCELER_CHOICE_LOCK, + CANCELER_CALLSUBMOVE, + CANCELER_THAW, + CANCELER_STANCE_CHANGE_2, + CANCELER_ATTACKSTRING, + CANCELER_PPDEDUCTION, + CANCELER_WEATHER_PRIMAL, + CANCELER_MOVE_FAILURE, + CANCELER_POWDER_STATUS, + CANCELER_PRIORITY_BLOCK, + CANCELER_PROTEAN, + CANCELER_EXPLODING_DAMP, + CANCELER_MULTIHIT_MOVES, + CANCELER_MULTI_TARGET_MOVES, + CANCELER_END, }; enum Obedience @@ -143,7 +143,7 @@ enum Obedience DISOBEYS_RANDOM_MOVE, }; -enum MoveCanceller +enum MoveCanceler { MOVE_STEP_SUCCESS, MOVE_STEP_BREAK, // Breaks out of the function to run a script @@ -195,7 +195,7 @@ enum SleepClauseBlock enum SkyDropState { SKY_DROP_IGNORE, - SKY_DROP_ATTACKCANCELLER_CHECK, + SKY_DROP_ATTACKCANCELER_CHECK, SKY_DROP_GRAVITY_ON_AIRBORNE, SKY_DROP_CANCEL_MULTI_TURN_MOVES, SKY_DROP_STATUS_YAWN, @@ -256,7 +256,7 @@ bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); -enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx); +enum MoveCanceler AtkCanceler_MoveSuccessOrder(struct BattleContext *ctx); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability); bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag); diff --git a/src/battle_main.c b/src/battle_main.c index f2b74ee4b5..96ef53b323 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5162,7 +5162,7 @@ static void TurnValuesCleanUp(bool8 var0) gSideTimers[B_SIDE_PLAYER].followmeTimer = 0; gSideTimers[B_SIDE_OPPONENT].followmeTimer = 0; - gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller + gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceler gBattleStruct->tryDestinyBond = FALSE; gBattleStruct->tryGrudge = FALSE; ClearPursuitValues(); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index dbd1e9e46d..2e5a244d29 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1110,11 +1110,11 @@ static void Cmd_attackcanceler(void) return; } - // With how attackcanceller works right now we only need attacker and target abilities. Might change in the future + // With how attackcanceler works right now we only need attacker and target abilities. Might change in the future ctx.abilities[ctx.battlerAtk] = GetBattlerAbility(ctx.battlerAtk); ctx.abilities[ctx.battlerDef] = GetBattlerAbility(ctx.battlerDef); - if (AtkCanceller_MoveSuccessOrder(&ctx) != MOVE_STEP_SUCCESS) + if (AtkCanceler_MoveSuccessOrder(&ctx) != MOVE_STEP_SUCCESS) return; if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF @@ -1166,7 +1166,7 @@ static void Cmd_attackcanceler(void) gBattlescriptCurrInstr = BattleScript_ButItFailed; if (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELER_CHECK); return; } @@ -1255,7 +1255,7 @@ static void Cmd_attackcanceler(void) { if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELER_CHECK); gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; @@ -1763,7 +1763,7 @@ static void Cmd_typecalc(void) { CMD_ARGS(); - if (!IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) // Handled in CANCELLER_MULTI_TARGET_MOVES for Spread Moves + if (!IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) // Handled in CANCELER_MULTI_TARGET_MOVES for Spread Moves { struct DamageContext ctx = {0}; ctx.battlerAtk = gBattlerAttacker; @@ -8567,9 +8567,9 @@ static void Cmd_hidepartystatussummary(void) static void ResetValuesForCalledMove(void) { if (gBattlerByTurnOrder[gCurrentTurnActionNumber] != gBattlerAttacker) - gBattleStruct->eventState.atkCanceller = 0; + gBattleStruct->eventState.atkCanceler = 0; else - gBattleStruct->eventState.atkCanceller = CANCELLER_VOLATILE_BLOCKED; + gBattleStruct->eventState.atkCanceler = CANCELER_VOLATILE_BLOCKED; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); diff --git a/src/battle_util.c b/src/battle_util.c index 8623291552..19d9bd1345 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -433,7 +433,7 @@ void HandleAction_UseMove(void) return; } - gBattleStruct->eventState.atkCanceller = 0; + gBattleStruct->eventState.atkCanceler = 0; ClearDamageCalcResults(); gMultiHitCounter = 0; gBattleScripting.savedDmg = 0; @@ -1114,7 +1114,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) // Set confused status gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; - if (skyDropState == SKY_DROP_ATTACKCANCELLER_CHECK) + if (skyDropState == SKY_DROP_ATTACKCANCELER_CHECK) { gBattleStruct->skyDropTargets[battler] = SKY_DROP_RELEASED_TARGET; } @@ -1946,21 +1946,21 @@ static inline bool32 TryActivatePowderStatus(u32 move) return FALSE; } -static enum MoveCanceller CancellerClearFlags(struct BattleContext *ctx) +static enum MoveCanceler CancelerClearFlags(struct BattleContext *ctx) { gBattleMons[ctx->battlerAtk].volatiles.grudge = FALSE; gBattleMons[ctx->battlerAtk].volatiles.glaiveRush = FALSE; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerStanceChangeOne(struct BattleContext *ctx) +static enum MoveCanceler CancelerStanceChangeOne(struct BattleContext *ctx) { if (B_STANCE_CHANGE_FAIL < GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerSkyDrop(struct BattleContext *ctx) +static enum MoveCanceler CancelerSkyDrop(struct BattleContext *ctx) { // If Pokemon is being held in Sky Drop if (gBattleMons[ctx->battlerAtk].volatiles.semiInvulnerable == STATE_SKY_DROP) @@ -1972,11 +1972,11 @@ static enum MoveCanceller CancellerSkyDrop(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerRecharge(struct BattleContext *ctx) +static enum MoveCanceler CancelerRecharge(struct BattleContext *ctx) { if (gDisableStructs[ctx->battlerAtk].rechargeTimer > 0) { - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -1984,7 +1984,7 @@ static enum MoveCanceller CancellerRecharge(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) +static enum MoveCanceler CancelerAsleepOrFrozen(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { @@ -2050,7 +2050,7 @@ static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerObedience(struct BattleContext *ctx) +static enum MoveCanceler CancelerObedience(struct BattleContext *ctx) { if (!gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) { @@ -2105,7 +2105,7 @@ static enum MoveCanceller CancellerObedience(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerPowerPoints(struct BattleContext *ctx) +static enum MoveCanceler CancelerPowerPoints(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].pp[gCurrMovePos] == 0 && ctx->currentMove != MOVE_STRUGGLE @@ -2120,11 +2120,11 @@ static enum MoveCanceller CancellerPowerPoints(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerTruant(struct BattleContext *ctx) +static enum MoveCanceler CancelerTruant(struct BattleContext *ctx) { if (GetBattlerAbility(ctx->battlerAtk) == ABILITY_TRUANT && gDisableStructs[ctx->battlerAtk].truantCounter) { - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; gBattlerAbility = ctx->battlerAtk; @@ -2135,12 +2135,12 @@ static enum MoveCanceller CancellerTruant(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerFlinch(struct BattleContext *ctx) +static enum MoveCanceler CancelerFlinch(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.flinched) { gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2148,7 +2148,7 @@ static enum MoveCanceller CancellerFlinch(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerDisabled(struct BattleContext *ctx) +static enum MoveCanceler CancelerDisabled(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].disabledMove == ctx->currentMove @@ -2156,7 +2156,7 @@ static enum MoveCanceller CancellerDisabled(struct BattleContext *ctx) { gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; gBattleScripting.battler = ctx->battlerAtk; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2164,7 +2164,7 @@ static enum MoveCanceller CancellerDisabled(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx) +static enum MoveCanceler CancelerVolatileBlocked(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gBattleMons[ctx->battlerAtk].volatiles.healBlock @@ -2172,7 +2172,7 @@ static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx) { gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; gBattleScripting.battler = ctx->battlerAtk; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2181,7 +2181,7 @@ static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx) { gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; gBattleScripting.battler = ctx->battlerAtk; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2189,7 +2189,7 @@ static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx) else if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].throatChopTimer > 0 && IsSoundMove(ctx->currentMove)) { gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2197,12 +2197,12 @@ static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerTaunted(struct BattleContext *ctx) +static enum MoveCanceler CancelerTaunted(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].tauntTimer && IsBattleMoveStatus(ctx->currentMove)) { gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_BREAK; @@ -2210,12 +2210,12 @@ static enum MoveCanceller CancellerTaunted(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerImprisoned(struct BattleContext *ctx) +static enum MoveCanceler CancelerImprisoned(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(ctx->battlerAtk, ctx->currentMove)) { gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2223,7 +2223,7 @@ static enum MoveCanceller CancellerImprisoned(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerConfused(struct BattleContext *ctx) +static enum MoveCanceler CancelerConfused(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { @@ -2263,7 +2263,7 @@ static enum MoveCanceller CancellerConfused(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerParalysed(struct BattleContext *ctx) +static enum MoveCanceler CancelerParalysed(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_PARALYSIS && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) @@ -2271,7 +2271,7 @@ static enum MoveCanceller CancellerParalysed(struct BattleContext *ctx) { gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; // This is removed in FRLG and Emerald for some reason - //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; @@ -2279,7 +2279,7 @@ static enum MoveCanceller CancellerParalysed(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerInfatuation(struct BattleContext *ctx) +static enum MoveCanceler CancelerInfatuation(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.infatuation) { @@ -2294,7 +2294,7 @@ static enum MoveCanceller CancellerInfatuation(struct BattleContext *ctx) BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; return MOVE_STEP_FAILURE; } @@ -2302,7 +2302,7 @@ static enum MoveCanceller CancellerInfatuation(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerBide(struct BattleContext *ctx) +static enum MoveCanceler CancelerBide(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.bideTurns) { @@ -2333,7 +2333,7 @@ static enum MoveCanceller CancellerBide(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) +static enum MoveCanceler CancelerZMoves(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE) { @@ -2352,7 +2352,7 @@ static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) +static enum MoveCanceler CancelerChoiceLock(struct BattleContext *ctx) { u16 *choicedMoveAtk = &gBattleStruct->choicedMove[ctx->battlerAtk]; enum HoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk); @@ -2375,7 +2375,7 @@ static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) +static enum MoveCanceler CancelerCallSubmove(struct BattleContext *ctx) { bool32 noEffect = FALSE; u32 calledMove = MOVE_NONE; @@ -2436,7 +2436,7 @@ static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerThaw(struct BattleContext *ctx) +static enum MoveCanceler CancelerThaw(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE) { @@ -2461,14 +2461,14 @@ static enum MoveCanceller CancellerThaw(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerStanceChangeTwo(struct BattleContext *ctx) +static enum MoveCanceler CancelerStanceChangeTwo(struct BattleContext *ctx) { if (B_STANCE_CHANGE_FAIL >= GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerAttackstring(struct BattleContext *ctx) +static enum MoveCanceler CancelerAttackstring(struct BattleContext *ctx) { BattleScriptCall(BattleScript_Attackstring); if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) @@ -2476,7 +2476,7 @@ static enum MoveCanceller CancellerAttackstring(struct BattleContext *ctx) return MOVE_STEP_BREAK; } -static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) +static enum MoveCanceler CancelerPPDeduction(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.multipleTurns || gSpecialStatuses[ctx->battlerAtk].dancerUsedMove @@ -2536,7 +2536,7 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) gBattlescriptCurrInstr = BattleScript_ButItFailed; return MOVE_STEP_FAILURE; } - else if (CancellerVolatileBlocked(ctx) == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove + else if (CancelerVolatileBlocked(ctx) == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove { gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; return MOVE_STEP_FAILURE; @@ -2548,7 +2548,7 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; - // Possibly better to just move type setting and redirection to attackcanceller as a new case at this point + // Possibly better to just move type setting and redirection to attackcanceler as a new case at this point SetTypeBeforeUsingMove(ctx->currentMove, ctx->battlerAtk); HandleMoveTargetRedirection(); gBattlescriptCurrInstr = GetMoveBattleScript(ctx->currentMove); @@ -2559,9 +2559,9 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerWeatherPrimal(struct BattleContext *ctx) +static enum MoveCanceler CancelerWeatherPrimal(struct BattleContext *ctx) { - enum MoveCanceller effect = MOVE_STEP_SUCCESS; + enum MoveCanceler effect = MOVE_STEP_SUCCESS; if (HasWeatherEffect() && GetMovePower(ctx->currentMove) > 0) { enum Type moveType = GetBattleMoveType(ctx->currentMove); @@ -2578,7 +2578,7 @@ static enum MoveCanceller CancellerWeatherPrimal(struct BattleContext *ctx) if (effect == MOVE_STEP_FAILURE) { gProtectStructs[ctx->battlerAtk].chargingTurn = FALSE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; } @@ -2586,7 +2586,7 @@ static enum MoveCanceller CancellerWeatherPrimal(struct BattleContext *ctx) return effect; } -static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) +static enum MoveCanceler CancelerMoveFailure(struct BattleContext *ctx) { const u8 *battleScript = NULL; @@ -2715,7 +2715,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx) +static enum MoveCanceler CancelerPowderStatus(struct BattleContext *ctx) { if (TryActivatePowderStatus(ctx->currentMove)) { @@ -2744,7 +2744,7 @@ bool32 IsDazzlingAbility(enum Ability ability) return FALSE; } -static enum MoveCanceller CancellerPriorityBlock(struct BattleContext *ctx) +static enum MoveCanceler CancelerPriorityBlock(struct BattleContext *ctx) { bool32 effect = FALSE; s32 priority = GetChosenMovePriority(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk]); @@ -2783,7 +2783,7 @@ static enum MoveCanceller CancellerPriorityBlock(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerProtean(struct BattleContext *ctx) +static enum MoveCanceler CancelerProtean(struct BattleContext *ctx) { enum Type moveType = GetBattleMoveType(ctx->currentMove); if (ProteanTryChangeType(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->currentMove, moveType)) @@ -2800,7 +2800,7 @@ static enum MoveCanceller CancellerProtean(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerExplodingDamp(struct BattleContext *ctx) +static enum MoveCanceler CancelerExplodingDamp(struct BattleContext *ctx) { u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); if (dampBattler && IsMoveDampBanned(ctx->currentMove)) @@ -2813,7 +2813,7 @@ static enum MoveCanceller CancellerExplodingDamp(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) +static enum MoveCanceler CancelerMultihitMoves(struct BattleContext *ctx) { if (GetMoveEffect(ctx->currentMove) == EFFECT_MULTI_HIT) { @@ -2885,7 +2885,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) +static enum MoveCanceler CancelerMultiTargetMoves(struct BattleContext *ctx) { u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); enum Ability abilityAtk = ctx->abilities[ctx->battlerAtk]; @@ -2932,50 +2932,50 @@ static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(struct BattleContext *ctx) = +static enum MoveCanceler (*const sMoveSuccessOrderCancelers[])(struct BattleContext *ctx) = { - [CANCELLER_CLEAR_FLAGS] = CancellerClearFlags, - [CANCELLER_STANCE_CHANGE_1] = CancellerStanceChangeOne, - [CANCELLER_SKY_DROP] = CancellerSkyDrop, - [CANCELLER_RECHARGE] = CancellerRecharge, - [CANCELLER_ASLEEP_OR_FROZEN] = CancellerAsleepOrFrozen, - [CANCELLER_OBEDIENCE] = CancellerObedience, - [CANCELLER_POWER_POINTS] = CancellerPowerPoints, - [CANCELLER_TRUANT] = CancellerTruant, - [CANCELLER_FLINCH] = CancellerFlinch, - [CANCELLER_DISABLED] = CancellerDisabled, - [CANCELLER_VOLATILE_BLOCKED] = CancellerVolatileBlocked, - [CANCELLER_TAUNTED] = CancellerTaunted, - [CANCELLER_IMPRISONED] = CancellerImprisoned, - [CANCELLER_CONFUSED] = CancellerConfused, - [CANCELLER_PARALYSED] = CancellerParalysed, - [CANCELLER_INFATUATION] = CancellerInfatuation, - [CANCELLER_BIDE] = CancellerBide, - [CANCELLER_Z_MOVES] = CancellerZMoves, - [CANCELLER_CHOICE_LOCK] = CancellerChoiceLock, - [CANCELLER_CALLSUBMOVE] = CancellerCallSubmove, - [CANCELLER_THAW] = CancellerThaw, - [CANCELLER_STANCE_CHANGE_2] = CancellerStanceChangeTwo, - [CANCELLER_ATTACKSTRING] = CancellerAttackstring, - [CANCELLER_PPDEDUCTION] = CancellerPPDeduction, - [CANCELLER_WEATHER_PRIMAL] = CancellerWeatherPrimal, - [CANCELLER_MOVE_FAILURE] = CancellerMoveFailure, - [CANCELLER_POWDER_STATUS] = CancellerPowderStatus, - [CANCELLER_PRIORITY_BLOCK] = CancellerPriorityBlock, - [CANCELLER_PROTEAN] = CancellerProtean, - [CANCELLER_EXPLODING_DAMP] = CancellerExplodingDamp, - [CANCELLER_MULTIHIT_MOVES] = CancellerMultihitMoves, - [CANCELLER_MULTI_TARGET_MOVES] = CancellerMultiTargetMoves, + [CANCELER_CLEAR_FLAGS] = CancelerClearFlags, + [CANCELER_STANCE_CHANGE_1] = CancelerStanceChangeOne, + [CANCELER_SKY_DROP] = CancelerSkyDrop, + [CANCELER_RECHARGE] = CancelerRecharge, + [CANCELER_ASLEEP_OR_FROZEN] = CancelerAsleepOrFrozen, + [CANCELER_OBEDIENCE] = CancelerObedience, + [CANCELER_POWER_POINTS] = CancelerPowerPoints, + [CANCELER_TRUANT] = CancelerTruant, + [CANCELER_FLINCH] = CancelerFlinch, + [CANCELER_DISABLED] = CancelerDisabled, + [CANCELER_VOLATILE_BLOCKED] = CancelerVolatileBlocked, + [CANCELER_TAUNTED] = CancelerTaunted, + [CANCELER_IMPRISONED] = CancelerImprisoned, + [CANCELER_CONFUSED] = CancelerConfused, + [CANCELER_PARALYSED] = CancelerParalysed, + [CANCELER_INFATUATION] = CancelerInfatuation, + [CANCELER_BIDE] = CancelerBide, + [CANCELER_Z_MOVES] = CancelerZMoves, + [CANCELER_CHOICE_LOCK] = CancelerChoiceLock, + [CANCELER_CALLSUBMOVE] = CancelerCallSubmove, + [CANCELER_THAW] = CancelerThaw, + [CANCELER_STANCE_CHANGE_2] = CancelerStanceChangeTwo, + [CANCELER_ATTACKSTRING] = CancelerAttackstring, + [CANCELER_PPDEDUCTION] = CancelerPPDeduction, + [CANCELER_WEATHER_PRIMAL] = CancelerWeatherPrimal, + [CANCELER_MOVE_FAILURE] = CancelerMoveFailure, + [CANCELER_POWDER_STATUS] = CancelerPowderStatus, + [CANCELER_PRIORITY_BLOCK] = CancelerPriorityBlock, + [CANCELER_PROTEAN] = CancelerProtean, + [CANCELER_EXPLODING_DAMP] = CancelerExplodingDamp, + [CANCELER_MULTIHIT_MOVES] = CancelerMultihitMoves, + [CANCELER_MULTI_TARGET_MOVES] = CancelerMultiTargetMoves, }; -enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx) +enum MoveCanceler AtkCanceler_MoveSuccessOrder(struct BattleContext *ctx) { - enum MoveCanceller effect = MOVE_STEP_SUCCESS; + enum MoveCanceler effect = MOVE_STEP_SUCCESS; - while (gBattleStruct->eventState.atkCanceller < CANCELLER_END && effect == MOVE_STEP_SUCCESS) + while (gBattleStruct->eventState.atkCanceler < CANCELER_END && effect == MOVE_STEP_SUCCESS) { - effect = sMoveSuccessOrderCancellers[gBattleStruct->eventState.atkCanceller](ctx); - gBattleStruct->eventState.atkCanceller++; + effect = sMoveSuccessOrderCancelers[gBattleStruct->eventState.atkCanceler](ctx); + gBattleStruct->eventState.atkCanceler++; } if (effect == MOVE_STEP_REMOVES_STATUS) @@ -3406,7 +3406,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityA && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) { if (option == RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) - CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected + CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; } else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions @@ -3419,7 +3419,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityA { gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. if (!IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) - CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected + CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; return TRUE; // Early return since we don't want to set remaining values } From 370a947cea5a822889149840214c4067b1db0aba Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 22 Nov 2025 22:17:04 +0100 Subject: [PATCH 170/183] Documentation clean up for MoveCanceler (#8297) --- src/battle_util.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index aac4f253d4..2380b1d27f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2019,7 +2019,7 @@ static enum MoveCanceler CancelerAsleepOrFrozen(struct BattleContext *ctx) gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_REMOVES_STATUS; + return MOVE_STEP_FAILURE; } } else @@ -2250,18 +2250,20 @@ static enum MoveCanceler CancelerConfused(struct BattleContext *ctx) gProtectStructs[ctx->battlerAtk].confusionSelfDmg = TRUE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; + return MOVE_STEP_FAILURE; } else { gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; BattleScriptCall(BattleScript_MoveUsedIsConfused); + return MOVE_STEP_BREAK; } } else // snapped out of confusion { BattleScriptCall(BattleScript_MoveUsedIsConfusedNoMore); + return MOVE_STEP_BREAK; } - return MOVE_STEP_BREAK; } return MOVE_STEP_SUCCESS; } @@ -2730,7 +2732,7 @@ static enum MoveCanceler CancelerPowderStatus(struct BattleContext *ctx) || HasTrainerUsedGimmick(ctx->battlerAtk, GIMMICK_Z_MOVE)) gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } From 8d3be426fd1c795569cdc790ad88b133ed8e9d69 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 23 Nov 2025 09:42:43 +0100 Subject: [PATCH 171/183] Remove leftover scrtipt redirection (#8317) --- data/battle_scripts_1.s | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 74cc906a6e..db0b082ce8 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2382,7 +2382,6 @@ BattleScript_EffectHit:: attackcanceler BattleScript_HitFromAccCheck:: accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE -BattleScript_HitFromAtkString:: BattleScript_HitFromCritCalc:: critcalc damagecalc @@ -3114,7 +3113,7 @@ BattleScript_EffectRage:: attackcanceler accuracycheck BattleScript_RageMiss, ACC_CURR_MOVE seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_RAGE - goto BattleScript_HitFromAtkString + goto BattleScript_HitFromCritCalc BattleScript_RageMiss:: clearvolatile BS_ATTACKER, VOLATILE_RAGE goto BattleScript_MoveMissedPause From c2fba193a6e832a0deb8960698566926bcaf5d21 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 23 Nov 2025 12:36:28 +0100 Subject: [PATCH 172/183] Fix Upper Hand failure still activating Protean (#8329) --- data/battle_scripts_1.s | 5 ---- include/battle_scripts.h | 1 - src/battle_script_commands.c | 25 ++----------------- src/battle_util.c | 10 ++++++++ src/data/battle_move_effects.h | 4 +-- .../battle/move_effect/fail_if_not_arg_type.c | 5 +++- test/battle/move_effect/upper_hand.c | 17 +++++++++++++ 7 files changed, 35 insertions(+), 32 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index db0b082ce8..765f2f5b77 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -123,11 +123,6 @@ BattleScript_EffectTidyUpDoMoveAnimation:: restoretarget goto BattleScript_EffectDragonDanceFromStatUp -BattleScript_EffectUpperHand:: - attackcanceler - tryupperhand BattleScript_ButItFailed - goto BattleScript_HitFromAccCheck - BattleScript_EffectShedTail:: attackcanceler waitstate diff --git a/include/battle_scripts.h b/include/battle_scripts.h index c0fdd86645..e2f9f1636c 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -831,7 +831,6 @@ extern const u8 BattleScript_EffectBrickBreak[]; extern const u8 BattleScript_EffectDoodle[]; extern const u8 BattleScript_EffectFilletAway[]; extern const u8 BattleScript_EffectShedTail[]; -extern const u8 BattleScript_EffectUpperHand[]; extern const u8 BattleScript_EffectTidyUp[]; extern const u8 BattleScript_EffectSpicyExtract[]; extern const u8 BattleScript_EffectFickleBeam[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 282243192b..38083c9feb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1268,9 +1268,7 @@ static void Cmd_attackcanceler(void) else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) && (moveEffect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) && (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) - && moveEffect != EFFECT_SUCKER_PUNCH - && moveEffect != EFFECT_COUNTER - && moveEffect != EFFECT_UPPER_HAND) + && moveEffect != EFFECT_COUNTER) { if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; @@ -6070,9 +6068,7 @@ static void Cmd_moveend(void) } break; case PROTECT_OBSTRUCT: - if (moveEffect != EFFECT_SUCKER_PUNCH // Why??? - && moveEffect != EFFECT_UPPER_HAND // Why??? - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -15465,23 +15461,6 @@ void BS_TryDefog(void) } } -void BS_TryUpperHand(void) -{ - NATIVE_ARGS(const u8 *failInstr); - - enum Ability abilityDef = GetBattlerAbility(gBattlerTarget); - u32 prio = GetChosenMovePriority(gBattlerTarget, abilityDef); - - if (HasBattlerActedThisTurn(gBattlerTarget) - || gChosenMoveByBattler[gBattlerTarget] == MOVE_NONE - || IsBattleMoveStatus(gChosenMoveByBattler[gBattlerTarget]) - || prio < 1 - || prio > 3) // Fails if priority is less than 1 or greater than 3, if target already moved, or if using a status - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_TryTriggerStatusForm(void) { NATIVE_ARGS(); diff --git a/src/battle_util.c b/src/battle_util.c index 2380b1d27f..a2f55b9773 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2676,6 +2676,16 @@ static enum MoveCanceler CancelerMoveFailure(struct BattleContext *ctx) || (IsBattleMoveStatus(GetChosenMoveFromPosition(ctx->battlerDef)) && !gProtectStructs[ctx->battlerDef].noValidMoves)) battleScript = BattleScript_ButItFailed; break; + case EFFECT_UPPER_HAND: + { + u32 prio = GetChosenMovePriority(ctx->battlerDef, ctx->abilities[ctx->battlerDef]); + if (prio < 1 || prio > 3 // Fails if priority is less than 1 or greater than 3, if target already moved, or if using a status + || HasBattlerActedThisTurn(ctx->battlerDef) + || gChosenMoveByBattler[ctx->battlerDef] == MOVE_NONE + || IsBattleMoveStatus(gChosenMoveByBattler[ctx->battlerDef])) + battleScript = BattleScript_ButItFailed; + break; + } case EFFECT_SNORE: if (!(gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) && ctx->abilities[ctx->battlerAtk] != ABILITY_COMATOSE) diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 22d90f474a..2cf74c51b1 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1395,7 +1395,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, - + [EFFECT_ENTRAINMENT] = { .battleScript = BattleScript_EffectEntrainment, @@ -2121,7 +2121,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_UPPER_HAND] = { - .battleScript = BattleScript_EffectUpperHand, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points .encourageEncore = TRUE, }, diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index 4be65a5677..b8b6eb3ae9 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -51,7 +51,10 @@ SINGLE_BATTLE_TEST("Burn Up fails if the user has Protean/Libero and is not a Fi TURN { MOVE(opponent, MOVE_BURN_UP); } } SCENE { MESSAGE("The opposing Kecleon used Burn Up!"); - NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); } + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); + } MESSAGE("But it failed!"); } } diff --git a/test/battle/move_effect/upper_hand.c b/test/battle/move_effect/upper_hand.c index 36b35781e3..0da2b6f0ec 100644 --- a/test/battle/move_effect/upper_hand.c +++ b/test/battle/move_effect/upper_hand.c @@ -154,3 +154,20 @@ DOUBLE_BATTLE_TEST("Upper Hand fails if the target has attempted to act even if NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_UPPER_HAND, playerLeft); } } + +SINGLE_BATTLE_TEST("Upper Hand failing will prevent Protean activation") +{ + GIVEN { + WITH_CONFIG(GEN_PROTEAN_LIBERO, GEN_6); + PLAYER(SPECIES_REGIROCK); + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_UPPER_HAND); } + } SCENE { + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_UPPER_HAND, player); + } + } +} From c7c97531ecb655da0a38139bb8029beb9bc6335b Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 23 Nov 2025 16:32:14 +0000 Subject: [PATCH 173/183] Clear Destiny Bond/Grudge bits when not activated (#8334) --- src/battle_script_commands.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 38083c9feb..adea3fb925 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4982,6 +4982,8 @@ static void MoveValuesCleanUp(void) gBattleScripting.moveEffect = MOVE_EFFECT_NONE; gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; gBattleCommunication[MISS_TYPE] = 0; + gBattleStruct->tryDestinyBond = FALSE; + gBattleStruct->tryGrudge = FALSE; } static void Cmd_movevaluescleanup(void) @@ -7059,6 +7061,8 @@ static void Cmd_moveend(void) gBattleStruct->additionalEffectsCounter = 0; gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleStruct->fickleBeamBoosted = FALSE; + gBattleStruct->tryDestinyBond = FALSE; + gBattleStruct->tryGrudge = FALSE; gBattleStruct->battlerState[gBattlerAttacker].usedMicleBerry = FALSE; gBattleStruct->noTargetPresent = FALSE; gBattleStruct->toxicChainPriority = FALSE; From a4482f0ee237ea32b0bdd0db088393b09a608fc6 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Sun, 23 Nov 2025 19:04:44 +0100 Subject: [PATCH 174/183] Rework switch AI and add more tests for ace pokemon flags (#8321) --- include/battle_ai_switch_items.h | 3 +- src/battle_ai_main.c | 4 +- src/battle_ai_switch_items.c | 55 ++++++++++-------- src/battle_ai_util.c | 4 +- src/battle_controller_opponent.c | 96 ++----------------------------- test/battle/ai/ai_multi.c | 97 ++++++++++++++++++++++++++++++++ test/battle/ai/ai_switching.c | 2 +- 7 files changed, 142 insertions(+), 119 deletions(-) diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch_items.h index 35085563a4..7612d2084a 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch_items.h @@ -38,7 +38,8 @@ enum ShouldSwitchScenario enum SwitchType { SWITCH_AFTER_KO, - SWITCH_MID_BATTLE, + SWITCH_MID_BATTLE_FORCED, + SWITCH_MID_BATTLE_OPTIONAL, }; void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 9612d544f6..5db2732d4d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -359,13 +359,13 @@ void ComputeBattlerDecisions(u32 battler) if (isAiBattler || CanAiPredictMove()) { // Risky AI switches aggressively even mid battle - enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; + enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE_OPTIONAL; gAiLogicData->aiCalcInProgress = TRUE; // Setup battler and prediction data BattleAI_SetupAIData(0xF, battler); - SetupAIPredictionData(battler, switchType); + SetupAIPredictionData(battler, SWITCH_MID_BATTLE_OPTIONAL); // AI's own switching data if (isAiBattler) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 1a393fc66f..7d150d1a3b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1517,22 +1517,19 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva return bestMonId; } -static u32 GetFirstNonInvalidMon(u32 firstId, u32 lastId, u32 invalidMons, u32 battlerIn1, u32 battlerIn2) +static u32 GetFirstNonInvalidMon(u32 firstId, u32 lastId, u32 invalidMons) { - if (!IsDoubleBattle()) - return PARTY_SIZE; - - if (PARTY_SIZE != gBattleStruct->monToSwitchIntoId[battlerIn1] - && PARTY_SIZE != gBattleStruct->monToSwitchIntoId[battlerIn2]) - return PARTY_SIZE; - - for (u32 chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) + u32 chosenMonId = PARTY_SIZE; + for (u32 i = (lastId-1); i > firstId; i--) { - if ((1 << (chosenMonId)) & invalidMons) - continue; - return chosenMonId; // first non invalid mon found + if (!((1 << i) & invalidMons)) + { + // first non invalid mon found + chosenMonId = i; + break; + } } - return PARTY_SIZE; + return chosenMonId; } bool32 IsMonGrounded(enum HoldEffect heldItemEffect, enum Ability ability, enum Type type1, enum Type type2) @@ -2125,7 +2122,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, int batonPassId = PARTY_SIZE, typeMatchupId = PARTY_SIZE, typeMatchupEffectiveId = PARTY_SIZE, defensiveMonId = PARTY_SIZE, aceMonId = PARTY_SIZE, trapperId = PARTY_SIZE; int i, j, aliveCount = 0, bits = 0, aceMonCount = 0; s32 defensiveMonHitKOThreshold = 3; // 3HKO threshold that candidate defensive mons must exceed - s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; + s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0, monMaxDamage = 0; u32 aiMove, hitsToKOAI, hitsToKOPlayer, hitsToKOAIPriority, bestPlayerMove = MOVE_NONE, bestPlayerPriorityMove = MOVE_NONE, maxHitsToKO = 0; u32 bestResist = UQ_4_12(2.0), bestResistEffective = UQ_4_12(2.0), typeMatchup; // 2.0 is the default "Neutral" matchup from GetBattleMonTypeMatchup bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, isSwitchinFirstPriority, canSwitchinWin1v1; @@ -2167,6 +2164,8 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, hitsToKOAIPriority = GetSwitchinHitsToKO(GetMaxPriorityDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &bestPlayerPriorityMove), battler); typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); + monMaxDamage = 0; + // Check through current mon's moves for (j = 0; j < MAX_MON_MOVES; j++) { @@ -2232,6 +2231,8 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, && damageDealt < playerMonHP) continue; + if (damageDealt > monMaxDamage) + monMaxDamage = damageDealt; // Check that mon isn't one shot and set best damage mon if (damageDealt > maxDamageDealt) { @@ -2275,6 +2276,8 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, trapperId = i; } } + if (monMaxDamage == 0) + invalidMons |= 1u << i; } batonPassId = GetRandomSwitchinWithBatonPass(aliveCount, bits, firstId, lastId, i); @@ -2304,16 +2307,19 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, else if (batonPassId != PARTY_SIZE) return batonPassId; else if (generic1v1MonId != PARTY_SIZE) return generic1v1MonId; } - // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) - return aceMonId; + + if (switchType == SWITCH_MID_BATTLE_OPTIONAL) + return PARTY_SIZE; // Fallback - u32 bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons, battlerIn1, battlerIn2); + u32 bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons); if (bestMonId != PARTY_SIZE) return bestMonId; + // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount) + return aceMonId; + return PARTY_SIZE; } @@ -2429,16 +2435,17 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) if (bestMonId != PARTY_SIZE) return bestMonId; - // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) - return aceMonId; + if (switchType == SWITCH_MID_BATTLE_OPTIONAL) + return PARTY_SIZE; // Fallback - bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons, battlerIn1, battlerIn2); + bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons); if (bestMonId != PARTY_SIZE) return bestMonId; + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount) + return aceMonId; + return PARTY_SIZE; } } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 8ab0c83a92..57d46b4810 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -4567,7 +4567,9 @@ s32 CountUsablePartyMons(u32 battlerId) } ret = 0; - for (i = 0; i < PARTY_SIZE; i++) + s32 firstId, lastId; + GetAIPartyIndexes(battlerId, &firstId, &lastId); + for (i = firstId; i < lastId; i++) { if (i != battlerOnField1 && i != battlerOnField2 && GetMonData(&party[i], MON_DATA_HP) != 0 diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index b03dcd958d..e7477f9542 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -51,8 +51,6 @@ static void OpponentHandleChoosePokemon(u32 battler); static void OpponentHandleIntroTrainerBallThrow(u32 battler); static void OpponentHandleDrawPartyStatusSummary(u32 battler); static void OpponentHandleEndLinkBattle(u32 battler); -static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore); - static void OpponentBufferRunCommand(u32 battler); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = @@ -527,70 +525,9 @@ static void OpponentHandleChooseItem(u32 battler) BtlController_Complete(battler); } -static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) -{ - return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON - && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) - && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle; -} - -static inline bool32 IsDoubleAceSlot(u32 battler, u32 partyId) -{ - u32 partyCountEnd; - - if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON)) - return FALSE; - - partyCountEnd = CalculateEnemyPartyCountInSide(battler); - if (partyCountEnd == 0) - return FALSE; - - if (partyId == partyCountEnd - 1) - return TRUE; - if (partyCountEnd > 1 && partyId == partyCountEnd - 2) - return TRUE; - - return FALSE; -} - -static inline bool32 IsDoubleAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) -{ - s32 battler1, battler2, firstId, lastId; - s32 i; - - if (!IsDoubleAceSlot(battler, chosenMonId)) - return FALSE; - - if (!IsDoubleBattle()) - { - battler2 = battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - } - else - { - battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - } - - GetAIPartyIndexes(battler, &firstId, &lastId); - for (i = firstId; i < lastId; i++) - { - if (!IsValidForBattle(&gEnemyParty[i]) - || i == gBattlerPartyIndexes[battler1] - || i == gBattlerPartyIndexes[battler2] - || i == chosenMonId) - continue; - - if (!IsAcePokemon(i, pokemonInBattle, battler) && !IsDoubleAceSlot(battler, i)) - return TRUE; - } - - return FALSE; -} - static void OpponentHandleChoosePokemon(u32 battler) { s32 chosenMonId; - s32 pokemonInBattle = 1; enum SwitchType switchType = SWITCH_AFTER_KO; // Choosing Revival Blessing target @@ -602,7 +539,7 @@ static void OpponentHandleChoosePokemon(u32 battler) else if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { if (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch) - switchType = SWITCH_MID_BATTLE; + switchType = SWITCH_MID_BATTLE_FORCED; // reset the AI data to consider the correct on-field state at time of switch SetBattlerAiData(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), gAiLogicData); @@ -610,7 +547,7 @@ static void OpponentHandleChoosePokemon(u32 battler) SetBattlerAiData(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT), gAiLogicData); chosenMonId = GetMostSuitableMonToSwitchInto(battler, switchType); - if (chosenMonId == PARTY_SIZE) + if (chosenMonId == PARTY_SIZE) // Advanced logic failed so we pick the next available battler { s32 battler1, battler2, firstId, lastId; @@ -622,19 +559,14 @@ static void OpponentHandleChoosePokemon(u32 battler) { battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - pokemonInBattle = 2; } GetAIPartyIndexes(battler, &firstId, &lastId); - for (chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) + for (chosenMonId = firstId; chosenMonId < lastId; chosenMonId++) { - if (!IsValidForBattle(&gEnemyParty[chosenMonId]) - || chosenMonId == gBattlerPartyIndexes[battler1] - || chosenMonId == gBattlerPartyIndexes[battler2]) - continue; - - if (!IsAcePokemon(chosenMonId, pokemonInBattle, battler) - && !IsDoubleAcePokemon(chosenMonId, pokemonInBattle, battler)) + if (IsValidForBattle(&gEnemyParty[chosenMonId]) + && chosenMonId != gBattlerPartyIndexes[battler1] + && chosenMonId != gBattlerPartyIndexes[battler2]) break; } } @@ -653,22 +585,6 @@ static void OpponentHandleChoosePokemon(u32 battler) BtlController_Complete(battler); } -static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore) -{ - u16 i, count; - - for (i = 0, count = 0; i < PARTY_SIZE; i++) - { - if (i != slotToIgnore - && IsValidForBattle(&gEnemyParty[i])) - { - count++; - } - } - - return count; -} - static void OpponentHandleIntroTrainerBallThrow(u32 battler) { BtlController_HandleIntroTrainerBallThrow(battler, 0, NULL, 0, Intro_TryShinyAnimShowHealthbox); diff --git a/test/battle/ai/ai_multi.c b/test/battle/ai/ai_multi.c index ddbfdb49b0..b46573b4ca 100644 --- a/test/battle/ai/ai_multi.c +++ b/test/battle/ai/ai_multi.c @@ -125,3 +125,100 @@ AI_TWO_VS_ONE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (2v1)" TURN { EXPECT_MOVE(opponentLeft, MOVE_EXPLOSION, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_EXPLOSION); } } } + +AI_MULTI_BATTLE_TEST("Partner will not steal your pokemon when running out") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WYNAUT) { Moves(MOVE_MEMENTO); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {EXPECT_MOVE(playerRight, MOVE_MEMENTO, target:opponentLeft);} + TURN {} + } THEN { + EXPECT_EQ(gAbsentBattlerFlags, (1u << GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))); + } +} + +AI_MULTI_BATTLE_TEST("Partner will not steal your pokemon to delay using their ace") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_PLAYER_RIGHT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WYNAUT) { Moves(MOVE_MEMENTO); } + MULTI_PARTNER(SPECIES_METAGROSS) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {EXPECT_MOVE(playerRight, MOVE_MEMENTO, target:opponentLeft);} + TURN {} + } THEN { + EXPECT_EQ(SPECIES_METAGROSS, playerRight->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle to delay using their ace") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); HP(1);} + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + TURN {MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle when forced out") +{ + u32 item, move; + PARAMETRIZE {item = ITEM_EJECT_BUTTON; move = MOVE_TACKLE;} + PARAMETRIZE {item = ITEM_EJECT_PACK; move = MOVE_TAIL_WHIP;} + PARAMETRIZE {item = ITEM_NONE; move = MOVE_ROAR;} + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Item(item);} + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {MOVE(playerLeft, move, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle when forced out 2") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_GOLISOPOD) { Moves(MOVE_CELEBRATE); HP(101); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT);} + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN {MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index f3c8cb6103..82311202c6 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -359,7 +359,7 @@ AI_SINGLE_BATTLE_TEST("When AI switches out due to having no move that affects t OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } OPPONENT(SPECIES_ABRA) { Moves(MOVE_TACKLE); } } WHEN { - TURN { MOVE(player, MOVE_SHADOW_BALL); EXPECT_SWITCH(opponent, 2); EXPECT_SEND_OUT(opponent, 4); } + TURN { MOVE(player, MOVE_SHADOW_BALL); EXPECT_SWITCH(opponent, 2); EXPECT_SEND_OUT(opponent, 0);} TURN { MOVE(player, MOVE_SHADOW_BALL); EXPECT_MOVE(opponent, MOVE_TACKLE); } } } From 9fde188033cd8551fc7ee753e13e3a03767ee3e2 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Tue, 25 Nov 2025 17:04:30 +0000 Subject: [PATCH 175/183] Expand usage of FaintedActions enum in HandleFaintedMonActions (#8346) --- src/battle_util.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index a2f55b9773..5507c19497 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1846,18 +1846,18 @@ bool32 HandleFaintedMonActions(void) && !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler))) { BattleScriptExecute(BattleScript_GiveExp); - gBattleStruct->eventState.faintedAction = 2; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_SET_ABSENT_FLAGS; return TRUE; } } while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount); - gBattleStruct->eventState.faintedAction = 3; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_WAIT_STATE; break; case FAINTED_ACTIONS_SET_ABSENT_FLAGS: OpponentSwitchInResetSentPokesToOpponentValue(gBattlerFainted); if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount) - gBattleStruct->eventState.faintedAction = 3; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_WAIT_STATE; else - gBattleStruct->eventState.faintedAction = 1; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_GIVE_EXP; // Don't switch mons until all pokemon performed their actions or the battle's over. if (B_FAINT_SWITCH_IN >= GEN_4 && gBattleOutcome == 0 @@ -1865,7 +1865,7 @@ bool32 HandleFaintedMonActions(void) && gCurrentTurnActionNumber != gBattlersCount) { gAbsentBattlerFlags |= 1u << gBattlerFainted; - if (gBattleStruct->eventState.faintedAction != 1) + if (gBattleStruct->eventState.faintedAction != FAINTED_ACTIONS_GIVE_EXP) return FALSE; } break; @@ -1889,7 +1889,7 @@ bool32 HandleFaintedMonActions(void) && !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler))) { BattleScriptExecute(BattleScript_HandleFaintedMon); - gBattleStruct->eventState.faintedAction = 5; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_HANDLE_NEXT_BATTLER; return TRUE; } } while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount); @@ -1899,7 +1899,7 @@ bool32 HandleFaintedMonActions(void) if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount) gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_MAX_CASE; else - gBattleStruct->eventState.faintedAction = 4; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_HANDLE_FAINTED_MON; break; case FAINTED_ACTIONS_MAX_CASE: break; From 2d628aca0ebe55a1a958754df7a67bcdbae0108e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 27 Nov 2025 17:42:16 +0100 Subject: [PATCH 176/183] Move end clear bits clean up (#8354) Co-authored-by: PhallenTree <168426989+PhallenTree@users.noreply.github.com> --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 6 ++-- include/battle.h | 3 +- include/battle_util.h | 1 - include/constants/battle.h | 2 +- src/battle_ai_main.c | 2 +- src/battle_debug.c | 2 +- src/battle_end_turn.c | 4 +-- src/battle_script_commands.c | 54 ++++++++++++++++++++------------ src/battle_tv.c | 2 +- src/battle_util.c | 2 +- test/battle/move_effect/charge.c | 7 ++--- 12 files changed, 48 insertions(+), 39 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 1f99e53e4e..c384571776 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1099,7 +1099,7 @@ .byte 0xca .endm - .macro setcharge battler:req + .macro unused_0xcb battler:req .byte 0xcb .byte \battler .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 765f2f5b77..48324bd149 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2291,7 +2291,7 @@ BattleScript_TryTailwindAbilitiesLoop_WindRider: BattleScript_TryTailwindAbilitiesLoop_WindPower: call BattleScript_AbilityPopUp - setcharge BS_TARGET + setvolatile BS_TARGET, VOLATILE_CHARGE_TIMER, 2 printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG goto BattleScript_TryTailwindAbilitiesLoop_Increment @@ -4022,7 +4022,7 @@ BattleScript_EffectFollowMe:: BattleScript_EffectCharge:: attackcanceler - setcharge BS_ATTACKER + setvolatile BS_ATTACKER, VOLATILE_CHARGE_TIMER, 2 attackanimation waitanimation .if B_CHARGE_SPDEF_RAISE >= GEN_5 @@ -5339,7 +5339,7 @@ BattleScript_AngerShellRet: BattleScript_WindPowerActivates:: call BattleScript_AbilityPopUp - setcharge BS_TARGET + setvolatile BS_TARGET, VOLATILE_CHARGE_TIMER, 1 printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG return diff --git a/include/battle.h b/include/battle.h index 92018ea8db..36fec03bdd 100755 --- a/include/battle.h +++ b/include/battle.h @@ -102,8 +102,7 @@ struct DisableStruct u8 battlerWithSureHit; u8 isFirstTurn; u8 mimickedMoves:4; - u8 chargeTimer:4; - u8 rechargeTimer; + u8 rechargeTimer:4; u8 autotomizeCount; u16 slowStartTimer; u16 embargoTimer; diff --git a/include/battle_util.h b/include/battle_util.h index e6855af5b5..15a156dac4 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -407,7 +407,6 @@ bool32 IsPursuitTargetSet(void); void ClearPursuitValuesIfSet(u32 battler); void ClearPursuitValues(void); bool32 HasWeatherEffect(void); -bool32 IsAnyTargetAffected(u32 battlerAtk); bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void ChooseStatBoostAnimation(u32 battler); diff --git a/include/constants/battle.h b/include/constants/battle.h index fe8ff2b0a7..8dacb7a60a 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -199,7 +199,7 @@ enum VolatileFlags F(VOLATILE_LOCK_ON, lockOn, (u32, 2), V_BATON_PASSABLE) \ F(VOLATILE_PERISH_SONG, perishSong, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_MINIMIZE, minimize, (u32, 1)) \ - F(VOLATILE_CHARGE, charge, (u32, 1)) \ + F(VOLATILE_CHARGE_TIMER, chargeTimer, (u32, 2)) \ F(VOLATILE_ROOT, root, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_YAWN, yawn, (u32, 2)) \ F(VOLATILE_IMPRISON, imprison, (u32, 1)) \ diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 5db2732d4d..5fc7e3fcbf 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1447,7 +1447,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_CHARGE: - if (gBattleMons[battlerAtk].volatiles.charge) + if (gBattleMons[battlerAtk].volatiles.chargeTimer > 0) ADJUST_SCORE(-20); else if (!HasMoveWithType(battlerAtk, TYPE_ELECTRIC)) ADJUST_SCORE(-10); diff --git a/src/battle_debug.c b/src/battle_debug.c index 23e8a74ff6..836329d660 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -378,7 +378,7 @@ static const struct ListMenuItem sVolatileStatusListItems[] = {COMPOUND_STRING("Lock On"), VOLATILE_LOCK_ON}, {COMPOUND_STRING("Perish Song"), VOLATILE_PERISH_SONG}, {COMPOUND_STRING("Minimize"), VOLATILE_MINIMIZE}, - {COMPOUND_STRING("Charge"), VOLATILE_CHARGE}, + {COMPOUND_STRING("Charge"), VOLATILE_CHARGE_TIMER}, {COMPOUND_STRING("Root"), VOLATILE_ROOT}, {COMPOUND_STRING("Yawn"), VOLATILE_YAWN}, {COMPOUND_STRING("Imprison"), VOLATILE_IMPRISON}, diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index d6d8601383..b4d71c2cf4 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -63,8 +63,8 @@ static bool32 HandleEndTurnVarious(u32 battler) if (gBattleMons[i].volatiles.lockOn > 0) gBattleMons[i].volatiles.lockOn--; - if (gDisableStructs[i].chargeTimer > 0 && --gDisableStructs[i].chargeTimer == 0) - gBattleMons[i].volatiles.charge = FALSE; + if (B_CHARGE < GEN_9 && gBattleMons[i].volatiles.chargeTimer > 0) + gBattleMons[i].volatiles.chargeTimer--; if (gDisableStructs[i].laserFocusTimer > 0 && --gDisableStructs[i].laserFocusTimer == 0) gBattleMons[i].volatiles.laserFocus = FALSE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index adea3fb925..6caa81050f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -336,6 +336,8 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u static void ResetValuesForCalledMove(void); static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd); static bool32 CanAbilityShieldActivateForBattler(u32 battler); +static void TryClearChargeVolatile(u32 moveType); +static bool32 IsAnyTargetAffected(void); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); @@ -540,7 +542,7 @@ static void Cmd_unused_0xC7(void); static void Cmd_unused_c8(void); static void Cmd_trymemento(void); static void Cmd_setforcedtarget(void); -static void Cmd_setcharge(void); +static void Cmd_unused_0xcb(void); static void Cmd_unused_0xCC(void); static void Cmd_curestatuswithmove(void); static void Cmd_settorment(void); @@ -799,7 +801,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_unused_c8, //0xC8 Cmd_trymemento, //0xC9 Cmd_setforcedtarget, //0xCA - Cmd_setcharge, //0xCB + Cmd_unused_0xcb, //0xCB Cmd_unused_0xCC, //0xCC Cmd_curestatuswithmove, //0xCD Cmd_settorment, //0xCE @@ -1017,6 +1019,33 @@ bool32 IsMoveNotAllowedInSkyBattles(u32 move) return (gBattleStruct->isSkyBattle && IsMoveSkyBattleBanned(gCurrentMove)); } +static void TryClearChargeVolatile(u32 moveType) +{ + if (B_CHARGE < GEN_9) // Prior to gen9, charge is cleared during the end turn + return; + + if (gBattleMons[gBattlerAttacker].volatiles.chargeTimer == 2) // Has been set this turn by move + gBattleMons[gBattlerAttacker].volatiles.chargeTimer--; + else if (moveType == TYPE_ELECTRIC && gBattleMons[gBattlerAttacker].volatiles.chargeTimer == 1) + gBattleMons[gBattlerAttacker].volatiles.chargeTimer = 0; +} + +static bool32 IsAnyTargetAffected(void) +{ + if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + return FALSE; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (battler == gBattlerAttacker) + continue; + + if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) + return TRUE; + } + return FALSE; +} + u32 NumAffectedSpreadMoveTargets(void) { u32 targetCount = 0; @@ -7025,9 +7054,7 @@ static void Cmd_moveend(void) gBattleScripting.moveendState++; break; case MOVEEND_SAME_MOVE_TURNS: - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] - || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT - || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] || !IsAnyTargetAffected()) gBattleStruct->metronomeItemCounter[gBattlerAttacker] = 0; else if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) gBattleStruct->metronomeItemCounter[gBattlerAttacker]++; @@ -7049,12 +7076,10 @@ static void Cmd_moveend(void) && gBattleMons[gBattlerAttacker].volatiles.lockConfusionTurns != 1) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); // Cancel it + TryClearChargeVolatile(moveType); ValidateSavedBattlerCounts(); gProtectStructs[gBattlerAttacker].shellTrap = FALSE; gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE; - gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; - gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; - gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_NONE; gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->categoryOverride = FALSE; @@ -7070,8 +7095,6 @@ static void Cmd_moveend(void) gBattleStruct->pledgeMove = FALSE; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); - if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - gBattleMons[gBattlerAttacker].volatiles.charge = FALSE; if (gBattleMons[gBattlerAttacker].volatiles.destinyBond > 0) gBattleMons[gBattlerAttacker].volatiles.destinyBond--; if (moveEffect == EFFECT_ECHOED_VOICE && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)) @@ -12591,17 +12614,8 @@ static void Cmd_setforcedtarget(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setcharge(void) +static void Cmd_unused_0xcb(void) { - CMD_ARGS(u8 battler); - - u8 battler = GetBattlerForBattleScript(cmd->battler); - gBattleMons[battler].volatiles.charge = TRUE; - if (B_CHARGE < GEN_9) - gDisableStructs[battler].chargeTimer = 2; - else - gDisableStructs[battler].chargeTimer = 0; - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_unused_0xCC(void) diff --git a/src/battle_tv.c b/src/battle_tv.c index 9444e4dea3..a56862aa26 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -603,7 +603,7 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->side[atkSide].usedMoveSlot = moveSlot; AddMovePoints(PTS_MOVE_EFFECT, moveSlot, move, 0); AddPointsBasedOnWeather(weatherFlags, move, moveSlot); - if (gBattleMons[gBattlerAttacker].volatiles.charge) + if (gBattleMons[gBattlerAttacker].volatiles.chargeTimer > 0) AddMovePoints(PTS_ELECTRIC, move, moveSlot, 0); if (move == MOVE_WISH) diff --git a/src/battle_util.c b/src/battle_util.c index 5507c19497..dfb1b8a35e 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7137,7 +7137,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) if (gSpecialStatuses[battlerAtk].gemBoost) modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(gSpecialStatuses[battlerAtk].gemParam))); - if (gBattleMons[battlerAtk].volatiles.charge && moveType == TYPE_ELECTRIC) + if (moveType == TYPE_ELECTRIC && gBattleMons[battlerAtk].volatiles.chargeTimer > 0) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (GetMoveEffect(ctx->chosenMove) == EFFECT_ME_FIRST) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c index 8883529223..48b77d8bdc 100644 --- a/test/battle/move_effect/charge.c +++ b/test/battle/move_effect/charge.c @@ -131,7 +131,7 @@ SINGLE_BATTLE_TEST("Charge's effect is removed regardless if the next move is El } } -SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") +SINGLE_BATTLE_TEST("Charge will expire if user flinches while using an electric move") { s16 damage[2]; GIVEN { @@ -151,9 +151,6 @@ SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - if (B_CHARGE < GEN_9) - EXPECT_EQ(damage[0], damage[1]); - else - EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + EXPECT_EQ(damage[0], damage[1]); } } From a885abe106447da6e0ce01507ee848f0872ddcd6 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Thu, 27 Nov 2025 16:42:59 +0000 Subject: [PATCH 177/183] Fix player and partner trainer sprite palettes to 8 and 9, preventing unwanted palette changes (#8127) --- src/battle_controllers.c | 8 +++++--- src/battle_gfx_sfx_util.c | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 7fbbeb9db6..df2365f8d8 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2367,7 +2367,8 @@ void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 is if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); } gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = DISPLAY_WIDTH; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = -2; @@ -2392,7 +2393,8 @@ void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId) 30); if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = -96; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = 2; } @@ -2740,7 +2742,7 @@ void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, c paletteNum = AllocSpritePalette(tagTrainerPal); LoadPalette(trainerPal, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = paletteNum; + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); } else { diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index e7679d2b6d..0c2b0d5c20 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -696,8 +696,9 @@ void DecompressTrainerBackPic(u16 backPicId, u8 battler) { u8 position = GetBattlerPosition(battler); CopyTrainerBackspriteFramesToDest(backPicId, gMonSpritesGfxPtr->spritesGfx[position]); + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour LoadPalette(gTrainerBacksprites[backPicId].palette.data, - OBJ_PLTT_ID(battler), PLTT_SIZE_4BPP); + OBJ_PLTT_ID(8 + battler/2), PLTT_SIZE_4BPP); } void FreeTrainerFrontPicPalette(u16 frontPicId) From 6277541baa8f0d05f285287002136fc02bace671 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 29 Nov 2025 15:12:07 -0300 Subject: [PATCH 178/183] Slight Protect moveend cleanup (#8385) --- src/battle_script_commands.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e7e20e8f8f..07cb240c7e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6062,9 +6062,7 @@ static void Cmd_moveend(void) if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + SWAP(gBattlerAttacker, gBattlerTarget, i); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable if (B_KINGS_SHIELD_LOWER_ATK >= GEN_8) gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; else @@ -6079,7 +6077,6 @@ static void Cmd_moveend(void) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_POISON; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); BattleScriptCall(BattleScript_BanefulBunkerEffect); effect = 1; } @@ -6088,10 +6085,8 @@ static void Cmd_moveend(void) if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) { - gEffectBattler = gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_BURN; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BURNING_BULWARK); BattleScriptCall(BattleScript_BanefulBunkerEffect); effect = 1; } @@ -6100,9 +6095,7 @@ static void Cmd_moveend(void) if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + SWAP(gBattlerAttacker, gBattlerTarget, i); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_2; BattleScriptCall(BattleScript_KingsShieldEffect); effect = 1; @@ -6112,9 +6105,7 @@ static void Cmd_moveend(void) if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + SWAP(gBattlerAttacker, gBattlerTarget, i); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; BattleScriptCall(BattleScript_KingsShieldEffect); effect = 1; From 6daab57bd5727997c2c149d084ccd60741336f95 Mon Sep 17 00:00:00 2001 From: PCG <75729017+PCG06@users.noreply.github.com> Date: Sun, 30 Nov 2025 16:33:35 +0530 Subject: [PATCH 179/183] Fix compiling using `make debug` (#8380) --- src/pokemon_summary_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index ae117219d9..ca94df5321 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1960,7 +1960,7 @@ bool32 CheckRelearnerStateFlag(enum MoveRelearnerStates state) void TryUpdateRelearnType(enum IncrDecrUpdateValues delta) { - u32 moveCount; + u32 moveCount = 0; u32 zeroCounter = 0; enum MoveRelearnerStates state = gMoveRelearnerState; From bcf90b71a78d027cdb00211d2f29111f019134ef Mon Sep 17 00:00:00 2001 From: moostoet <70690976+moostoet@users.noreply.github.com> Date: Sun, 30 Nov 2025 12:44:55 +0100 Subject: [PATCH 180/183] Prevent double Dynamax for single-trainer 2v1 multi battles (#8323) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_ai_main.c | 1 + src/battle_ai_switch_items.c | 2 ++ src/battle_controller_opponent.c | 5 ++++- src/battle_controller_player_partner.c | 5 ++++- src/battle_gimmick.c | 19 +++++++------------ src/battle_util.c | 10 +++------- test/battle/ai/gimmick_dynamax.c | 24 ++++++++++++++++++++++++ 7 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 5fc7e3fcbf..abe8cbf696 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -640,6 +640,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) u32 battlerAtk, battlersCount, weather; memset(aiData, 0, sizeof(struct AiLogicData)); + gAiBattleData->aiUsingGimmick = 0; if (!(gBattleTypeFlags & BATTLE_TYPE_HAS_AI) && !IsWildMonSmart()) return; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 7d150d1a3b..c04b22d417 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1351,6 +1351,7 @@ void AI_TrySwitchOrUseItem(u32 battler) if (gAiLogicData->shouldSwitch & (1u << battler) && IsSwitchinValid(battler)) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); + SetAIUsingGimmick(battler, NO_GIMMICK); if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { s32 monToSwitchId = gAiLogicData->mostSuitableMonId[battler]; @@ -1397,6 +1398,7 @@ void AI_TrySwitchOrUseItem(u32 battler) } else if (ShouldUseItem(battler)) { + SetAIUsingGimmick(battler, NO_GIMMICK); return; } } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index e7477f9542..a2d40bc5e1 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -462,12 +462,15 @@ static void OpponentHandleChooseMove(u32 battler) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } // If opponent can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) + enum Gimmick usableGimmick = gBattleStruct->gimmick.usableGimmick[battler]; + if (usableGimmick != GIMMICK_NONE && IsAIUsingGimmick(battler) && !HasTrainerUsedGimmick(battler, usableGimmick)) { + gBattleStruct->gimmick.toActivate |= 1u << battler; BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { + SetAIUsingGimmick(battler, NO_GIMMICK); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 6973dbbc28..37af6497df 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -269,12 +269,15 @@ static void PlayerPartnerHandleChooseMove(u32 battler) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } // If partner can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) + enum Gimmick usableGimmick = gBattleStruct->gimmick.usableGimmick[battler]; + if (usableGimmick != GIMMICK_NONE && IsAIUsingGimmick(battler) && !HasTrainerUsedGimmick(battler, usableGimmick)) { + gBattleStruct->gimmick.toActivate |= 1u << battler; BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { + SetAIUsingGimmick(battler, NO_GIMMICK); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index 38d60d4365..3969932faf 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -91,20 +91,15 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick) // Returns whether a trainer has used a gimmick during a battle. bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick) { - // Check whether partner battler has used gimmick or plans to during turn. - if (IsDoubleBattle() - && IsPartnerMonFromSameTrainer(battler) - && (gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] - || ((gBattleStruct->gimmick.toActivate & (1u << BATTLE_PARTNER(battler)) - && gBattleStruct->gimmick.usableGimmick[BATTLE_PARTNER(battler)] == gimmick)))) + if (IsDoubleBattle() && IsPartnerMonFromSameTrainer(battler)) { - return TRUE; - } - // Otherwise, return whether current battler has used gimmick. - else - { - return gBattleStruct->gimmick.activated[battler][gimmick]; + u32 partner = BATTLE_PARTNER(battler); + if (gBattleStruct->gimmick.activated[partner][gimmick] + || ((gBattleStruct->gimmick.toActivate & (1u << partner)) && gBattleStruct->gimmick.usableGimmick[partner] == gimmick)) + return TRUE; } + + return gBattleStruct->gimmick.activated[battler][gimmick]; } // Sets a gimmick as used by a trainer with checks for Multi Battles. diff --git a/src/battle_util.c b/src/battle_util.c index 95514cd82a..68e89fc93b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8938,14 +8938,10 @@ s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler) bool32 IsPartnerMonFromSameTrainer(u32 battler) { - if (!IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - return FALSE; - else if (IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - return FALSE; - else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - return FALSE; + if (!IsOnPlayerSide(battler)) + return !(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS); else - return TRUE; + return !(gBattleTypeFlags & BATTLE_TYPE_MULTI); } bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) diff --git a/test/battle/ai/gimmick_dynamax.c b/test/battle/ai/gimmick_dynamax.c index 7e99a883c4..99e6157c94 100644 --- a/test/battle/ai/gimmick_dynamax.c +++ b/test/battle/ai/gimmick_dynamax.c @@ -37,5 +37,29 @@ AI_SINGLE_BATTLE_TEST("AI uses Dynamax -- AI does not dynamax before using a uti } } +AI_TWO_VS_ONE_BATTLE_TEST("AI only Dynamaxes once per trainer in 2v1 multi battles") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); DynamaxLevel(10); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); DynamaxLevel(10); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SPLASH); + MOVE(playerRight, MOVE_SPLASH); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH, gimmick: GIMMICK_DYNAMAX); + EXPECT_MOVE(opponentRight, MOVE_SPLASH, gimmick: GIMMICK_NONE); + } + TURN { + MOVE(playerLeft, MOVE_SPLASH); + MOVE(playerRight, MOVE_SPLASH); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH, gimmick: GIMMICK_NONE); + EXPECT_MOVE(opponentRight, MOVE_SPLASH, gimmick: GIMMICK_NONE); + } + } +} + // Copycatting an ally's Max Guard rendition of Trick Room was a notable strategy. TO_DO_BATTLE_TEST("TODO: AI uses Dynamax -- AI uses Copycat against a Dynamaxed Pokemon intelligently") From 66ea9ac4060e2fb32e6d02553e8959e16a9bc4f1 Mon Sep 17 00:00:00 2001 From: Hedara Date: Sun, 30 Nov 2025 15:41:43 +0100 Subject: [PATCH 181/183] 1.13.4 release version --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 3 +- README.md | 2 +- docs/SUMMARY.md | 1 + docs/changelogs/1.13.x/1.13.4.md | 213 ++++++++++++++++++ include/constants/expansion.h | 4 +- 7 files changed, 223 insertions(+), 6 deletions(-) create mode 100644 docs/changelogs/1.13.x/1.13.4.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 4564bad007..ed29d51e2f 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.13.3 (Latest release) + - 1.13.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.13.3 - 1.13.2 - 1.13.1 - 1.13.0 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 8ee1d1cc17..7d90ff6803 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.13.3 (Latest release) + - 1.13.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.13.3 - 1.13.2 - 1.13.1 - 1.13.0 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 5791967807..6e44f32193 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.13.3 (Latest release) + - 1.13.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.13.3 - 1.13.2 - 1.13.1 - 1.13.0 diff --git a/README.md b/README.md index 2389dfe26a..1dcc2a3a00 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.13.3 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.13.4 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index a38a539bef..d85552e9b2 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -40,6 +40,7 @@ - [Vs. Seeker](tutorials/vs_seeker.md) - [Changelog](./CHANGELOG.md) - [1.13.x]() + - [Version 1.13.4](changelogs/1.13.x/1.13.4.md) - [Version 1.13.3](changelogs/1.13.x/1.13.3.md) - [Version 1.13.2](changelogs/1.13.x/1.13.2.md) - [Version 1.13.1](changelogs/1.13.x/1.13.1.md) diff --git a/docs/changelogs/1.13.x/1.13.4.md b/docs/changelogs/1.13.x/1.13.4.md new file mode 100644 index 0000000000..6884bbd95c --- /dev/null +++ b/docs/changelogs/1.13.x/1.13.4.md @@ -0,0 +1,213 @@ +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.13.4 +`. +``` + + +## 🧬 General 🧬 +### Changed +* 1.13.3 release by @hedara90 in [#8109](https://github.com/rh-hideout/pokeemerald-expansion/pull/8109) +* Adds an auto-generated include file of script commands by @FosterProgramming in [#8156](https://github.com/rh-hideout/pokeemerald-expansion/pull/8156) +* Adjust label workflow to only run if PR is approved by @hedara90 in [#8183](https://github.com/rh-hideout/pokeemerald-expansion/pull/8183) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* add fdeblasio as a contributor for code by @allcontributors[bot] in [#8200](https://github.com/rh-hideout/pokeemerald-expansion/pull/8200) +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Pret merge (16th of November, 2025) by @AlexOn1ine in [#8262](https://github.com/rh-hideout/pokeemerald-expansion/pull/8262) +* *.party: text with lfs by @mrgriffin in [#8320](https://github.com/rh-hideout/pokeemerald-expansion/pull/8320) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) + +### Fixed +* Update mdbook to v0.5.0-beta.1 by @rayrobdod in [#8133](https://github.com/rh-hideout/pokeemerald-expansion/pull/8133) +* Fix wild_encounters script not closing arrays properly by @FosterProgramming in [#8123](https://github.com/rh-hideout/pokeemerald-expansion/pull/8123) +* Fix missing FREE_MATCH_CALL by @FosterProgramming in [#8171](https://github.com/rh-hideout/pokeemerald-expansion/pull/8171) +* Fix scroll prompt sometimes being off-screen with automatic line breaks by @hedara90 in [#8182](https://github.com/rh-hideout/pokeemerald-expansion/pull/8182) +* Fix gcc11 again by @AsparagusEduardo in [#8188](https://github.com/rh-hideout/pokeemerald-expansion/pull/8188) +* Fixed decompression error reporter OOB window creation by @hedara90 in [#8199](https://github.com/rh-hideout/pokeemerald-expansion/pull/8199) +* Fix error when compiling with P_FUSION_FORMS disabled by @cawtds in [#8298](https://github.com/rh-hideout/pokeemerald-expansion/pull/8298) +* Fix compile on gcc11 by @AlexOn1ine in [#8300](https://github.com/rh-hideout/pokeemerald-expansion/pull/8300) +* Fix debug battle flag never being cleared by @FosterProgramming in [#8357](https://github.com/rh-hideout/pokeemerald-expansion/pull/8357) + +## 🗺️ Overworld 🗺️ +### Changed +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) + +### Fixed +* Fix berry blender not computing flavor correctly by @FosterProgramming in [#8113](https://github.com/rh-hideout/pokeemerald-expansion/pull/8113) +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. +* Fix grade in summary screen not accounting for 26 IV by @FosterProgramming in [#8157](https://github.com/rh-hideout/pokeemerald-expansion/pull/8157) +* Fix match call regression by @FosterProgramming in [#8227](https://github.com/rh-hideout/pokeemerald-expansion/pull/8227) +* Fix mew sprite not appearing correctly by @FosterProgramming in [#8235](https://github.com/rh-hideout/pokeemerald-expansion/pull/8235) +* Fix wrong palette for types sprites in hgss dex after catching mon by @FosterProgramming in [#8153](https://github.com/rh-hideout/pokeemerald-expansion/pull/8153) +* Fix mirage tower ceiling crumble color by @FosterProgramming in [#8081](https://github.com/rh-hideout/pokeemerald-expansion/pull/8081) +* Fix light flickering when different types of light sprite are present by @FosterProgramming in [#8043](https://github.com/rh-hideout/pokeemerald-expansion/pull/8043) + - Light intensity of neon signs was reduced to avoid conflicts with other light sources + - Fix flickering when both neon signs and light ball are present on screen +* Bug Fix: NPC Followers not working on slow sideways stairs by @Bivurnum in [#8257](https://github.com/rh-hideout/pokeemerald-expansion/pull/8257) +* Fix not enough memory being allocated when moves load background in contests by @FosterProgramming in [#8284](https://github.com/rh-hideout/pokeemerald-expansion/pull/8284) +* Make MON_DATA_NICKNAME10 return a 10 character string by @FosterProgramming in [#8291](https://github.com/rh-hideout/pokeemerald-expansion/pull/8291) + - Fix bug where interviews would print bad data in their string +* Fix game freeze when trainers try to walk on sideway stairs by @FosterProgramming in [#8316](https://github.com/rh-hideout/pokeemerald-expansion/pull/8316) +* Fix tossing items applying to the wrong stack by @FosterProgramming in [#8282](https://github.com/rh-hideout/pokeemerald-expansion/pull/8282) +* Prevent moves to be changed when choosing half party by @FosterProgramming in [#8336](https://github.com/rh-hideout/pokeemerald-expansion/pull/8336) + +## 🐉 Pokémon 🐉 +### Changed +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* Fix some followers sprites by @estellarc in [#8208](https://github.com/rh-hideout/pokeemerald-expansion/pull/8208) + +## ⚔️ Battle General ⚔️ +### Changed +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +### Fixed +* Allow to send active mon to PC when capturing a Pokemon by @FosterProgramming in [#8111](https://github.com/rh-hideout/pokeemerald-expansion/pull/8111) +* Fix transform not loading the correct sprites when facing shiny or unown by @FosterProgramming in [#8146](https://github.com/rh-hideout/pokeemerald-expansion/pull/8146) +* Fixes Receiver not immediately activating copied abilities by @PhallenTree in [#8162](https://github.com/rh-hideout/pokeemerald-expansion/pull/8162) +* Fix destiny knot behavior and add tests by @FosterProgramming in [#8174](https://github.com/rh-hideout/pokeemerald-expansion/pull/8174) +* Fix recharge moves + add recharge move tests by @FosterProgramming in [#8181](https://github.com/rh-hideout/pokeemerald-expansion/pull/8181) +* Fixes Magician for spread moves by @AlexOn1ine in [#8170](https://github.com/rh-hideout/pokeemerald-expansion/pull/8170) +* Fix tera tint not applying on activation by @FosterProgramming in [#8135](https://github.com/rh-hideout/pokeemerald-expansion/pull/8135) +* Fixes wrongly assigned count for Semi Invulnerable state by @AlexOn1ine in [#8175](https://github.com/rh-hideout/pokeemerald-expansion/pull/8175) +* Fixes Drain Punch / Parental Bond / Scale Shot interaction by @AlexOn1ine in [#8198](https://github.com/rh-hideout/pokeemerald-expansion/pull/8198) +* Fix wrong ditto sprite on capture by @FosterProgramming in [#8226](https://github.com/rh-hideout/pokeemerald-expansion/pull/8226) +* Fixed an issue related to same turn Encore targeting by @LinathanZel in [#8230](https://github.com/rh-hideout/pokeemerald-expansion/pull/8230) +* Fixes Shell Trap not activating on contact but no damage by @AlexOn1ine in [#8243](https://github.com/rh-hideout/pokeemerald-expansion/pull/8243) +* Fix Magic Coat reflecting hazard moves incorrectly when used by a partner by @moostoet in [#8272](https://github.com/rh-hideout/pokeemerald-expansion/pull/8272) + - Magic Coat now properly reflects hazard moves from either slot in double battles. +* Shell Trap tests and Fix for Encore interaction by @AlexOn1ine in [#8268](https://github.com/rh-hideout/pokeemerald-expansion/pull/8268) +* Fix max mushroom unable to be selected when one stat is maxed by @FosterProgramming in [#8287](https://github.com/rh-hideout/pokeemerald-expansion/pull/8287) +* Block selecting x items when contrary pokemon are at minimum stages by @FosterProgramming in [#8288](https://github.com/rh-hideout/pokeemerald-expansion/pull/8288) +* Fix Fur Coat affecting confusion self-damage by @moostoet in [#8267](https://github.com/rh-hideout/pokeemerald-expansion/pull/8267) + - Fix confusion self-damage ignoring defense/attack abilities such as Fur Coat. +* Fixes End Turn Speed Order by @AlexOn1ine in [#8289](https://github.com/rh-hideout/pokeemerald-expansion/pull/8289) +* Make switchout abilities trigger after a pokemon has returned to its ball by @FosterProgramming in [#8304](https://github.com/rh-hideout/pokeemerald-expansion/pull/8304) +* Fix Shed Shell allowing fleeing/teleporting and Smoke Ball failing to guarantee escape by @moostoet in [#8286](https://github.com/rh-hideout/pokeemerald-expansion/pull/8286) +* Fix bug where defiant/competitive would pass their stat change to the next target by @FosterProgramming in [#8312](https://github.com/rh-hideout/pokeemerald-expansion/pull/8312) +* Fix max move message against semi invulnerable target by @FosterProgramming in [#8313](https://github.com/rh-hideout/pokeemerald-expansion/pull/8313) +* Fixes Neutralizing Gas displaying message when exiting with multiple users by @PhallenTree in [#8318](https://github.com/rh-hideout/pokeemerald-expansion/pull/8318) +* Fix Kings Rock not being ignored by flinch moves by @AlexOn1ine in [#8327](https://github.com/rh-hideout/pokeemerald-expansion/pull/8327) +* Fix Protosynthesis stat boosts ignoring speed drops by @moostoet in [#8277](https://github.com/rh-hideout/pokeemerald-expansion/pull/8277) + - Protosynthesis and Quark Drive now recalculate their boosted stat when Speed is lowered or Neutralizing Gas temporarily disables the ability. +* Fix switch-in abilities not triggering on revive by @FosterProgramming in [#8293](https://github.com/rh-hideout/pokeemerald-expansion/pull/8293) +* More Neutralizing Gas cleanup by @PhallenTree in [#8335](https://github.com/rh-hideout/pokeemerald-expansion/pull/8335) +* Fix cure status item effect not working properly in doubles by @FosterProgramming in [#8339](https://github.com/rh-hideout/pokeemerald-expansion/pull/8339) +* Fix infinite confusion (berserk gene) not being cured by cure_status bag items by @FosterProgramming in [#8343](https://github.com/rh-hideout/pokeemerald-expansion/pull/8343) +* Fix `B_PHYSICAL_SPECIAL_SPLIT` when set to Gen 4 by @AsparagusEduardo in [#8348](https://github.com/rh-hideout/pokeemerald-expansion/pull/8348) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix substitute graphic not disappearing after using a pivor move by @FosterProgramming in [#8340](https://github.com/rh-hideout/pokeemerald-expansion/pull/8340) +* Fixes Beak Blast burning after Beak Blast was already used by @PhallenTree in [#8361](https://github.com/rh-hideout/pokeemerald-expansion/pull/8361) +* Fix Roar not being recorded for LastUsedMove by @AlexOn1ine in [#8362](https://github.com/rh-hideout/pokeemerald-expansion/pull/8362) +* Fixes Neutralizing Gas / Mold Breaker / Dragon Darts interaction by @AlexOn1ine in [#8389](https://github.com/rh-hideout/pokeemerald-expansion/pull/8389) +* Fixes battle tv overwriting damage values by @AlexOn1ine in [#8378](https://github.com/rh-hideout/pokeemerald-expansion/pull/8378) +* Fix ball cycling not working properly when the same ball take multiple bag slots by @FosterProgramming in [#8163](https://github.com/rh-hideout/pokeemerald-expansion/pull/8163) + - Two new defines added to items.h `FIRST_BALL_INDEX` and `LAST_BALL_INDEX` + - We now assume the indexes of all regular ball usable in wild battle have consecutive indexes and some features (throw ball shortcut in battle) might break if not true + +## 🤹 Moves 🤹 +### Changed +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* Make tailwind anim mirror based on side by @FosterProgramming in [#8249](https://github.com/rh-hideout/pokeemerald-expansion/pull/8249) +* Make rainbow effect anim change based on side by @FosterProgramming in [#8269](https://github.com/rh-hideout/pokeemerald-expansion/pull/8269) + - Art assets by [SonikkuA-DatH](https://github.com/SonikkuA-DatH) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) + +### Fixed +* Fix some move animations leaking VRAM and freeing already freed tags by @hedara90 in [#7977](https://github.com/rh-hideout/pokeemerald-expansion/pull/7977) + +## 🧶 Items 🧶 +### Fixed +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. + +## 🤖 Battle AI 🤖 +### Fixed +* fix (AI scoring): shield dust considerations, IsMoveEffectInMinus self effect edge case, hitsToKO zero-case consideration by @ghostyboyy97 in [#8126](https://github.com/rh-hideout/pokeemerald-expansion/pull/8126) + - The AI now sees Shield Dust on the player's Pokemon correctly + - The AI now sees self-targeted positive effect boosts correctly +* fix (contrary): Contrary stat down handling in MoveEffectInPlus by @ghostyboyy97 in [#8165](https://github.com/rh-hideout/pokeemerald-expansion/pull/8165) + - When comparing positive move effects in damaging move comparison, the AI will correctly see moves like Leaf Storm as beneficial if their Pokemon has Contrary. +* Added check for parental bond killing through sturdy by @MaximeGr00 in [#8206](https://github.com/rh-hideout/pokeemerald-expansion/pull/8206) + AI now accounts for Parental Bond when checking if a move can ko the player through sturdy/focus sash. +* Fix AI_FLAG_DOUBLE_ACE_POKEMON sending duplicate Pokémon in doubles by @moostoet in [#8279](https://github.com/rh-hideout/pokeemerald-expansion/pull/8279) + - Fixed AI_FLAG_DOUBLE_ACE_POKEMON trainers resending the same Pokémon after a KO instead of their two Ace Pokémon in double battles. +* Fix switchin KO threshold logic by @Pawkkie in [#8370](https://github.com/rh-hideout/pokeemerald-expansion/pull/8370) + +## 🧹 Other Cleanup 🧹 +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +## 🧪 Test Runner 🧪 +### Added +* Prevent EXPECT functions from casting negative numbers into unsigned by @FosterProgramming in [#7866](https://github.com/rh-hideout/pokeemerald-expansion/pull/7866) + +### Changed +* Added Soundproof and Bulletproof tests by @AsparagusEduardo in [#8189](https://github.com/rh-hideout/pokeemerald-expansion/pull/8189) +* Wrote some missing tests by @AsparagusEduardo in [#8203](https://github.com/rh-hideout/pokeemerald-expansion/pull/8203) +* A couple more tests by @AsparagusEduardo in [#8209](https://github.com/rh-hideout/pokeemerald-expansion/pull/8209) +* Fixed some failing tests with GEN_LATEST = GEN_5 by @AsparagusEduardo in [#8241](https://github.com/rh-hideout/pokeemerald-expansion/pull/8241) +* Add test for mold breaker/ice scales interaction by @FosterProgramming in [#8240](https://github.com/rh-hideout/pokeemerald-expansion/pull/8240) +* Yet more tests by @AsparagusEduardo in [#8228](https://github.com/rh-hideout/pokeemerald-expansion/pull/8228) + - Added tests for: + - Dark Aura + - Fairy Aura + - Flare Boost + - Toxic Boost + - Added test names for Flying Press. +* Slightly increase headless test speed by modifying animations by @AsparagusEduardo in [#8299](https://github.com/rh-hideout/pokeemerald-expansion/pull/8299) +* Make `gTestRunnerHeadless` into a constant outside of tests by @hedara90 in [#8306](https://github.com/rh-hideout/pokeemerald-expansion/pull/8306) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Finished fixing tests when setting `GEN_LATEST` to `GEN_5` by @AsparagusEduardo in [#8263](https://github.com/rh-hideout/pokeemerald-expansion/pull/8263) +* Wrote missing Fling tests by @AsparagusEduardo in [#8383](https://github.com/rh-hideout/pokeemerald-expansion/pull/8383) + +### Fixed +* Fixes difficulty not being restored after tests by @grintoul1 in [#8129](https://github.com/rh-hideout/pokeemerald-expansion/pull/8129) +* Reset saveblock data between test runs by @hedara90 in [#8145](https://github.com/rh-hideout/pokeemerald-expansion/pull/8145) +* Fix ohko moves ai tests by @FosterProgramming in [#8309](https://github.com/rh-hideout/pokeemerald-expansion/pull/8309) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Add tests to verify aromatherapy is not affected by heal bell config by @FosterProgramming in [#8344](https://github.com/rh-hideout/pokeemerald-expansion/pull/8344) +* Pre gen 5 encored move now signals the test engine a move is happening by @FosterProgramming in [#8338](https://github.com/rh-hideout/pokeemerald-expansion/pull/8338) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix known failing AI trace test by @FosterProgramming in [#8337](https://github.com/rh-hideout/pokeemerald-expansion/pull/8337) + +## 📚 Documentation 📚 +* Lock mdbook to v0.4.35 to fix docs not building by @grintoul1 in [#8130](https://github.com/rh-hideout/pokeemerald-expansion/pull/8130) +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) + + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.3...expansion/1.13.4 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 1b9fba88a1..a6f86b2ec5 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,13 +1,13 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.13.3 +// Last version: 1.13.4 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 13 #define EXPANSION_VERSION_PATCH 4 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From da5a2ca70cc7f8178a51436855ae3f290fb5a7c5 Mon Sep 17 00:00:00 2001 From: Hedara Date: Sun, 30 Nov 2025 16:00:23 +0100 Subject: [PATCH 182/183] 1.14.0 release --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 9 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 9 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 9 +- README.md | 2 +- docs/SUMMARY.md | 2 + docs/changelogs/1.14.x/1.14.0.md | 534 ++++++++++++++++++ include/constants/expansion.h | 2 +- 7 files changed, 547 insertions(+), 20 deletions(-) create mode 100644 docs/changelogs/1.14.x/1.14.0.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index ed29d51e2f..e06d7a2f5d 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -43,18 +43,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.13.4 (Latest release) + - 1.14.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.13.4 - 1.13.3 - 1.13.2 - 1.13.1 - 1.13.0 - - 1.12.3 - - 1.12.2 - - 1.12.1 - - 1.12.0 - - pre-1.12.0 + - pre-1.13.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 7d90ff6803..38f171b721 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,18 +43,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.13.4 (Latest release) + - 1.14.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.13.4 - 1.13.3 - 1.13.2 - 1.13.1 - 1.13.0 - - 1.12.3 - - 1.12.2 - - 1.12.1 - - 1.12.0 - - pre-1.12.0 + - pre-1.13.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 6e44f32193..b1ba4c3897 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,18 +43,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.13.4 (Latest release) + - 1.14.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.13.4 - 1.13.3 - 1.13.2 - 1.13.1 - 1.13.0 - - 1.12.3 - - 1.12.2 - - 1.12.1 - - 1.12.0 - - pre-1.12.0 + - pre-1.13.0 validations: required: true - type: input diff --git a/README.md b/README.md index 1dcc2a3a00..65db8463d9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.13.4 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.14.0 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index d85552e9b2..08e6cd4fd0 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -39,6 +39,8 @@ - [How to use Trainer Party Pools](tutorials/how_to_trainer_party_pool.md) - [Vs. Seeker](tutorials/vs_seeker.md) - [Changelog](./CHANGELOG.md) + - [1.14.x]() + - [Version 1.14.0](changelogs/1.14.x/1.14.0.md) - [1.13.x]() - [Version 1.13.4](changelogs/1.13.x/1.13.4.md) - [Version 1.13.3](changelogs/1.13.x/1.13.3.md) diff --git a/docs/changelogs/1.14.x/1.14.0.md b/docs/changelogs/1.14.x/1.14.0.md new file mode 100644 index 0000000000..3a75d35e6e --- /dev/null +++ b/docs/changelogs/1.14.x/1.14.0.md @@ -0,0 +1,534 @@ +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.14.0 +`. +``` + +## 🌋 *REFACTORS* 🌋 +📜 = Uses a migration script. +* Refactors Attackstring and PP deduction by @AlexOn1ine in [#7402](https://github.com/rh-hideout/pokeemerald-expansion/pull/7402) +* Attackcanceller fixes and improvements by @AlexOn1ine in [#7698](https://github.com/rh-hideout/pokeemerald-expansion/pull/7698) +* Fixes activation order for a couple abilities by @AlexOn1ine in [#7732](https://github.com/rh-hideout/pokeemerald-expansion/pull/7732) +* feat: change defines in `constants/abilities.h` to an enum by @khbsd in [#7006](https://github.com/rh-hideout/pokeemerald-expansion/pull/7006) +* Item battle effect refactor by @AlexOn1ine in [#7857](https://github.com/rh-hideout/pokeemerald-expansion/pull/7857) +* Optimize GetWhichBattlerFasterOrTies by @AlexOn1ine in [#7953](https://github.com/rh-hideout/pokeemerald-expansion/pull/7953) +* Decouple passive hp updates from move damage updates by @AlexOn1ine in [#7942](https://github.com/rh-hideout/pokeemerald-expansion/pull/7942) +* Make movelist calculations happen during compilation instead of runtime by @FosterProgramming in [#7967](https://github.com/rh-hideout/pokeemerald-expansion/pull/7967) + - tmIlliterate flag in speciesInfo changed to teachingType. The options are `DEFAULT_LEARNING`, `TM_ILLITERATE` and `ALL_TEACHABLES`. The first two options match the tmIlliterate = false and tmIlliterate = true while the third one allow a pokemon to learn all teachables similarly to Mew + - Reduce EWRAM usage of HGSS dex + - Fix pokemon.c needing to be recompiled everytime a .inc file was changed + - P_TUTOR_MOVES_ARRAY has been removed (now always true when HGSS dex is enabled) + - Mew move teaching exception and univeral moves are now coded in the JSON file `src/data/pokemon/special_movesets.json` under the name signatureTeachables and universalMoves +* Grudge, Destiny Bond and FaintBattler refactor by @AlexOn1ine in [#8072](https://github.com/rh-hideout/pokeemerald-expansion/pull/8072) +* Increase number of additional move effects by @AlexOn1ine in [#8149](https://github.com/rh-hideout/pokeemerald-expansion/pull/8149) +* 📜 update: time-based encounters system tuneup and @cawtds' header script by @khbsd in [#8158](https://github.com/rh-hideout/pokeemerald-expansion/pull/8158) +* Refactor random functions to be runner specific by @FosterProgramming in [#7816](https://github.com/rh-hideout/pokeemerald-expansion/pull/7816) + +## 🧬 General 🧬 +### Added +* Battle debug menu: highlight chosen action and change separator by @grintoul1 in [#7709](https://github.com/rh-hideout/pokeemerald-expansion/pull/7709) +* Implement `field_name_box` by @mudskipper13 in [#7697](https://github.com/rh-hideout/pokeemerald-expansion/pull/7697) +* Add new actions to Debug Menu by @FosterProgramming in [#7837](https://github.com/rh-hideout/pokeemerald-expansion/pull/7837) + - Adds an action to change a Pokemon ability in the party side of the Debug Menu + - Adds an action to set the friendship of a Pokemon in the party side of the Debug Menu + +* Display TM/HM's move name in the debug menu by @estellarc in [#7994](https://github.com/rh-hideout/pokeemerald-expansion/pull/7994) + +### Changed +* Text rendering optimizations by @mrgriffin in [#7497](https://github.com/rh-hideout/pokeemerald-expansion/pull/7497) +* Battle debug menu now checks correct parties depending on battler party by @grintoul1 in [#7652](https://github.com/rh-hideout/pokeemerald-expansion/pull/7652) +* Add make release target by @jschoeny in [#7296](https://github.com/rh-hideout/pokeemerald-expansion/pull/7296) + - Most of what's above. But most importantly, that normal `make` will have all the debug stuff enabled and so releases should be done with `make release`. +* Add pool rules for Mega Stones and Z-Crystals by @hedara90 in [#7720](https://github.com/rh-hideout/pokeemerald-expansion/pull/7720) +* `field_name_box` smol followup by @mudskipper13 in [#7762](https://github.com/rh-hideout/pokeemerald-expansion/pull/7762) +* Added COMPOUND_STRINGs to region_map_entries.h by @fdeblasio in [#7669](https://github.com/rh-hideout/pokeemerald-expansion/pull/7669) +* Improve ability/heldEffect access for IsBattlerGrounded func by @AlexOn1ine in [#7753](https://github.com/rh-hideout/pokeemerald-expansion/pull/7753) +* Removed `SAVE_TYPE_ERROR_SCREEN` config by @AsparagusEduardo in [#7836](https://github.com/rh-hideout/pokeemerald-expansion/pull/7836) +* Give the Coin Case when coins are maxed by @estellarc in [#7973](https://github.com/rh-hideout/pokeemerald-expansion/pull/7973) +* Revert HGSS dex and movelist changes by @FosterProgramming in [#8016](https://github.com/rh-hideout/pokeemerald-expansion/pull/8016) +* Converts some defines to enums and name unnamed enums by @Bassoonian in [#8019](https://github.com/rh-hideout/pokeemerald-expansion/pull/8019) +* Some more documentation and cleanup by @Bassoonian in [#8020](https://github.com/rh-hideout/pokeemerald-expansion/pull/8020) +* Even more enums and documentation by @Bassoonian in [#8029](https://github.com/rh-hideout/pokeemerald-expansion/pull/8029) +* Add type enum by @Bassoonian in [#8054](https://github.com/rh-hideout/pokeemerald-expansion/pull/8054) +* Minor clean up in menu.c by @estellarc in [#8060](https://github.com/rh-hideout/pokeemerald-expansion/pull/8060) +* Adds an auto-generated include file of script commands by @FosterProgramming in [#8156](https://github.com/rh-hideout/pokeemerald-expansion/pull/8156) +* Master to upcoming merge 20251107 by @grintoul1 in [#8167](https://github.com/rh-hideout/pokeemerald-expansion/pull/8167) +* porymap default settings by @FosterProgramming in [#8038](https://github.com/rh-hideout/pokeemerald-expansion/pull/8038) + - WARNING: A change was made for new projects map files to match poymap output. This change might break people's projects with existing versions of those files. The files affected are ` data/maps/map_groups.json`, `src/data/heal_locations.json`, `src/data/region_map/region_map_sections.json` and `src/data/wild_encounters.json` + If you have an issue with one of those files during the merging process, you should run this command + `git checkout HEAD -- ` + which will reset the file to the version before you initiated the merge +* Adjust label workflow to only run if PR is approved by @hedara90 in [#8183](https://github.com/rh-hideout/pokeemerald-expansion/pull/8183) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* Converted landmarks to COMPOUND_STRINGs by @fdeblasio in [#8205](https://github.com/rh-hideout/pokeemerald-expansion/pull/8205) +* Added contest config and cleaned up contest category variables by @fdeblasio in [#8178](https://github.com/rh-hideout/pokeemerald-expansion/pull/8178) +* Moves name box configs into a new file by @AlexOn1ine in [#8250](https://github.com/rh-hideout/pokeemerald-expansion/pull/8250) +* Converted options text into COMPOUND_STRINGs by @fdeblasio in [#8248](https://github.com/rh-hideout/pokeemerald-expansion/pull/8248) +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Pret merge (16th of November, 2025) by @AlexOn1ine in [#8262](https://github.com/rh-hideout/pokeemerald-expansion/pull/8262) +* Fixed bKGD for last_used_ball_r_cycle.png by @montmoguri in [#8261](https://github.com/rh-hideout/pokeemerald-expansion/pull/8261) +* Small bg drawing optimization by @estellarc in [#8259](https://github.com/rh-hideout/pokeemerald-expansion/pull/8259) +* Added missing 'coolness' string by @fdeblasio in [#8274](https://github.com/rh-hideout/pokeemerald-expansion/pull/8274) +* *.party: text with lfs by @mrgriffin in [#8320](https://github.com/rh-hideout/pokeemerald-expansion/pull/8320) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) + +### Fixed +* Added brackets where needed by @hedara90 in [#7781](https://github.com/rh-hideout/pokeemerald-expansion/pull/7781) +* Fix shiny stars being freed before shiny animation was played by @FosterProgramming in [#7917](https://github.com/rh-hideout/pokeemerald-expansion/pull/7917) + - Fixes shiny sparks in battle not appearing properly in rare circumstances (more common with various speedup options) +* Make movelist calculations happen during compilation instead of runtime by @FosterProgramming in [#7967](https://github.com/rh-hideout/pokeemerald-expansion/pull/7967) + - tmIlliterate flag in speciesInfo changed to teachingType. The options are `DEFAULT_LEARNING`, `TM_ILLITERATE` and `ALL_TEACHABLES`. The first two options match the tmIlliterate = false and tmIlliterate = true while the third one allow a pokemon to learn all teachables similarly to Mew + - Reduce EWRAM usage of HGSS dex + - Fix pokemon.c needing to be recompiled everytime a .inc file was changed + - P_TUTOR_MOVES_ARRAY has been removed (now always true when HGSS dex is enabled) + - Mew move teaching exception and univeral moves are now coded in the JSON file `src/data/pokemon/special_movesets.json` under the name signatureTeachables and universalMoves +* Fix unhandled config in hgss dex by @FosterProgramming in [#7999](https://github.com/rh-hideout/pokeemerald-expansion/pull/7999) +* Fixes compilation error due to #8002 by @AlexOn1ine in [#8050](https://github.com/rh-hideout/pokeemerald-expansion/pull/8050) +* Fix compile issue in gcc 11 by @AsparagusEduardo in [#8095](https://github.com/rh-hideout/pokeemerald-expansion/pull/8095) +* Update mdbook to v0.5.0-beta.1 by @rayrobdod in [#8133](https://github.com/rh-hideout/pokeemerald-expansion/pull/8133) +* Fix build failing with NOOPT=1 due to discarding static data. by @Ultimate-Bob in [#8053](https://github.com/rh-hideout/pokeemerald-expansion/pull/8053) +* Fix wild_encounters script not closing arrays properly by @FosterProgramming in [#8123](https://github.com/rh-hideout/pokeemerald-expansion/pull/8123) +* Fix missing FREE_MATCH_CALL by @FosterProgramming in [#8171](https://github.com/rh-hideout/pokeemerald-expansion/pull/8171) +* Again fixed compiling in GCC11 by @AsparagusEduardo in [#8184](https://github.com/rh-hideout/pokeemerald-expansion/pull/8184) +* Fix scroll prompt sometimes being off-screen with automatic line breaks by @hedara90 in [#8182](https://github.com/rh-hideout/pokeemerald-expansion/pull/8182) +* Fix gcc11 again by @AsparagusEduardo in [#8188](https://github.com/rh-hideout/pokeemerald-expansion/pull/8188) +* Fixed decompression error reporter OOB window creation by @hedara90 in [#8199](https://github.com/rh-hideout/pokeemerald-expansion/pull/8199) +* Fix error when compiling with P_FUSION_FORMS disabled by @cawtds in [#8298](https://github.com/rh-hideout/pokeemerald-expansion/pull/8298) +* Fix compile on gcc11 by @AlexOn1ine in [#8300](https://github.com/rh-hideout/pokeemerald-expansion/pull/8300) +* Fix debug battle flag never being cleared by @FosterProgramming in [#8357](https://github.com/rh-hideout/pokeemerald-expansion/pull/8357) + +## 🗺️ Overworld 🗺️ +### Added +* New Feature: ORAS Dowsing by @Bivurnum in [#7211](https://github.com/rh-hideout/pokeemerald-expansion/pull/7211) + - Added ORAS Dowsing Machine mechanics. +* feat: adds stevebeller's instant text and MandL27's faster text printing by @khbsd in [#8063](https://github.com/rh-hideout/pokeemerald-expansion/pull/8063) +* Implement GSC berry/apricorn tree functionality. by @GraionDilach in [#7777](https://github.com/rh-hideout/pokeemerald-expansion/pull/7777) + - Implement GSC berry/apricorn tree functionality. + +### Changed +* Trainers trigger in local id order by @grintoul1 in [#7424](https://github.com/rh-hideout/pokeemerald-expansion/pull/7424) +* Added regional form evolution condition by @AsparagusEduardo in [#6990](https://github.com/rh-hideout/pokeemerald-expansion/pull/6990) +* Update fishing odds to match official games by @FosterProgramming in [#7574](https://github.com/rh-hideout/pokeemerald-expansion/pull/7574) + - (BREAKING!) Fishing config has been moved to a new file. If you did not use default config fishing, make sure to reapply your config settings in the new file. + - (WARNING!) If you wrote custom code that calls one the following function, you may need to include `fishing.h` to get access to them(their functionaly was not affected): + - `StartFishing`previously defined in `field_player_avatar.h` + - `CalculateChainFishingShinyRolls` previously_defined in `wild_encounter.h` + - Adds a new config option to increase fish bite chance in morning and evening to match XY + - Modifies the way fishing "proximity boost" is calculated to match XY + - Fix Sticky Hold / Suction Cups bug which were increasing odds the wrong way +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) +* update: time-based encounters system tuneup and @cawtds' header script by @khbsd in [#8158](https://github.com/rh-hideout/pokeemerald-expansion/pull/8158) +* Sets instant text speed flag to false by default by @khbsd in [#8179](https://github.com/rh-hideout/pokeemerald-expansion/pull/8179) +* Follower NPCs no longer move if the player would be forced back onto the same tile. by @Bivurnum in [#8260](https://github.com/rh-hideout/pokeemerald-expansion/pull/8260) + - Follower NPCs no longer move if the player would be forced back onto the same tile + +### Fixed +* CheckForTrainersWantingBattle trainerObjects array now initialized to zero and loop now starts at zero by @grintoul1 in [#7765](https://github.com/rh-hideout/pokeemerald-expansion/pull/7765) +* Bugfix `setspeaker` Namebox not beign drawn correctly by @estellarc in [#7771](https://github.com/rh-hideout/pokeemerald-expansion/pull/7771) +* Banned species list by @FosterProgramming in [#8003](https://github.com/rh-hideout/pokeemerald-expansion/pull/8003) + - Add a window displaying caught banned species list in the Battle Frontier instead of the string detailing all the is +* Fix namebox bug when reloading the map mid-script by @FosterProgramming in [#8073](https://github.com/rh-hideout/pokeemerald-expansion/pull/8073) +* Fix copyvar instead of setvar causing issue with LTO by @FosterProgramming in [#8097](https://github.com/rh-hideout/pokeemerald-expansion/pull/8097) +* Fix berry blender not computing flavor correctly by @FosterProgramming in [#8113](https://github.com/rh-hideout/pokeemerald-expansion/pull/8113) +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + - All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. +* Fix grade in summary screen not accounting for 26 IV by @FosterProgramming in [#8157](https://github.com/rh-hideout/pokeemerald-expansion/pull/8157) +* Fix match call regression by @FosterProgramming in [#8227](https://github.com/rh-hideout/pokeemerald-expansion/pull/8227) +* Fix mew sprite not appearing correctly by @FosterProgramming in [#8235](https://github.com/rh-hideout/pokeemerald-expansion/pull/8235) +* Fix wrong palette for types sprites in hgss dex after catching mon by @FosterProgramming in [#8153](https://github.com/rh-hideout/pokeemerald-expansion/pull/8153) +* Fix Apricorns with OW_SHOW_ITEM_DESCRIPTIONS not off by @hedara90 in [#8253](https://github.com/rh-hideout/pokeemerald-expansion/pull/8253) +* Fix mirage tower ceiling crumble color by @FosterProgramming in [#8081](https://github.com/rh-hideout/pokeemerald-expansion/pull/8081) +* Fix light flickering when different types of light sprite are present by @FosterProgramming in [#8043](https://github.com/rh-hideout/pokeemerald-expansion/pull/8043) + - Light intensity of neon signs was reduced to avoid conflicts with other light sources + - Fix flickering when both neon signs and light ball are present on screen +* Bug Fix: NPC Followers not working on slow sideways stairs by @Bivurnum in [#8257](https://github.com/rh-hideout/pokeemerald-expansion/pull/8257) + - Fixed NPC followers on slow sideways stairs +* Fix not enough memory being allocated when moves load background in contests by @FosterProgramming in [#8284](https://github.com/rh-hideout/pokeemerald-expansion/pull/8284) +* Make MON_DATA_NICKNAME10 return a 10 character string by @FosterProgramming in [#8291](https://github.com/rh-hideout/pokeemerald-expansion/pull/8291) + - Fix bug where interviews would print bad data in their string +* Fix game freeze when trainers try to walk on sideway stairs by @FosterProgramming in [#8316](https://github.com/rh-hideout/pokeemerald-expansion/pull/8316) +* Fix tossing items applying to the wrong stack by @FosterProgramming in [#8282](https://github.com/rh-hideout/pokeemerald-expansion/pull/8282) +* Prevent moves to be changed when choosing half party by @FosterProgramming in [#8336](https://github.com/rh-hideout/pokeemerald-expansion/pull/8336) + +## 🐉 Pokémon 🐉 +### Added +* Add Legends Z-A content by @Bassoonian in [#7935](https://github.com/rh-hideout/pokeemerald-expansion/pull/7935) + * To retain compatibility with your new items and species, make sure to move the new additions behind your own additions. + * The save block will shift if you have enabled `USE_DEXNAV_SEARCH_LEVELS` (due to the new species) or if `OW_SHOW_ITEM_DESCRIPTIONS` is set to `OW_ITEM_DESCRIPTIONS_FIRST_TIME` (due to the new items). +* Move Relearners for TMs, Tutors and Egg moves by @PCG06 in [#8040](https://github.com/rh-hideout/pokeemerald-expansion/pull/8040) + - Increased the size of `MAX_RELEARNER_MOVES` to 60 to prevent crashes when viewing Mew. + +### Changed +* Nickit & Thievul visual revamp by @purrfectdoodle in [#7689](https://github.com/rh-hideout/pokeemerald-expansion/pull/7689) +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* Fix some followers sprites by @estellarc in [#8208](https://github.com/rh-hideout/pokeemerald-expansion/pull/8208) + +### Fixed +* Fix gba sprites trying load non existent female versions by @FosterProgramming in [#7996](https://github.com/rh-hideout/pokeemerald-expansion/pull/7996) + - Fixes issues with pokemon getting gender differences in later gens when using gen3 sprite config +* GetEggSpecies: Only enabled species by @mrgriffin in [#8221](https://github.com/rh-hideout/pokeemerald-expansion/pull/8221) +* Fix compiling using `make debug` by @PCG06 in [#8380](https://github.com/rh-hideout/pokeemerald-expansion/pull/8380) + +## ⚔️ Battle General ⚔️ +### Added +* Config for capture to appear critical if the pokemon is already caught by @FosterProgramming in [#7730](https://github.com/rh-hideout/pokeemerald-expansion/pull/7730) + +### Changed +* Separates FRB and FRZ animations by @grintoul1 in [#7611](https://github.com/rh-hideout/pokeemerald-expansion/pull/7611) +* Update multiple battle messages by @AsparagusEduardo in [#7529](https://github.com/rh-hideout/pokeemerald-expansion/pull/7529) + - Removed unused messages + - Changed ability "X prevents Y" to "It doesn't affect X..." + - Eg. `"The opposing Snorlax's Immunity prevents poisoning!"` + - Removed `B_ABILITY_POP_UP`. Revert commit `b501fe7354bcd957396465c621ae7af5959ac5b0` to undo this. +* Refactors Attackstring and PP deduction by @AlexOn1ine in [#7402](https://github.com/rh-hideout/pokeemerald-expansion/pull/7402) +* Remove Uproar attack battle script by @AlexOn1ine in [#7715](https://github.com/rh-hideout/pokeemerald-expansion/pull/7715) +* Fix up end turn scripts plus small documentation by @AlexOn1ine in [#7758](https://github.com/rh-hideout/pokeemerald-expansion/pull/7758) +* Remove redundant function call by @AlexOn1ine in [#7752](https://github.com/rh-hideout/pokeemerald-expansion/pull/7752) +* Minor White Herb and Neutralizing Gas clean up by @AlexOn1ine in [#7754](https://github.com/rh-hideout/pokeemerald-expansion/pull/7754) +* Minor clean up for Lightning Rod / Storm Drain by @AlexOn1ine in [#7778](https://github.com/rh-hideout/pokeemerald-expansion/pull/7778) +* Improve ability/heldEffect access for IsBattlerGrounded func by @AlexOn1ine in [#7753](https://github.com/rh-hideout/pokeemerald-expansion/pull/7753) +* Add func GetChosenMoveFromPosition by @AlexOn1ine in [#7810](https://github.com/rh-hideout/pokeemerald-expansion/pull/7810) +* GetBattlerHoldEffect clean up by @AlexOn1ine in [#7819](https://github.com/rh-hideout/pokeemerald-expansion/pull/7819) +* Remove unused gBattleStruct fields by @Bassoonian in [#7822](https://github.com/rh-hideout/pokeemerald-expansion/pull/7822) +* feat: change defines in `constants/abilities.h` to an enum by @khbsd in [#7006](https://github.com/rh-hideout/pokeemerald-expansion/pull/7006) +* Streamline tryheal macros by @Bassoonian in [#7830](https://github.com/rh-hideout/pokeemerald-expansion/pull/7830) +* No bag use flag changed to a varable by @FosterProgramming in [#7780](https://github.com/rh-hideout/pokeemerald-expansion/pull/7780) + - IMPORTANT: The config flag B_FLAG_NO_BAG_USE has been removed + - A config var B_VAR_NO_BAG_USE has been added to replace it. It allows you to choose between: + bag available in battle, bag available in wild battle only, and unavailable bag +* Remove two unused bits from battle structs by @Bassoonian in [#7835](https://github.com/rh-hideout/pokeemerald-expansion/pull/7835) +* Removes a few redundant hitmarkers by @AlexOn1ine in [#7915](https://github.com/rh-hideout/pokeemerald-expansion/pull/7915) +* Remove EffectHitSetTerrain script to use moveeffect by @AlexOn1ine in [#7938](https://github.com/rh-hideout/pokeemerald-expansion/pull/7938) +* Clean up follow up for AtkCanceller refactor by @AlexOn1ine in [#7951](https://github.com/rh-hideout/pokeemerald-expansion/pull/7951) +* Optimize GetWhichBattlerFasterOrTies by @AlexOn1ine in [#7953](https://github.com/rh-hideout/pokeemerald-expansion/pull/7953) +* Decouple passive hp updates from move damage updates by @AlexOn1ine in [#7942](https://github.com/rh-hideout/pokeemerald-expansion/pull/7942) +* Remove appearedInBattle bitfield & redundant use of sentOut partyState by @Nopinou in [#8011](https://github.com/rh-hideout/pokeemerald-expansion/pull/8011) +* Volatile cleared in a redundant spot by @AlexOn1ine in [#8015](https://github.com/rh-hideout/pokeemerald-expansion/pull/8015) +* Moved usedHeldItem to Party State struct by @AlexOn1ine in [#8006](https://github.com/rh-hideout/pokeemerald-expansion/pull/8006) +* Remove usage of gBattlerTarget for MirrorHerb/Opportunist by @AlexOn1ine in [#8033](https://github.com/rh-hideout/pokeemerald-expansion/pull/8033) +* Fixed test "Revival Blessing cannot revive a partner's party member" by @grintoul1 in [#8031](https://github.com/rh-hideout/pokeemerald-expansion/pull/8031) +* Decouple (Overworld) Statuses from ability function by @AlexOn1ine in [#8002](https://github.com/rh-hideout/pokeemerald-expansion/pull/8002) +* Combine Simple Beam and Worry Seed into one effect by @AlexOn1ine in [#8039](https://github.com/rh-hideout/pokeemerald-expansion/pull/8039) +* Clean up for item hold effect refactor by @AlexOn1ine in [#8014](https://github.com/rh-hideout/pokeemerald-expansion/pull/8014) +* Grudge, Destiny Bond and FaintBattler refactor by @AlexOn1ine in [#8072](https://github.com/rh-hideout/pokeemerald-expansion/pull/8072) +* Parametrized Ice Face's weather form change by @AsparagusEduardo in [#8115](https://github.com/rh-hideout/pokeemerald-expansion/pull/8115) +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Deprecate various macro by @AlexOn1ine in [#8092](https://github.com/rh-hideout/pokeemerald-expansion/pull/8092) +* Fixes hacky SetMoveEffect script calls by @AlexOn1ine in [#7987](https://github.com/rh-hideout/pokeemerald-expansion/pull/7987) +* Create BattleStruct sub struct for event states by @AlexOn1ine in [#8131](https://github.com/rh-hideout/pokeemerald-expansion/pull/8131) +* Attackstring hitmarker clean up by @AlexOn1ine in [#8136](https://github.com/rh-hideout/pokeemerald-expansion/pull/8136) +* Clean up ability effect hitmarker by @AlexOn1ine in [#8138](https://github.com/rh-hideout/pokeemerald-expansion/pull/8138) +* Increase number of additional move effects by @AlexOn1ine in [#8149](https://github.com/rh-hideout/pokeemerald-expansion/pull/8149) +* Remove redundant Future Sight flag by @AlexOn1ine in [#8185](https://github.com/rh-hideout/pokeemerald-expansion/pull/8185) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Micro clean up in BattleStruct by @AlexOn1ine in [#8177](https://github.com/rh-hideout/pokeemerald-expansion/pull/8177) +* HandleAction_UseMove minor cleanup by @mrgriffin in [#8214](https://github.com/rh-hideout/pokeemerald-expansion/pull/8214) +* Revert gBattleTurnCounter change by @AlexOn1ine in [#8197](https://github.com/rh-hideout/pokeemerald-expansion/pull/8197) +* Canceller -> Canceler rename by @AlexOn1ine in [#8294](https://github.com/rh-hideout/pokeemerald-expansion/pull/8294) +* Remove leftover scrtipt redirection by @AlexOn1ine in [#8317](https://github.com/rh-hideout/pokeemerald-expansion/pull/8317) +* Expand usage of FaintedActions enum in HandleFaintedMonActions by @PhallenTree in [#8346](https://github.com/rh-hideout/pokeemerald-expansion/pull/8346) +* Move end clear bits clean up by @AlexOn1ine in [#8354](https://github.com/rh-hideout/pokeemerald-expansion/pull/8354) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +### Fixed +* Fixes Weak Armor and items not displaying stat change attributes by @PhallenTree in [#7701](https://github.com/rh-hideout/pokeemerald-expansion/pull/7701) +* Refactors ruin ability checks into a field effect by @AlexOn1ine in [#7711](https://github.com/rh-hideout/pokeemerald-expansion/pull/7711) +* Attackcanceller fixes and improvements by @AlexOn1ine in [#7698](https://github.com/rh-hideout/pokeemerald-expansion/pull/7698) +* Fix Critical Capture RNG and Catching Charm boost by @kittenchilly in [#7534](https://github.com/rh-hideout/pokeemerald-expansion/pull/7534) +* Fixes activation order for a couple abilities by @AlexOn1ine in [#7732](https://github.com/rh-hideout/pokeemerald-expansion/pull/7732) +* More White Herb fixes/clean up by @AlexOn1ine in [#7826](https://github.com/rh-hideout/pokeemerald-expansion/pull/7826) +* Missing IsBattlerAlive checks in Opportunist/Mirror Herb by @AlexOn1ine in [#7829](https://github.com/rh-hideout/pokeemerald-expansion/pull/7829) +* Item battle effect refactor by @AlexOn1ine in [#7857](https://github.com/rh-hideout/pokeemerald-expansion/pull/7857) +* Fix Fling Mental Herb message by @AlexOn1ine in [#7984](https://github.com/rh-hideout/pokeemerald-expansion/pull/7984) +* Fixes Ruin field statuses negation conditions + upcoming cleanup by @PhallenTree in [#8042](https://github.com/rh-hideout/pokeemerald-expansion/pull/8042) +* Fix nature power string and add support for evnvironment in tests by @FosterProgramming in [#8068](https://github.com/rh-hideout/pokeemerald-expansion/pull/8068) + - Add option to choose an environment when setting up a battle test +* Corrects battler position checks in battle_message.c by @grintoul1 in [#8070](https://github.com/rh-hideout/pokeemerald-expansion/pull/8070) +* Emergency Exit on hazards activation + fix end of turn activation by @PhallenTree in [#8075](https://github.com/rh-hideout/pokeemerald-expansion/pull/8075) +* Improve sBattleIntroSlideFuncs bounds check by @hedara90 in [#8084](https://github.com/rh-hideout/pokeemerald-expansion/pull/8084) +* Fixes Sticky Barb never getting transferred to attacker + tests by @PhallenTree in [#8108](https://github.com/rh-hideout/pokeemerald-expansion/pull/8108) +* Fixes flung items sometimes being blocked by Unnerve by @PhallenTree in [#8114](https://github.com/rh-hideout/pokeemerald-expansion/pull/8114) +* Adjust faint battler script by @AlexOn1ine in [#8137](https://github.com/rh-hideout/pokeemerald-expansion/pull/8137) +* Allow to send active mon to PC when capturing a Pokemon by @FosterProgramming in [#8111](https://github.com/rh-hideout/pokeemerald-expansion/pull/8111) +* Fix transform not loading the correct sprites when facing shiny or unown by @FosterProgramming in [#8146](https://github.com/rh-hideout/pokeemerald-expansion/pull/8146) +* Fixes Receiver not immediately activating copied abilities by @PhallenTree in [#8162](https://github.com/rh-hideout/pokeemerald-expansion/pull/8162) +* Fix destiny knot behavior and add tests by @FosterProgramming in [#8174](https://github.com/rh-hideout/pokeemerald-expansion/pull/8174) +* Fix recharge moves + add recharge move tests by @FosterProgramming in [#8181](https://github.com/rh-hideout/pokeemerald-expansion/pull/8181) +* Fixes Magician for spread moves by @AlexOn1ine in [#8170](https://github.com/rh-hideout/pokeemerald-expansion/pull/8170) +* Fix tera tint not applying on activation by @FosterProgramming in [#8135](https://github.com/rh-hideout/pokeemerald-expansion/pull/8135) +* Fixes wrongly assigned count for Semi Invulnerable state by @AlexOn1ine in [#8175](https://github.com/rh-hideout/pokeemerald-expansion/pull/8175) +* Fixes Drain Punch / Parental Bond / Scale Shot interaction by @AlexOn1ine in [#8198](https://github.com/rh-hideout/pokeemerald-expansion/pull/8198) +* Avoid illegal GetBattlerAtPosition by @mrgriffin in [#8225](https://github.com/rh-hideout/pokeemerald-expansion/pull/8225) +* DamageContext: chosenMove by @mrgriffin in [#8224](https://github.com/rh-hideout/pokeemerald-expansion/pull/8224) +* AccuracyCheck: Avoid calling GetMoveEffect with NO_ACC_CALC_CHECK_LOC… by @mrgriffin in [#8222](https://github.com/rh-hideout/pokeemerald-expansion/pull/8222) +* moveend: Handle MOVE_UNAVAILABLE in MOVEEND_THIRD_MOVE_BLOCK by @mrgriffin in [#8215](https://github.com/rh-hideout/pokeemerald-expansion/pull/8215) +* Fix wrong ditto sprite on capture by @FosterProgramming in [#8226](https://github.com/rh-hideout/pokeemerald-expansion/pull/8226) +* SpriteCB_EnemyShadow: Avoid use-after-free by @mrgriffin in [#8220](https://github.com/rh-hideout/pokeemerald-expansion/pull/8220) +* trysethelpinghand avoid illegal target by @mrgriffin in [#8218](https://github.com/rh-hideout/pokeemerald-expansion/pull/8218) +* Fixed an issue related to same turn Encore targeting by @LinathanZel in [#8230](https://github.com/rh-hideout/pokeemerald-expansion/pull/8230) +* Avoid illegal move retargeting in singles by @mrgriffin in [#8217](https://github.com/rh-hideout/pokeemerald-expansion/pull/8217) +* Fixes Shell Trap not activating on contact but no damage by @AlexOn1ine in [#8243](https://github.com/rh-hideout/pokeemerald-expansion/pull/8243) +* Fix Magic Coat reflecting hazard moves incorrectly when used by a partner by @moostoet in [#8272](https://github.com/rh-hideout/pokeemerald-expansion/pull/8272) + - Magic Coat now properly reflects hazard moves from either slot in double battles. +* Shell Trap tests and Fix for Encore interaction by @AlexOn1ine in [#8268](https://github.com/rh-hideout/pokeemerald-expansion/pull/8268) +* Fix max mushroom unable to be selected when one stat is maxed by @FosterProgramming in [#8287](https://github.com/rh-hideout/pokeemerald-expansion/pull/8287) +* Block selecting x items when contrary pokemon are at minimum stages by @FosterProgramming in [#8288](https://github.com/rh-hideout/pokeemerald-expansion/pull/8288) +* Fix Fur Coat affecting confusion self-damage by @moostoet in [#8267](https://github.com/rh-hideout/pokeemerald-expansion/pull/8267) + - Fix confusion self-damage ignoring defense/attack abilities such as Fur Coat. +* Fixes End Turn Speed Order by @AlexOn1ine in [#8289](https://github.com/rh-hideout/pokeemerald-expansion/pull/8289) +* Make switchout abilities trigger after a pokemon has returned to its ball by @FosterProgramming in [#8304](https://github.com/rh-hideout/pokeemerald-expansion/pull/8304) +* Fix Shed Shell allowing fleeing/teleporting and Smoke Ball failing to guarantee escape by @moostoet in [#8286](https://github.com/rh-hideout/pokeemerald-expansion/pull/8286) +* Fix bug where defiant/competitive would pass their stat change to the next target by @FosterProgramming in [#8312](https://github.com/rh-hideout/pokeemerald-expansion/pull/8312) +* Fix max move message against semi invulnerable target by @FosterProgramming in [#8313](https://github.com/rh-hideout/pokeemerald-expansion/pull/8313) +* Fixes Neutralizing Gas displaying message when exiting with multiple users by @PhallenTree in [#8318](https://github.com/rh-hideout/pokeemerald-expansion/pull/8318) +* Fix Kings Rock not being ignored by flinch moves by @AlexOn1ine in [#8327](https://github.com/rh-hideout/pokeemerald-expansion/pull/8327) +* Fix Upper Hand failure still activating Protean by @AlexOn1ine in [#8329](https://github.com/rh-hideout/pokeemerald-expansion/pull/8329) +* Fix Protosynthesis stat boosts ignoring speed drops by @moostoet in [#8277](https://github.com/rh-hideout/pokeemerald-expansion/pull/8277) + - Protosynthesis and Quark Drive now recalculate their boosted stat when Speed is lowered or Neutralizing Gas temporarily disables the ability. +* Fix switch-in abilities not triggering on revive by @FosterProgramming in [#8293](https://github.com/rh-hideout/pokeemerald-expansion/pull/8293) +* More Neutralizing Gas cleanup by @PhallenTree in [#8335](https://github.com/rh-hideout/pokeemerald-expansion/pull/8335) +* Clear Destiny Bond/Grudge bits when not activated by @PhallenTree in [#8334](https://github.com/rh-hideout/pokeemerald-expansion/pull/8334) +* Fix cure status item effect not working properly in doubles by @FosterProgramming in [#8339](https://github.com/rh-hideout/pokeemerald-expansion/pull/8339) +* Fix infinite confusion (berserk gene) not being cured by cure_status bag items by @FosterProgramming in [#8343](https://github.com/rh-hideout/pokeemerald-expansion/pull/8343) +* Fix `B_PHYSICAL_SPECIAL_SPLIT` when set to Gen 4 by @AsparagusEduardo in [#8348](https://github.com/rh-hideout/pokeemerald-expansion/pull/8348) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix substitute graphic not disappearing after using a pivor move by @FosterProgramming in [#8340](https://github.com/rh-hideout/pokeemerald-expansion/pull/8340) +* Fixes Beak Blast burning after Beak Blast was already used by @PhallenTree in [#8361](https://github.com/rh-hideout/pokeemerald-expansion/pull/8361) +* Fix Roar not being recorded for LastUsedMove by @AlexOn1ine in [#8362](https://github.com/rh-hideout/pokeemerald-expansion/pull/8362) +* Fixes Neutralizing Gas / Mold Breaker / Dragon Darts interaction by @AlexOn1ine in [#8389](https://github.com/rh-hideout/pokeemerald-expansion/pull/8389) +* Fixes battle tv overwriting damage values by @AlexOn1ine in [#8378](https://github.com/rh-hideout/pokeemerald-expansion/pull/8378) +* Fix ball cycling not working properly when the same ball take multiple bag slots by @FosterProgramming in [#8163](https://github.com/rh-hideout/pokeemerald-expansion/pull/8163) + - Two new defines added to items.h `FIRST_BALL_INDEX` and `LAST_BALL_INDEX` + - We now assume the indexes of all regular ball usable in wild battle have consecutive indexes and some features (throw ball shortcut in battle) might break if not true +* Prevent double Dynamax for single-trainer 2v1 multi battles by @moostoet in [#8323](https://github.com/rh-hideout/pokeemerald-expansion/pull/8323) + - Fixed AI 2v1 multibattles incorrectly allowing both opponent leads to Dynamax in the same turn. + +## 🤹 Moves 🤹 +### Changed +* Separates FRB and FRZ animations by @grintoul1 in [#7611](https://github.com/rh-hideout/pokeemerald-expansion/pull/7611) +* Fixed test "Revival Blessing cannot revive a partner's party member" by @grintoul1 in [#8031](https://github.com/rh-hideout/pokeemerald-expansion/pull/8031) +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* Added Gen 6 contest combos by @fdeblasio in [#8251](https://github.com/rh-hideout/pokeemerald-expansion/pull/8251) +* Make tailwind anim mirror based on side by @FosterProgramming in [#8249](https://github.com/rh-hideout/pokeemerald-expansion/pull/8249) +* Make rainbow effect anim change based on side by @FosterProgramming in [#8269](https://github.com/rh-hideout/pokeemerald-expansion/pull/8269) + - Art assets by [SonikkuA-DatH](https://github.com/SonikkuA-DatH) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) + +### Fixed +* Fix some move animations leaking VRAM and freeing already freed tags by @hedara90 in [#7977](https://github.com/rh-hideout/pokeemerald-expansion/pull/7977) + +## 🎭 Abilities 🎭 +### Changed +* followup: AbilityBattleEffects return type is incorrect by @khbsd in [#7827](https://github.com/rh-hideout/pokeemerald-expansion/pull/7827) + +## 🧶 Items 🧶 +### Fixed +* Allow vs seekers to work with script not starting with trainerbattle by @FosterProgramming in [#8062](https://github.com/rh-hideout/pokeemerald-expansion/pull/8062) + - VS seeker now work with trainers who don't start with trainer_battle. You can use `vsseeker_rematchid TRAINER_ID` to indicate that this NPC is a battling trainer and the game will fetch the appropriate rematch if necessary. ` vsseeker_rematchid` work like a `cant_see_if_trainerflag_set` with additional functionality to handle vs seeker. + - All NPCs who don't start with either `vsseeker_rematchid` or `trainerbattle` will show as "X"/unmatchable by the vs seeker, so non-rematchable trainer who do not start with `trainerbattle may "lie" and not show an excalmation mark showing they haven't been fought yet. This can be fixed by including a `vsseeker_rematchid` for them too. +* Removed extra period in Pokéshi Doll description by @montmoguri in [#8252](https://github.com/rh-hideout/pokeemerald-expansion/pull/8252) + +## 🤖 Battle AI 🤖 +### Added +* Improved move additional effect handling; now accounts for Shield Dust. by @surskitty in [#7650](https://github.com/rh-hideout/pokeemerald-expansion/pull/7650) +* Adjusted AI handling for Gravity; AI for weather/field status additional effects. by @surskitty in [#7651](https://github.com/rh-hideout/pokeemerald-expansion/pull/7651) +* Improved AI for status curing; trainer items, Purify, Smelling Salts, Sparkling Aria by @surskitty in [#7853](https://github.com/rh-hideout/pokeemerald-expansion/pull/7853) + +### Changed +* AI uses Magnetic Flux. by @surskitty in [#7642](https://github.com/rh-hideout/pokeemerald-expansion/pull/7642) +* AI uses Flower Shield. by @surskitty in [#7640](https://github.com/rh-hideout/pokeemerald-expansion/pull/7640) +* AI uses Life Dew. by @surskitty in [#7643](https://github.com/rh-hideout/pokeemerald-expansion/pull/7643) +* AI uses Gear Up. by @surskitty in [#7641](https://github.com/rh-hideout/pokeemerald-expansion/pull/7641) +* Correcting test AI won't use status moves if partner chose Helping Hand by @surskitty in [#7649](https://github.com/rh-hideout/pokeemerald-expansion/pull/7649) +* IncreaseStatUpScore adjustments for Simple, +3 moves, Acupressure, max move effects by @surskitty in [#7662](https://github.com/rh-hideout/pokeemerald-expansion/pull/7662) +* AI handling for Coaching. by @surskitty in [#7661](https://github.com/rh-hideout/pokeemerald-expansion/pull/7661) +* Simplifying calls to IsBattlerTrapped; treats being unable to switch as trappedness by @surskitty in [#7671](https://github.com/rh-hideout/pokeemerald-expansion/pull/7671) +* AI Tests: Gimmick Support by @mrgriffin in [#7694](https://github.com/rh-hideout/pokeemerald-expansion/pull/7694) +* AI can use Z-status moves by @surskitty in [#7666](https://github.com/rh-hideout/pokeemerald-expansion/pull/7666) +* Move some checks out of IncreaseStatUpScore to ShouldRaiseAnyStat by @surskitty in [#7722](https://github.com/rh-hideout/pokeemerald-expansion/pull/7722) +* Moving additional effects out of AI_CalcMoveEffectScore and into AI_CalcMoveAdditionalEffectScore by @surskitty in [#7727](https://github.com/rh-hideout/pokeemerald-expansion/pull/7727) +* AI sees dynamic moves and Nature Power as correct types for weather, terrain by @surskitty in [#7759](https://github.com/rh-hideout/pokeemerald-expansion/pull/7759) +* Fix abusable two-turn-move switch behaviour by @Pawkkie in [#7770](https://github.com/rh-hideout/pokeemerald-expansion/pull/7770) +* Z Status move handling: Conversion, Detect, Nature Power, Transform by @surskitty in [#7721](https://github.com/rh-hideout/pokeemerald-expansion/pull/7721) +* Use stored values for ai switch-in effectiveness checks by @AlexOn1ine in [#7794](https://github.com/rh-hideout/pokeemerald-expansion/pull/7794) +* Changing all HasBattlerSideAbility to AI_IsAbilityOnSide. by @surskitty in [#7927](https://github.com/rh-hideout/pokeemerald-expansion/pull/7927) +* Weather/Terrain AI touch-ups. by @surskitty in [#7933](https://github.com/rh-hideout/pokeemerald-expansion/pull/7933) +* Improving the checks for the AI to avoid Encore; adding RISK_ENCORE_CHANCE config. by @surskitty in [#7929](https://github.com/rh-hideout/pokeemerald-expansion/pull/7929) +* Fixes CanUseLastResort and resolves 3 KNOWN_FAILING Last Resort tests by @grintoul1 in [#8032](https://github.com/rh-hideout/pokeemerald-expansion/pull/8032) +* Add AI flag AI_FLAG_KNOW_OPPONENT_PARTY to know all species in party by @moostoet in [#8290](https://github.com/rh-hideout/pokeemerald-expansion/pull/8290) + +### Fixed +* Score adjustments towards guaranteed stat drops. by @surskitty in [#7670](https://github.com/rh-hideout/pokeemerald-expansion/pull/7670) +* AI uses Extreme Evoboost. by @surskitty in [#7706](https://github.com/rh-hideout/pokeemerald-expansion/pull/7706) +* Fixes AI scoring when Priority moves are blocked by @PhallenTree in [#7745](https://github.com/rh-hideout/pokeemerald-expansion/pull/7745) +* fix (AI scoring): shield dust considerations, IsMoveEffectInMinus self effect edge case, hitsToKO zero-case consideration by @ghostyboyy97 in [#8126](https://github.com/rh-hideout/pokeemerald-expansion/pull/8126) + - The AI now sees Shield Dust on the player's Pokemon correctly + - The AI now sees self-targeted positive effect boosts correctly +* fix (contrary): Contrary stat down handling in MoveEffectInPlus by @ghostyboyy97 in [#8165](https://github.com/rh-hideout/pokeemerald-expansion/pull/8165) + - When comparing positive move effects in damaging move comparison, the AI will correctly see moves like Leaf Storm as beneficial if their Pokemon has Contrary. +* Added check for parental bond killing through sturdy by @MaximeGr00 in [#8206](https://github.com/rh-hideout/pokeemerald-expansion/pull/8206) + - AI now accounts for Parental Bond when checking if a move can ko the player through sturdy/focus sash. +* AI: Handle MOVE_UNAVAILABLE in last used moves by @mrgriffin in [#8219](https://github.com/rh-hideout/pokeemerald-expansion/pull/8219) +* Fix AI_FLAG_DOUBLE_ACE_POKEMON sending duplicate Pokémon in doubles by @moostoet in [#8279](https://github.com/rh-hideout/pokeemerald-expansion/pull/8279) + - Fixed AI_FLAG_DOUBLE_ACE_POKEMON trainers resending the same Pokémon after a KO instead of their two Ace Pokémon in double battles. +* Rework switch AI and add more tests for ace pokemon flags by @FosterProgramming in [#8321](https://github.com/rh-hideout/pokeemerald-expansion/pull/8321) + - All remaining issues with the AI flags Ace Pokemon and Double Ace pokemon should be fixed + - The smart switching AI should be less likely to switch a pokemon about to die if it doesn't have a pokemon with a good matchup to replace it +* Fix switchin KO threshold logic by @Pawkkie in [#8370](https://github.com/rh-hideout/pokeemerald-expansion/pull/8370) + +## 🧹 Other Cleanup 🧹 +* Update multiple battle messages by @AsparagusEduardo in [#7529](https://github.com/rh-hideout/pokeemerald-expansion/pull/7529) + - Removed unused messages + - Changed ability "X prevents Y" to "It doesn't affect X..." + - Eg. `"The opposing Snorlax's Immunity prevents poisoning!"` + - Removed `B_ABILITY_POP_UP`. Revert commit `b501fe7354bcd957396465c621ae7af5959ac5b0` to undo this. +* Battle debug menu now checks correct parties depending on battler party by @grintoul1 in [#7652](https://github.com/rh-hideout/pokeemerald-expansion/pull/7652) +* Correcting test AI won't use status moves if partner chose Helping Hand by @surskitty in [#7649](https://github.com/rh-hideout/pokeemerald-expansion/pull/7649) +* Remove Uproar attack battle script by @AlexOn1ine in [#7715](https://github.com/rh-hideout/pokeemerald-expansion/pull/7715) +* Fix up end turn scripts plus small documentation by @AlexOn1ine in [#7758](https://github.com/rh-hideout/pokeemerald-expansion/pull/7758) +* `field_name_box` smol followup by @mudskipper13 in [#7762](https://github.com/rh-hideout/pokeemerald-expansion/pull/7762) +* Remove redundant function call by @AlexOn1ine in [#7752](https://github.com/rh-hideout/pokeemerald-expansion/pull/7752) +* Minor White Herb and Neutralizing Gas clean up by @AlexOn1ine in [#7754](https://github.com/rh-hideout/pokeemerald-expansion/pull/7754) +* Minor clean up for Lightning Rod / Storm Drain by @AlexOn1ine in [#7778](https://github.com/rh-hideout/pokeemerald-expansion/pull/7778) +* Add func GetChosenMoveFromPosition by @AlexOn1ine in [#7810](https://github.com/rh-hideout/pokeemerald-expansion/pull/7810) +* GetBattlerHoldEffect clean up by @AlexOn1ine in [#7819](https://github.com/rh-hideout/pokeemerald-expansion/pull/7819) +* Remove unused gBattleStruct fields by @Bassoonian in [#7822](https://github.com/rh-hideout/pokeemerald-expansion/pull/7822) +* followup: AbilityBattleEffects return type is incorrect by @khbsd in [#7827](https://github.com/rh-hideout/pokeemerald-expansion/pull/7827) +* Streamline tryheal macros by @Bassoonian in [#7830](https://github.com/rh-hideout/pokeemerald-expansion/pull/7830) +* Remove two unused bits from battle structs by @Bassoonian in [#7835](https://github.com/rh-hideout/pokeemerald-expansion/pull/7835) +* Removes a few redundant hitmarkers by @AlexOn1ine in [#7915](https://github.com/rh-hideout/pokeemerald-expansion/pull/7915) +* Remove EffectHitSetTerrain script to use moveeffect by @AlexOn1ine in [#7938](https://github.com/rh-hideout/pokeemerald-expansion/pull/7938) +* Clean up follow up for AtkCanceller refactor by @AlexOn1ine in [#7951](https://github.com/rh-hideout/pokeemerald-expansion/pull/7951) +* Remove appearedInBattle bitfield & redundant use of sentOut partyState by @Nopinou in [#8011](https://github.com/rh-hideout/pokeemerald-expansion/pull/8011) +* Some more documentation and cleanup by @Bassoonian in [#8020](https://github.com/rh-hideout/pokeemerald-expansion/pull/8020) +* Volatile cleared in a redundant spot by @AlexOn1ine in [#8015](https://github.com/rh-hideout/pokeemerald-expansion/pull/8015) +* Moved usedHeldItem to Party State struct by @AlexOn1ine in [#8006](https://github.com/rh-hideout/pokeemerald-expansion/pull/8006) +* Remove usage of gBattlerTarget for MirrorHerb/Opportunist by @AlexOn1ine in [#8033](https://github.com/rh-hideout/pokeemerald-expansion/pull/8033) +* Even more enums and documentation by @Bassoonian in [#8029](https://github.com/rh-hideout/pokeemerald-expansion/pull/8029) +* Decouple (Overworld) Statuses from ability function by @AlexOn1ine in [#8002](https://github.com/rh-hideout/pokeemerald-expansion/pull/8002) +* Fixes Ruin field statuses negation conditions + upcoming cleanup by @PhallenTree in [#8042](https://github.com/rh-hideout/pokeemerald-expansion/pull/8042) +* Minor clean up in menu.c by @estellarc in [#8060](https://github.com/rh-hideout/pokeemerald-expansion/pull/8060) +* Clean up for item hold effect refactor by @AlexOn1ine in [#8014](https://github.com/rh-hideout/pokeemerald-expansion/pull/8014) +* Parametrized Ice Face's weather form change by @AsparagusEduardo in [#8115](https://github.com/rh-hideout/pokeemerald-expansion/pull/8115) +* Clean up redundant todo by @AlexOn1ine in [#8094](https://github.com/rh-hideout/pokeemerald-expansion/pull/8094) +* Deprecate various macro by @AlexOn1ine in [#8092](https://github.com/rh-hideout/pokeemerald-expansion/pull/8092) +* Fixes hacky SetMoveEffect script calls by @AlexOn1ine in [#7987](https://github.com/rh-hideout/pokeemerald-expansion/pull/7987) +* Create BattleStruct sub struct for event states by @AlexOn1ine in [#8131](https://github.com/rh-hideout/pokeemerald-expansion/pull/8131) +* Attackstring hitmarker clean up by @AlexOn1ine in [#8136](https://github.com/rh-hideout/pokeemerald-expansion/pull/8136) +* Clean up ability effect hitmarker by @AlexOn1ine in [#8138](https://github.com/rh-hideout/pokeemerald-expansion/pull/8138) +* Fix Kyurem typo in swap move tables by @Bassoonian in [#8139](https://github.com/rh-hideout/pokeemerald-expansion/pull/8139) +* Fix typo in Voltorb-Hisui pokedex entry by @PhallenTree in [#8143](https://github.com/rh-hideout/pokeemerald-expansion/pull/8143) +* porymap default settings by @FosterProgramming in [#8038](https://github.com/rh-hideout/pokeemerald-expansion/pull/8038) + - WARNING: A change was made for new projects map files to match poymap output. This change might break people's projects with existing versions of those files. The files affected are ` data/maps/map_groups.json`, `src/data/heal_locations.json`, `src/data/region_map/region_map_sections.json` and `src/data/wild_encounters.json` + If you have an issue with one of those files during the merging process, you should run this command + `git checkout HEAD -- ` + which will reset the file to the version before you initiated the merge +* Sets instant text speed flag to false by default by @khbsd in [#8179](https://github.com/rh-hideout/pokeemerald-expansion/pull/8179) +* Remove redundant Future Sight flag by @AlexOn1ine in [#8185](https://github.com/rh-hideout/pokeemerald-expansion/pull/8185) +* Fix incorrect comments by @AlexOn1ine in [#8193](https://github.com/rh-hideout/pokeemerald-expansion/pull/8193) +* Fixed Uproar's description and spacing by @fdeblasio in [#8187](https://github.com/rh-hideout/pokeemerald-expansion/pull/8187) +* Add include/constants/script_commands.h to gitignore by @AlexOn1ine in [#8169](https://github.com/rh-hideout/pokeemerald-expansion/pull/8169) +* Powder Move blocking cleanup by @PhallenTree in [#8194](https://github.com/rh-hideout/pokeemerald-expansion/pull/8194) +* Converted landmarks to COMPOUND_STRINGs by @fdeblasio in [#8205](https://github.com/rh-hideout/pokeemerald-expansion/pull/8205) +* Micro clean up in BattleStruct by @AlexOn1ine in [#8177](https://github.com/rh-hideout/pokeemerald-expansion/pull/8177) +* Clean usage of gMovesInfo by @AsparagusEduardo in [#8234](https://github.com/rh-hideout/pokeemerald-expansion/pull/8234) + - Also, fixed an OOB in `HasMoveThatChangesKOThreshold` +* HandleAction_UseMove minor cleanup by @mrgriffin in [#8214](https://github.com/rh-hideout/pokeemerald-expansion/pull/8214) +* Revert gBattleTurnCounter change by @AlexOn1ine in [#8197](https://github.com/rh-hideout/pokeemerald-expansion/pull/8197) +* Added contest config and cleaned up contest category variables by @fdeblasio in [#8178](https://github.com/rh-hideout/pokeemerald-expansion/pull/8178) +* Adjust Canceler naming to contain only one l by @AlexOn1ine in [#8258](https://github.com/rh-hideout/pokeemerald-expansion/pull/8258) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Test type enum indentation by @AsparagusEduardo in [#8273](https://github.com/rh-hideout/pokeemerald-expansion/pull/8273) +* Added missing 'coolness' string by @fdeblasio in [#8274](https://github.com/rh-hideout/pokeemerald-expansion/pull/8274) +* Canceller -> Canceler rename by @AlexOn1ine in [#8294](https://github.com/rh-hideout/pokeemerald-expansion/pull/8294) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Documentation clean up for MoveCanceler by @AlexOn1ine in [#8297](https://github.com/rh-hideout/pokeemerald-expansion/pull/8297) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Remove leftover scrtipt redirection by @AlexOn1ine in [#8317](https://github.com/rh-hideout/pokeemerald-expansion/pull/8317) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Expand usage of FaintedActions enum in HandleFaintedMonActions by @PhallenTree in [#8346](https://github.com/rh-hideout/pokeemerald-expansion/pull/8346) +* Move end clear bits clean up by @AlexOn1ine in [#8354](https://github.com/rh-hideout/pokeemerald-expansion/pull/8354) +* Indent unintented if statement by @hedara90 in [#8367](https://github.com/rh-hideout/pokeemerald-expansion/pull/8367) +* Update Lash Out description to clarify its effect by @PhallenTree in [#8372](https://github.com/rh-hideout/pokeemerald-expansion/pull/8372) +* Slight Protect moveend cleanup by @AsparagusEduardo in [#8385](https://github.com/rh-hideout/pokeemerald-expansion/pull/8385) +* Restored encourageEncore flag to non-volatile status effects by @AsparagusEduardo in [#8387](https://github.com/rh-hideout/pokeemerald-expansion/pull/8387) + +## 🧪 Test Runner 🧪 +### Added +* Multibattle testing system by @grintoul1 in [#7257](https://github.com/rh-hideout/pokeemerald-expansion/pull/7257) +* Prevent EXPECT functions from casting negative numbers into unsigned by @FosterProgramming in [#7866](https://github.com/rh-hideout/pokeemerald-expansion/pull/7866) + +### Changed +* AI Tests: Gimmick Support by @mrgriffin in [#7694](https://github.com/rh-hideout/pokeemerald-expansion/pull/7694) +* Some tests for future Dynamax AI behavior. by @surskitty in [#7707](https://github.com/rh-hideout/pokeemerald-expansion/pull/7707) +* Add some missing move animations to the move animation tests by @FosterProgramming in [#7507](https://github.com/rh-hideout/pokeemerald-expansion/pull/7507) +* Fixes CanUseLastResort and resolves 3 KNOWN_FAILING Last Resort tests by @grintoul1 in [#8032](https://github.com/rh-hideout/pokeemerald-expansion/pull/8032) +* Fixed test "Revival Blessing cannot revive a partner's party member" by @grintoul1 in [#8031](https://github.com/rh-hideout/pokeemerald-expansion/pull/8031) +* Added Soundproof and Bulletproof tests by @AsparagusEduardo in [#8189](https://github.com/rh-hideout/pokeemerald-expansion/pull/8189) +* Wrote some missing tests by @AsparagusEduardo in [#8203](https://github.com/rh-hideout/pokeemerald-expansion/pull/8203) +* Refactor random functions to be runner specific by @FosterProgramming in [#7816](https://github.com/rh-hideout/pokeemerald-expansion/pull/7816) +* A couple more tests by @AsparagusEduardo in [#8209](https://github.com/rh-hideout/pokeemerald-expansion/pull/8209) +* Fixed some failing tests with GEN_LATEST = GEN_5 by @AsparagusEduardo in [#8241](https://github.com/rh-hideout/pokeemerald-expansion/pull/8241) +* Add test for mold breaker/ice scales interaction by @FosterProgramming in [#8240](https://github.com/rh-hideout/pokeemerald-expansion/pull/8240) +* Yet more tests by @AsparagusEduardo in [#8228](https://github.com/rh-hideout/pokeemerald-expansion/pull/8228) + - Added tests for: + - Dark Aura + - Fairy Aura + - Flare Boost + - Toxic Boost + - Added test names for Flying Press. +* Test type enum indentation by @AsparagusEduardo in [#8273](https://github.com/rh-hideout/pokeemerald-expansion/pull/8273) +* Slightly increase headless test speed by modifying animations by @AsparagusEduardo in [#8299](https://github.com/rh-hideout/pokeemerald-expansion/pull/8299) +* Make `gTestRunnerHeadless` into a constant outside of tests by @hedara90 in [#8306](https://github.com/rh-hideout/pokeemerald-expansion/pull/8306) +* Tests for Max Moves already exist by @AlexOn1ine in [#8314](https://github.com/rh-hideout/pokeemerald-expansion/pull/8314) +* Finished fixing tests when setting `GEN_LATEST` to `GEN_5` by @AsparagusEduardo in [#8263](https://github.com/rh-hideout/pokeemerald-expansion/pull/8263) +* Wrote missing Fling tests by @AsparagusEduardo in [#8383](https://github.com/rh-hideout/pokeemerald-expansion/pull/8383) + +### Fixed +* Corrects ONE_VS_TWO_BATTLE_TEST to use BATTLE_TEST_ARGS_ONE_VS_TWO by @grintoul1 in [#8061](https://github.com/rh-hideout/pokeemerald-expansion/pull/8061) +* Fixes difficulty not being restored after tests by @grintoul1 in [#8129](https://github.com/rh-hideout/pokeemerald-expansion/pull/8129) +* Reset saveblock data between test runs by @hedara90 in [#8145](https://github.com/rh-hideout/pokeemerald-expansion/pull/8145) +* Sheer force test fix by @grintoul1 in [#8142](https://github.com/rh-hideout/pokeemerald-expansion/pull/8142) +* Test only enabled species by @mrgriffin in [#8216](https://github.com/rh-hideout/pokeemerald-expansion/pull/8216) +* Fix ohko moves ai tests by @FosterProgramming in [#8309](https://github.com/rh-hideout/pokeemerald-expansion/pull/8309) +* Fixed broken friendship from items in battle test and added new test for opposite case by @pkmnsnfrn in [#7872](https://github.com/rh-hideout/pokeemerald-expansion/pull/7872) +* Add tests to verify aromatherapy is not affected by heal bell config by @FosterProgramming in [#8344](https://github.com/rh-hideout/pokeemerald-expansion/pull/8344) +* Pre gen 5 encored move now signals the test engine a move is happening by @FosterProgramming in [#8338](https://github.com/rh-hideout/pokeemerald-expansion/pull/8338) +* Refactor Beat Up handling for Gen 3/4 defaults, fix crit check, and expand test coverage by @moostoet in [#8307](https://github.com/rh-hideout/pokeemerald-expansion/pull/8307) + - BUGFIX: Beat Up (`GEN =< 5`) now no longer doubles its damage on every non-critical hit + - Beat Up now precomputes eligible party members/strikers for consistent multi-hit resolution and expanded tests covering both pre-Gen5 and Gen5+ rules +* Fix player and partner trainer sprite palettes to 8 and 9, preventing unwanted palette changes by @grintoul1 in [#8127](https://github.com/rh-hideout/pokeemerald-expansion/pull/8127) +* Fix known failing AI trace test by @FosterProgramming in [#8337](https://github.com/rh-hideout/pokeemerald-expansion/pull/8337) + +## 📚 Documentation 📚 +* Converts some defines to enums and name unnamed enums by @Bassoonian in [#8019](https://github.com/rh-hideout/pokeemerald-expansion/pull/8019) +* Some more documentation and cleanup by @Bassoonian in [#8020](https://github.com/rh-hideout/pokeemerald-expansion/pull/8020) +* Even more enums and documentation by @Bassoonian in [#8029](https://github.com/rh-hideout/pokeemerald-expansion/pull/8029) +* Add type enum by @Bassoonian in [#8054](https://github.com/rh-hideout/pokeemerald-expansion/pull/8054) +* Revert reversion by @AlexOn1ine in [#8112](https://github.com/rh-hideout/pokeemerald-expansion/pull/8112) +* Lock mdbook to v0.4.35 to fix docs not building by @grintoul1 in [#8130](https://github.com/rh-hideout/pokeemerald-expansion/pull/8130) +* Add additional comment explaing map name popup transparency side-effects by @FosterProgramming in [#8117](https://github.com/rh-hideout/pokeemerald-expansion/pull/8117) +* Fix incorrect comments by @AlexOn1ine in [#8193](https://github.com/rh-hideout/pokeemerald-expansion/pull/8193) +* Moves name box configs into a new file by @AlexOn1ine in [#8250](https://github.com/rh-hideout/pokeemerald-expansion/pull/8250) +* Fix wrongly renamed logs by @AlexOn1ine in [#8264](https://github.com/rh-hideout/pokeemerald-expansion/pull/8264) +* Documentation clean up for MoveCanceler by @AlexOn1ine in [#8297](https://github.com/rh-hideout/pokeemerald-expansion/pull/8297) +* Use MAP_OFFSET by @estellarc in [#8328](https://github.com/rh-hideout/pokeemerald-expansion/pull/8328) +* Fedora install instructions by @estellarc in [#8355](https://github.com/rh-hideout/pokeemerald-expansion/pull/8355) + +## New Contributors +* @purrfectdoodle made their first contribution in [#7689](https://github.com/rh-hideout/pokeemerald-expansion/pull/7689) +* @montmoguri made their first contribution in [#8252](https://github.com/rh-hideout/pokeemerald-expansion/pull/8252) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.13.3...expansion/1.14.0 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 597ba34b41..c97f554929 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.13.4 +// Last version: 1.14.0 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 14 #define EXPANSION_VERSION_PATCH 0 From 2e0e428ffd8416f9cf82e7ac20dbc6de04623b2f Mon Sep 17 00:00:00 2001 From: Hedara Date: Sun, 30 Nov 2025 16:11:41 +0100 Subject: [PATCH 183/183] Start of 1.14.1 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index c97f554929..85e8aba189 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -4,10 +4,10 @@ // Last version: 1.14.0 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 14 -#define EXPANSION_VERSION_PATCH 0 +#define EXPANSION_VERSION_PATCH 1 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE #endif