From da791cde9407641d3eb86700ffb8bd274a9a2d3a Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 24 Oct 2024 12:41:38 -0400 Subject: [PATCH 01/56] Add TRY_DRAW_SPOT_PIXEL --- src/pokemon.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 077b8567938..d59f46ada1b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5684,7 +5684,7 @@ u16 SpeciesToCryId(u16 species) // To draw a spot pixel, add 4 to the color index #define SPOT_COLOR_ADJUSTMENT 4 /* - The macro below handles drawing the randomly-placed spots on Spinda's front sprite. + The macros below handle drawing the randomly-placed spots on Spinda's front sprite. Spinda has 4 spots, each with an entry in gSpindaSpotGraphics. Each entry contains a base x and y coordinate for the spot and a 16x16 binary image. Each bit in the image determines whether that pixel should be considered part of the spot. @@ -5696,18 +5696,26 @@ u16 SpeciesToCryId(u16 species) coordinate is calculated as (baseCoord + (given 4 bits of personality) - 8). In effect this means each spot can start at any position -8 to +7 off of its base coordinates (256 possibilities). - The macro then loops over the 16x16 spot image. For each bit in the spot's binary image, if + DRAW_SPINDA_SPOTS loops over the 16x16 spot image. For each bit in the spot's binary image, if the bit is set then it's part of the spot; try to draw it. A pixel is drawn on Spinda if the - pixel on Spinda satisfies the following formula: ((u8)(colorIndex - 1) <= 2). The -1 excludes - transparent pixels, as these are index 0. Therefore only colors 1, 2, or 3 on Spinda will - allow a spot to be drawn. These color indexes are Spinda's light brown body colors. To create + pixel is between FIRST_SPOT_COLOR and LAST_SPOT_COLOR (so only colors 1, 2, or 3 on Spinda will + allow a spot to be drawn). These color indexes are Spinda's light brown body colors. To create the spot it adds 4 to the color index, so Spinda's spots will be colors 5, 6, and 7. - The above is done two different ways in the macro: one with << 4, and one without. This - is because Spinda's sprite is a 4 bits per pixel image, but the pointer to Spinda's pixels + The above is done in TRY_DRAW_SPOT_PIXEL two different ways: one with << 4, and one without. + This is because Spinda's sprite is a 4 bits per pixel image, but the pointer to Spinda's pixels (destPixels) is an 8 bit pointer, so it addresses two pixels. Shifting by 4 accesses the 2nd of these pixels, so this is done every other time. */ + +// Draw spot pixel if this is Spinda's body color +#define TRY_DRAW_SPOT_PIXEL(pixels, shift) \ + if (((*(pixels) & (0xF << (shift))) >= (FIRST_SPOT_COLOR << (shift))) \ + && ((*(pixels) & (0xF << (shift))) <= (LAST_SPOT_COLOR << (shift)))) \ + { \ + *(pixels) += (SPOT_COLOR_ADJUSTMENT << (shift)); \ + } + #define DRAW_SPINDA_SPOTS(personality, dest) \ { \ s32 i; \ @@ -5737,17 +5745,11 @@ u16 SpeciesToCryId(u16 species) /* of the two pixels is being considered for drawing */ \ if (column & 1) \ { \ - /* Draw spot pixel if this is Spinda's body color */ \ - if ((u8)((*destPixels & 0xF0) - (FIRST_SPOT_COLOR << 4))\ - <= ((LAST_SPOT_COLOR - FIRST_SPOT_COLOR) << 4))\ - *destPixels += (SPOT_COLOR_ADJUSTMENT << 4); \ + TRY_DRAW_SPOT_PIXEL(destPixels, 4); \ } \ else \ { \ - /* Draw spot pixel if this is Spinda's body color */ \ - if ((u8)((*destPixels & 0xF) - FIRST_SPOT_COLOR) \ - <= (LAST_SPOT_COLOR - FIRST_SPOT_COLOR)) \ - *destPixels += SPOT_COLOR_ADJUSTMENT; \ + TRY_DRAW_SPOT_PIXEL(destPixels, 0); \ } \ } \ \ From a3fe53dd28e944ed77ea7fb5f1c97e2630bd6d4d Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Mon, 11 Nov 2024 20:31:21 +0100 Subject: [PATCH 02/56] Cleans up Primal Reversion code --- data/battle_scripts_1.s | 21 ++++++--------------- include/battle_scripts.h | 1 - src/battle_message.c | 2 +- src/battle_util.c | 13 ++----------- 4 files changed, 9 insertions(+), 28 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 19328b7189e..4708ffb99fe 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6988,26 +6988,17 @@ BattleScript_WishMegaEvolution:: goto BattleScript_MegaEvolutionAfterString BattleScript_PrimalReversion:: - call BattleScript_PrimalReversionRet - end3 - -BattleScript_PrimalReversionRestoreAttacker:: - call BattleScript_PrimalReversionRet - copybyte gBattlerAttacker, sSAVED_BATTLER - end3 - -BattleScript_PrimalReversionRet:: flushtextbox setbyte gIsCriticalHit, 0 - handleprimalreversion BS_ATTACKER, 0 - handleprimalreversion BS_ATTACKER, 1 - playanimation BS_ATTACKER, B_ANIM_PRIMAL_REVERSION + handleprimalreversion BS_SCRIPTING, 0 + handleprimalreversion BS_SCRIPTING, 1 + playanimation BS_SCRIPTING, B_ANIM_PRIMAL_REVERSION waitanimation - handleprimalreversion BS_ATTACKER, 2 + handleprimalreversion BS_SCRIPTING, 2 printstring STRINGID_PKMNREVERTEDTOPRIMAL waitmessage B_WAIT_TIME_LONG - switchinabilities BS_ATTACKER - return + switchinabilities BS_SCRIPTING + end3 BattleScript_UltraBurst:: flushtextbox diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 879c2f12c32..19ffcfa656e 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -438,7 +438,6 @@ extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; extern const u8 BattleScript_PrimalReversion[]; -extern const u8 BattleScript_PrimalReversionRestoreAttacker[]; extern const u8 BattleScript_HyperspaceFuryRemoveProtect[]; extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTactics[]; extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTacticsInPalace[]; diff --git a/src/battle_message.c b/src/battle_message.c index e1eebf74e50..6b045bae808 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -750,7 +750,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_MYSTERIOUSAIRCURRENTBLOWSON] = COMPOUND_STRING("The mysterious strong winds blow on regardless!"), [STRINGID_ATTACKWEAKENEDBSTRONGWINDS] = COMPOUND_STRING("The mysterious strong winds weakened the attack!"), [STRINGID_STUFFCHEEKSCANTSELECT] = COMPOUND_STRING("It can't use the move because it doesn't have a Berry!\p"), - [STRINGID_PKMNREVERTEDTOPRIMAL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s Primal Reversion! It reverted to its primal state!"), + [STRINGID_PKMNREVERTEDTOPRIMAL] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s Primal Reversion! It reverted to its primal state!"), [STRINGID_BUTPOKEMONCANTUSETHEMOVE] = COMPOUND_STRING("But {B_ATK_NAME_WITH_PREFIX2} can't use the move!"), [STRINGID_BUTHOOPACANTUSEIT] = COMPOUND_STRING("But {B_ATK_NAME_WITH_PREFIX2} can't use it the way it is now!"), [STRINGID_BROKETHROUGHPROTECTION] = COMPOUND_STRING("It broke through {B_DEF_NAME_WITH_PREFIX2}'s protection!"), diff --git a/src/battle_util.c b/src/battle_util.c index 1e5f809c52f..054b983c25c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6425,17 +6425,8 @@ bool32 TryPrimalReversion(u32 battler) if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_PRIMAL_ORB && GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != SPECIES_NONE) { - if (gBattlerAttacker == battler) - { - BattleScriptPushCursorAndCallback(BattleScript_PrimalReversion); - } - else - { - // edge case for scenarios like a switch-in after activated eject button - gBattleScripting.savedBattler = gBattlerAttacker; - gBattlerAttacker = battler; - BattleScriptPushCursorAndCallback(BattleScript_PrimalReversionRestoreAttacker); - } + gBattleScripting.battler = battler; + BattleScriptPushCursorAndCallback(BattleScript_PrimalReversion); return TRUE; } return FALSE; From b60da57d8aad9b025e867900e55ccb83947e383a Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Tue, 12 Nov 2024 14:28:33 -0300 Subject: [PATCH 03/56] Remove usage of gHeap in sSpritePalettes_ContestantsTurnBlinkEffect Those offsets into gHeap are actually just inside of eContestTempSave. --- src/contest.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/contest.c b/src/contest.c index 5b9560faf55..40a42a35292 100644 --- a/src/contest.c +++ b/src/contest.c @@ -858,23 +858,22 @@ static const struct CompressedSpriteSheet sSpriteSheets_ContestantsTurnBlinkEffe } }; -// Yup this is super dangerous but that's how it is here static const struct SpritePalette sSpritePalettes_ContestantsTurnBlinkEffect[CONTESTANT_COUNT] = { { - .data = (u16 *)(gHeap + 0x1A0A4), + .data = eContestTempSave.cachedWindowPalettes[5], .tag = TAG_BLINK_EFFECT_CONTESTANT0 }, { - .data = (u16 *)(gHeap + 0x1A0C4), + .data = eContestTempSave.cachedWindowPalettes[6], .tag = TAG_BLINK_EFFECT_CONTESTANT1 }, { - .data = (u16 *)(gHeap + 0x1A0E4), + .data = eContestTempSave.cachedWindowPalettes[7], .tag = TAG_BLINK_EFFECT_CONTESTANT2 }, { - .data = (u16 *)(gHeap + 0x1A104), + .data = eContestTempSave.cachedWindowPalettes[8], .tag = TAG_BLINK_EFFECT_CONTESTANT3 } }; From a06dc03207b1bbb5c9e67144fecfe4a3dcaf00be Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 12 Nov 2024 19:18:37 +0100 Subject: [PATCH 04/56] Fixed curse + Protean interaction (#5663) Co-authored-by: Hedara --- data/battle_scripts_1.s | 1 + test/battle/move_effect/curse.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 825ed3703e7..027c344b2dc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4159,6 +4159,7 @@ BattleScript_EffectMinimize:: 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 diff --git a/test/battle/move_effect/curse.c b/test/battle/move_effect/curse.c index 5fe17d35610..0696dfc4cac 100644 --- a/test/battle/move_effect/curse.c +++ b/test/battle/move_effect/curse.c @@ -34,3 +34,36 @@ SINGLE_BATTLE_TEST("Curse cuts the user's HP in half when used by Ghost-types") HP_BAR(player, hp: maxHP / 2); } } + +SINGLE_BATTLE_TEST("Curse applies to the user if used with Protean") +{ + GIVEN { + PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CURSE, target: player); } + } SCENE { + s32 playerMaxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ABILITY_POPUP(player, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CURSE, player); + HP_BAR(player, damage: playerMaxHP / 2); + HP_BAR(player, damage: playerMaxHP / 4); + } +} + +SINGLE_BATTLE_TEST("Curse applies to the opponent if user is afflicted by Trick-or-Treat in the same turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TRICK_OR_TREAT); MOVE(player, MOVE_CURSE, target: player); } + } SCENE { + s32 playerMaxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + s32 opponentMaxHP = GetMonData(&OPPONENT_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK_OR_TREAT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CURSE, player); + HP_BAR(player, damage: playerMaxHP / 2); + HP_BAR(opponent, damage: opponentMaxHP / 4); + } +} From 32044548537874b1e3352377fa704d1ae248c1ed Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Tue, 12 Nov 2024 23:27:53 +0100 Subject: [PATCH 05/56] Critical Hit documentation and distorted match up struct switch --- include/battle.h | 2 +- src/battle_script_commands.c | 20 ++++++++++++-------- src/battle_util.c | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/battle.h b/include/battle.h index f7b41b3dce8..8e30a34add9 100644 --- a/include/battle.h +++ b/include/battle.h @@ -250,6 +250,7 @@ struct SpecialStatus u8 emergencyExited:1; u8 afterYou:1; u8 preventLifeOrbDamage:1; // So that Life Orb doesn't activate various effects. + u8 distortedTypeMatchups:1; }; struct SideTimer @@ -823,7 +824,6 @@ struct BattleStruct u8 shellSideArmCategory[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT]; u8 speedTieBreaks; // MAX_BATTLERS_COUNT! values. u8 boosterEnergyActivates; - u8 distortedTypeMatchups; u8 categoryOverride; // for Z-Moves and Max Moves u8 commandingDondozo; u16 commanderActive[NUM_BATTLE_SIDES]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9ea2920bb93..94dbc20eaa2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1171,7 +1171,7 @@ bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType) bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef) { - if (!(gBattleStruct->distortedTypeMatchups & (1u << battlerDef)) + if (!gSpecialStatuses[battlerDef].distortedTypeMatchups && GetBattlerAbility(battlerDef) == ABILITY_TERA_SHELL && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL && !IS_MOVE_STATUS(move) @@ -1893,7 +1893,7 @@ static void Cmd_ppreduce(void) if (ShouldTeraShellDistortTypeMatchups(gCurrentMove, gBattlerTarget)) { - gBattleStruct->distortedTypeMatchups |= 1u << gBattlerTarget; + gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = TRUE; gBattlerAbility = gBattlerTarget; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_TeraShellDistortingTypeMatchups; @@ -1950,19 +1950,21 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, u32 holdEffect) return critStageIncrease; } +#define CRIT_BLOCKED -1 +#define ALWAYS_CRITS -2 s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) { s32 critChance = 0; if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT) { - critChance = -1; + critChance = CRIT_BLOCKED; } else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS || gMovesInfo[move].alwaysCriticalHit || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { - critChance = -2; + critChance = ALWAYS_CRITS; } else { @@ -1978,21 +1980,23 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec critChance = ARRAY_COUNT(sCriticalHitOdds) - 1; } - if (critChance != -1 && (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)) + if (critChance != CRIT_BLOCKED && (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)) { // Record ability only if move had 100% chance to get a crit if (recordAbility) { - if (critChance == -2) + if (critChance == ALWAYS_CRITS) RecordAbilityBattle(battlerDef, abilityDef); else if (GetCriticalHitOdds(critChance) == 1) RecordAbilityBattle(battlerDef, abilityDef); } - critChance = -1; + critChance = CRIT_BLOCKED; } return critChance; } +#undef CRIT_BLOCKED +#undef ALWAYS_CRITS s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility) { @@ -6617,6 +6621,7 @@ static void Cmd_moveend(void) gSpecialStatuses[gBattlerAttacker].damagedMons = 0; gSpecialStatuses[gBattlerAttacker].preventLifeOrbDamage = 0; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; + gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; gBattleScripting.moveEffect = 0; gBattleStruct->hitSwitchTargetFailed = FALSE; gBattleStruct->isAtkCancelerForCalledMove = FALSE; @@ -6628,7 +6633,6 @@ static void Cmd_moveend(void) gBattleStruct->additionalEffectsCounter = 0; gBattleStruct->poisonPuppeteerConfusion = FALSE; gBattleStruct->fickleBeamBoosted = FALSE; - gBattleStruct->distortedTypeMatchups = 0; gBattleStruct->usedMicleBerry &= ~(1u << gBattlerAttacker); if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) gBattleStruct->pledgeMove = FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 1e5f809c52f..24c0888942d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10439,7 +10439,7 @@ static inline void MulByTypeEffectiveness(uq4_12_t *modifier, u32 move, u32 move mod = UQ_4_12(1.0); } - if (gBattleStruct->distortedTypeMatchups & (1u << battlerDef) || (AI_DATA->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef))) + if (gSpecialStatuses[battlerDef].distortedTypeMatchups || (AI_DATA->aiCalcInProgress && ShouldTeraShellDistortTypeMatchups(move, battlerDef))) { mod = UQ_4_12(0.5); if (recordAbilities) From cd3245cbf0097e5b93f6b37791746dbe12da1884 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Tue, 12 Nov 2024 23:33:35 +0100 Subject: [PATCH 06/56] maybe better names --- src/battle_script_commands.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b0c9399e958..0293e00f348 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1950,21 +1950,21 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, u32 holdEffect) return critStageIncrease; } -#define CRIT_BLOCKED -1 -#define ALWAYS_CRITS -2 +#define CRITICAL_HIT_BLOCKED -1 +#define CRITICAL_HIT_ALWAYS -2 s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) { s32 critChance = 0; if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT) { - critChance = CRIT_BLOCKED; + critChance = CRITICAL_HIT_BLOCKED; } else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS || gMovesInfo[move].alwaysCriticalHit || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) { - critChance = ALWAYS_CRITS; + critChance = CRITICAL_HIT_ALWAYS; } else { @@ -1980,17 +1980,17 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec critChance = ARRAY_COUNT(sCriticalHitOdds) - 1; } - if (critChance != CRIT_BLOCKED && (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)) + if (critChance != CRITICAL_HIT_BLOCKED && (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)) { // Record ability only if move had 100% chance to get a crit if (recordAbility) { - if (critChance == ALWAYS_CRITS) + if (critChance == CRITICAL_HIT_ALWAYS) RecordAbilityBattle(battlerDef, abilityDef); else if (GetCriticalHitOdds(critChance) == 1) RecordAbilityBattle(battlerDef, abilityDef); } - critChance = CRIT_BLOCKED; + critChance = CRITICAL_HIT_BLOCKED; } return critChance; From 0919fbdc2d4897d0e692f7cae97f697089298521 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:45:08 +0000 Subject: [PATCH 07/56] Fix Order Up + Tera Stellar breaking each other with Commander (#5667) --- include/battle.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index c3c38162dc1..1251239d1ea 100644 --- a/include/battle.h +++ b/include/battle.h @@ -826,7 +826,7 @@ struct BattleStruct u8 distortedTypeMatchups; u8 categoryOverride; // for Z-Moves and Max Moves u8 commandingDondozo; - u16 commanderActive[NUM_BATTLE_SIDES]; + u16 commanderActive[MAX_BATTLERS_COUNT]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 redCardActivates:1; u8 usedEjectItem; From 13692076f9374a41d9ee57e7bb424fc1789cbdbc Mon Sep 17 00:00:00 2001 From: surtr-games Date: Thu, 14 Nov 2024 00:29:42 -0500 Subject: [PATCH 08/56] Fixed a bug with Counter and Mirror Coat where they would be scored up depending on the wrong target mon type category. --- data/battle_ai_scripts.s | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s index a43c8895028..19ee9d18a53 100644 --- a/data/battle_ai_scripts.s +++ b/data/battle_ai_scripts.s @@ -1613,6 +1613,8 @@ AI_CV_Disable2: AI_CV_Disable_End: end +@ BUG: The original script would score up Counter when the target's types were not physical +@ This is incorrect since Counter only deals double the damage received if hit by a physical attack AI_CV_Counter: if_status AI_TARGET, STATUS1_SLEEP, AI_CV_Counter_ScoreDown1 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_Counter_ScoreDown1 @@ -1625,7 +1627,7 @@ AI_CV_Counter2: if_random_less_than 100, AI_CV_Counter3 score -1 AI_CV_Counter3: - if_has_move AI_USER, MOVE_MIRROR_COAT, AI_CV_Counter7 + if_has_move AI_USER, MOVE_MIRROR_COAT, AI_CV_Counter8 get_last_used_bank_move AI_TARGET get_move_power_from_result if_equal 0, AI_CV_Counter5 @@ -1645,15 +1647,24 @@ AI_CV_Counter5: if_random_less_than 100, AI_CV_Counter6 score +1 AI_CV_Counter6: +#ifdef BUGFIX + get_target_type1 + if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter7 + get_target_type2 + if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter7 + goto AI_CV_Counter_End +#else get_target_type1 if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End get_target_type2 if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End - if_random_less_than 50, AI_CV_Counter_End +#endif AI_CV_Counter7: - if_random_less_than 100, AI_CV_Counter8 - score +4 + if_random_less_than 50, AI_CV_Counter_End AI_CV_Counter8: + if_random_less_than 100, AI_CV_Counter9 + score +4 +AI_CV_Counter9: end AI_CV_Counter_ScoreDown1: @@ -2100,6 +2111,8 @@ AI_CV_PsychUp_ScoreDown2: AI_CV_PsychUp_End: end +@ BUG: The original script would score up Mirror Coat when the target's types were not special +@ This is incorrect since Mirror Coat only deals double the damage received if hit by a special attack AI_CV_MirrorCoat: if_status AI_TARGET, STATUS1_SLEEP, AI_CV_MirrorCoat_ScoreDown1 if_status2 AI_TARGET, STATUS2_INFATUATION, AI_CV_MirrorCoat_ScoreDown1 @@ -2132,10 +2145,19 @@ AI_CV_MirrorCoat5: if_random_less_than 100, AI_CV_MirrorCoat6 score +1 AI_CV_MirrorCoat6: +#ifdef BUGFIX + get_target_type1 + if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat7 + get_target_type2 + if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat7 + goto AI_CV_MirrorCoat_End +#else get_target_type1 if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End get_target_type2 if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End +#endif +AI_CV_MirrorCoat7: if_random_less_than 50, AI_CV_MirrorCoat_End AI_CV_MirrorCoat_ScoreUp4: if_random_less_than 100, AI_CV_MirrorCoat_ScoreUp4_End From c4d83079a984ef7bea6207905e167d8e5b3f47b7 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Fri, 15 Nov 2024 14:16:41 -0600 Subject: [PATCH 09/56] PokeCommunity sprites batch (October) (#5655) --- graphics/pokemon/araquanid/icon.png | Bin 411 -> 410 bytes graphics/pokemon/bewear/icon.png | Bin 341 -> 393 bytes graphics/pokemon/blacephalon/icon.png | Bin 378 -> 413 bytes graphics/pokemon/bounsweet/icon.png | Bin 330 -> 339 bytes graphics/pokemon/brionne/icon.png | Bin 385 -> 387 bytes graphics/pokemon/bruxish/icon.png | Bin 432 -> 425 bytes graphics/pokemon/bulbasaur/icon.png | Bin 301 -> 316 bytes graphics/pokemon/buzzwole/icon.png | Bin 438 -> 502 bytes graphics/pokemon/celesteela/icon.png | Bin 552 -> 596 bytes graphics/pokemon/charjabug/icon.png | Bin 367 -> 328 bytes .../pokemon/cinderace/gigantamax/icon.png | Bin 600 -> 636 bytes graphics/pokemon/comfey/icon.png | Bin 621 -> 575 bytes graphics/pokemon/cosmoem/icon.png | Bin 308 -> 363 bytes graphics/pokemon/cosmog/icon.png | Bin 340 -> 378 bytes graphics/pokemon/crabominable/icon.png | Bin 458 -> 482 bytes graphics/pokemon/crabrawler/icon.png | Bin 341 -> 391 bytes graphics/pokemon/cutiefly/icon.png | Bin 312 -> 354 bytes graphics/pokemon/dartrix/icon.png | Bin 344 -> 377 bytes graphics/pokemon/decidueye/icon.png | Bin 377 -> 412 bytes graphics/pokemon/dewpider/icon.png | Bin 284 -> 323 bytes graphics/pokemon/dhelmise/icon.png | Bin 394 -> 450 bytes graphics/pokemon/diglett/alolan/icon.png | Bin 358 -> 297 bytes graphics/pokemon/drampa/icon.png | Bin 426 -> 439 bytes graphics/pokemon/dugtrio/alolan/icon.png | Bin 476 -> 425 bytes graphics/pokemon/exeggutor/alolan/icon.png | Bin 536 -> 492 bytes graphics/pokemon/fezandipiti/back.png | Bin 647 -> 841 bytes graphics/pokemon/fezandipiti/front.png | Bin 891 -> 1022 bytes graphics/pokemon/fezandipiti/normal.pal | 23 +++++++------ graphics/pokemon/fezandipiti/shiny.pal | 25 +++++++------- .../pokemon/floette/eternal_flower/icon.png | Bin 384 -> 392 bytes graphics/pokemon/fomantis/icon.png | Bin 311 -> 352 bytes graphics/pokemon/furfrou/dandy_trim/icon.png | Bin 533 -> 471 bytes .../pokemon/furfrou/debutante_trim/icon.png | Bin 530 -> 474 bytes .../pokemon/furfrou/diamond_trim/icon.png | Bin 558 -> 508 bytes graphics/pokemon/furfrou/heart_trim/icon.png | Bin 537 -> 493 bytes graphics/pokemon/furfrou/kabuki_trim/icon.png | Bin 509 -> 467 bytes .../pokemon/furfrou/la_reine_trim/icon.png | Bin 516 -> 459 bytes graphics/pokemon/furfrou/matron_trim/icon.png | Bin 517 -> 471 bytes .../pokemon/furfrou/pharaoh_trim/icon.png | Bin 515 -> 458 bytes graphics/pokemon/furfrou/star_trim/icon.png | Bin 574 -> 512 bytes graphics/pokemon/geodude/alolan/icon.png | Bin 410 -> 363 bytes graphics/pokemon/golem/alolan/icon.png | Bin 465 -> 418 bytes graphics/pokemon/golisopod/icon.png | Bin 417 -> 464 bytes graphics/pokemon/graveler/alolan/icon.png | Bin 519 -> 491 bytes graphics/pokemon/greninja/ash/icon.png | Bin 617 -> 507 bytes graphics/pokemon/grimer/alolan/icon.png | Bin 486 -> 420 bytes graphics/pokemon/grubbin/icon.png | Bin 311 -> 317 bytes graphics/pokemon/gumshoos/icon.png | Bin 321 -> 360 bytes graphics/pokemon/guzzlord/icon.png | Bin 483 -> 549 bytes graphics/pokemon/hakamo_o/icon.png | Bin 418 -> 451 bytes graphics/pokemon/incineroar/icon.png | Bin 394 -> 446 bytes graphics/pokemon/inteleon/gigantamax/icon.png | Bin 501 -> 552 bytes graphics/pokemon/jangmo_o/icon.png | Bin 336 -> 373 bytes graphics/pokemon/kartana/icon.png | Bin 412 -> 459 bytes graphics/pokemon/komala/icon.png | Bin 342 -> 389 bytes graphics/pokemon/kommo_o/icon.png | Bin 449 -> 507 bytes graphics/pokemon/litten/icon.png | Bin 340 -> 385 bytes graphics/pokemon/lunala/icon.png | Bin 464 -> 514 bytes graphics/pokemon/lurantis/icon.png | Bin 431 -> 387 bytes graphics/pokemon/lycanroc/dusk/icon.png | Bin 452 -> 481 bytes graphics/pokemon/lycanroc/icon.png | Bin 488 -> 474 bytes graphics/pokemon/lycanroc/midnight/icon.png | Bin 482 -> 434 bytes graphics/pokemon/magearna/icon.png | Bin 394 -> 442 bytes .../pokemon/magearna/original_color/icon.png | Bin 448 -> 460 bytes graphics/pokemon/mareanie/icon.png | Bin 352 -> 403 bytes graphics/pokemon/marowak/alolan/icon.png | Bin 495 -> 447 bytes graphics/pokemon/marshadow/icon.png | Bin 311 -> 378 bytes graphics/pokemon/maschiff/back.png | Bin 577 -> 588 bytes graphics/pokemon/maschiff/front.png | Bin 707 -> 631 bytes graphics/pokemon/maschiff/normal.pal | 32 +++++++++--------- graphics/pokemon/maschiff/shiny.pal | 32 +++++++++--------- graphics/pokemon/melmetal/icon.png | Bin 538 -> 575 bytes graphics/pokemon/meltan/icon.png | Bin 300 -> 324 bytes graphics/pokemon/meowth/alolan/icon.png | Bin 426 -> 379 bytes graphics/pokemon/mimikyu/busted/icon.png | Bin 357 -> 343 bytes graphics/pokemon/mimikyu/icon.png | Bin 350 -> 352 bytes graphics/pokemon/minior/core/blue/icon.png | Bin 381 -> 372 bytes graphics/pokemon/minior/core/green/icon.png | Bin 375 -> 371 bytes graphics/pokemon/minior/core/indigo/icon.png | Bin 377 -> 372 bytes graphics/pokemon/minior/core/orange/icon.png | Bin 377 -> 371 bytes graphics/pokemon/minior/core/red/icon.png | Bin 459 -> 372 bytes graphics/pokemon/minior/core/violet/icon.png | Bin 377 -> 371 bytes graphics/pokemon/minior/core/yellow/icon.png | Bin 373 -> 371 bytes graphics/pokemon/morelull/icon.png | Bin 327 -> 368 bytes graphics/pokemon/mudbray/icon.png | Bin 353 -> 367 bytes graphics/pokemon/mudsdale/icon.png | Bin 402 -> 409 bytes graphics/pokemon/muk/alolan/icon.png | Bin 626 -> 524 bytes graphics/pokemon/naganadel/icon.png | Bin 551 -> 572 bytes graphics/pokemon/necrozma/dawn_wings/icon.png | Bin 645 -> 611 bytes graphics/pokemon/necrozma/dusk_mane/icon.png | Bin 496 -> 501 bytes graphics/pokemon/necrozma/icon.png | Bin 473 -> 520 bytes graphics/pokemon/necrozma/ultra/icon.png | Bin 556 -> 577 bytes graphics/pokemon/nihilego/icon.png | Bin 374 -> 448 bytes graphics/pokemon/ninetales/alolan/icon.png | Bin 601 -> 543 bytes graphics/pokemon/oranguru/icon.png | Bin 400 -> 436 bytes graphics/pokemon/oricorio/icon.png | Bin 328 -> 344 bytes graphics/pokemon/oricorio/pau/icon.png | Bin 387 -> 359 bytes graphics/pokemon/oricorio/pom_pom/icon.png | Bin 393 -> 377 bytes graphics/pokemon/oricorio/sensu/icon.png | Bin 417 -> 366 bytes graphics/pokemon/palossand/icon.png | Bin 320 -> 373 bytes graphics/pokemon/passimian/icon.png | Bin 423 -> 447 bytes graphics/pokemon/persian/alolan/icon.png | Bin 456 -> 398 bytes graphics/pokemon/pheromosa/icon.png | Bin 520 -> 566 bytes graphics/pokemon/pichu/spiky_eared/icon.png | Bin 311 -> 328 bytes graphics/pokemon/pikachu/alola_cap/icon.png | Bin 436 -> 400 bytes graphics/pokemon/pikachu/belle/icon.png | Bin 520 -> 469 bytes graphics/pokemon/pikachu/cosplay/icon.png | Bin 380 -> 383 bytes graphics/pokemon/pikachu/hoenn_cap/icon.png | Bin 433 -> 399 bytes graphics/pokemon/pikachu/kalos_cap/icon.png | Bin 443 -> 404 bytes graphics/pokemon/pikachu/libre/icon.png | Bin 422 -> 396 bytes .../pokemon/pikachu/original_cap/icon.png | Bin 435 -> 401 bytes graphics/pokemon/pikachu/partner_cap/icon.png | Bin 444 -> 405 bytes graphics/pokemon/pikachu/ph_d/icon.png | Bin 430 -> 423 bytes graphics/pokemon/pikachu/pop_star/icon.png | Bin 458 -> 427 bytes graphics/pokemon/pikachu/rock_star/icon.png | Bin 432 -> 410 bytes graphics/pokemon/pikachu/sinnoh_cap/icon.png | Bin 434 -> 400 bytes graphics/pokemon/pikachu/unova_cap/icon.png | Bin 441 -> 400 bytes graphics/pokemon/pikachu/world_cap/icon.png | Bin 370 -> 401 bytes graphics/pokemon/pikipek/icon.png | Bin 335 -> 338 bytes graphics/pokemon/poipole/icon.png | Bin 373 -> 407 bytes graphics/pokemon/popplio/icon.png | Bin 287 -> 328 bytes graphics/pokemon/primarina/icon.png | Bin 498 -> 530 bytes graphics/pokemon/pyukumuku/icon.png | Bin 289 -> 337 bytes graphics/pokemon/raichu/alolan/icon.png | Bin 577 -> 434 bytes graphics/pokemon/raticate/alolan/icon.png | Bin 506 -> 453 bytes graphics/pokemon/rattata/alolan/icon.png | Bin 448 -> 407 bytes graphics/pokemon/ribombee/icon.png | Bin 384 -> 429 bytes graphics/pokemon/rockruff/icon.png | Bin 366 -> 406 bytes graphics/pokemon/rowlet/icon.png | Bin 302 -> 337 bytes graphics/pokemon/salandit/icon.png | Bin 304 -> 353 bytes graphics/pokemon/salazzle/icon.png | Bin 337 -> 393 bytes graphics/pokemon/sandshrew/alolan/icon.png | Bin 425 -> 373 bytes graphics/pokemon/sandslash/alolan/icon.png | Bin 524 -> 462 bytes graphics/pokemon/sandygast/icon.png | Bin 318 -> 364 bytes graphics/pokemon/shiinotic/icon.png | Bin 351 -> 382 bytes graphics/pokemon/silvally/icon.png | Bin 382 -> 432 bytes graphics/pokemon/solgaleo/icon.png | Bin 477 -> 523 bytes graphics/pokemon/stakataka/icon.png | Bin 404 -> 456 bytes graphics/pokemon/steenee/icon.png | Bin 361 -> 400 bytes graphics/pokemon/stufful/icon.png | Bin 290 -> 342 bytes graphics/pokemon/tapu_bulu/icon.png | Bin 415 -> 461 bytes graphics/pokemon/tapu_fini/icon.png | Bin 368 -> 433 bytes graphics/pokemon/tapu_koko/icon.png | Bin 474 -> 506 bytes graphics/pokemon/tapu_lele/icon.png | Bin 396 -> 472 bytes graphics/pokemon/togedemaru/icon.png | Bin 320 -> 356 bytes graphics/pokemon/torracat/icon.png | Bin 370 -> 423 bytes graphics/pokemon/toucannon/icon.png | Bin 412 -> 420 bytes graphics/pokemon/toxapex/icon.png | Bin 446 -> 493 bytes graphics/pokemon/trumbeak/icon.png | Bin 304 -> 351 bytes graphics/pokemon/tsareena/icon.png | Bin 379 -> 414 bytes graphics/pokemon/turtonator/icon.png | Bin 493 -> 451 bytes graphics/pokemon/type_null/icon.png | Bin 459 -> 450 bytes graphics/pokemon/vikavolt/icon.png | Bin 424 -> 444 bytes .../pokemon/vivillon/archipelago/icon.png | Bin 555 -> 503 bytes .../pokemon/vivillon/continental/icon.png | Bin 497 -> 508 bytes graphics/pokemon/vivillon/elegant/icon.png | Bin 494 -> 498 bytes graphics/pokemon/vivillon/fancy/icon.png | Bin 518 -> 524 bytes graphics/pokemon/vivillon/garden/icon.png | Bin 488 -> 498 bytes .../pokemon/vivillon/high_plains/icon.png | Bin 539 -> 496 bytes graphics/pokemon/vivillon/icon.png | Bin 532 -> 485 bytes graphics/pokemon/vivillon/jungle/icon.png | Bin 474 -> 484 bytes graphics/pokemon/vivillon/marine/icon.png | Bin 493 -> 510 bytes graphics/pokemon/vivillon/modern/icon.png | Bin 499 -> 508 bytes graphics/pokemon/vivillon/monsoon/icon.png | Bin 481 -> 509 bytes graphics/pokemon/vivillon/ocean/icon.png | Bin 517 -> 526 bytes graphics/pokemon/vivillon/poke_ball/icon.png | Bin 496 -> 512 bytes graphics/pokemon/vivillon/polar/icon.png | Bin 505 -> 509 bytes graphics/pokemon/vivillon/river/icon.png | Bin 483 -> 499 bytes graphics/pokemon/vivillon/sandstorm/icon.png | Bin 483 -> 494 bytes graphics/pokemon/vivillon/savanna/icon.png | Bin 499 -> 502 bytes graphics/pokemon/vivillon/sun/icon.png | Bin 493 -> 500 bytes graphics/pokemon/vivillon/tundra/icon.png | Bin 503 -> 507 bytes graphics/pokemon/vulpix/alolan/icon.png | Bin 487 -> 388 bytes graphics/pokemon/wimpod/icon.png | Bin 354 -> 367 bytes graphics/pokemon/wishiwashi/icon.png | Bin 320 -> 339 bytes graphics/pokemon/wishiwashi/school/icon.png | Bin 580 -> 441 bytes graphics/pokemon/xerneas/icon.png | Bin 531 -> 451 bytes graphics/pokemon/xurkitree/icon.png | Bin 386 -> 432 bytes graphics/pokemon/yungoos/icon.png | Bin 308 -> 345 bytes graphics/pokemon/zeraora/icon.png | Bin 389 -> 432 bytes graphics/pokemon/zygarde/10_percent/icon.png | Bin 382 -> 397 bytes graphics/pokemon/zygarde/complete/icon.png | Bin 528 -> 553 bytes .../pokemon/species_info/gen_1_families.h | 6 ++-- .../pokemon/species_info/gen_7_families.h | 10 +++--- .../pokemon/species_info/gen_9_families.h | 6 ++-- 185 files changed, 68 insertions(+), 66 deletions(-) diff --git a/graphics/pokemon/araquanid/icon.png b/graphics/pokemon/araquanid/icon.png index fa13eba833293eab7fd05ba87bd21b188ccef2eb..10676126a1f0c640aea33c04bac66d812d0db86e 100644 GIT binary patch delta 337 zcmV-X0j~a=1DXSn7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWq`AI}UR7i>Kl!#~vdI>ipoY-y7imp* z+;SNd64n3+Py}jWeOCnbcsgSt?q;^b1nC!G9|d6l@VZ(Ii463)4h4TTcFDS0sfact z0lT2tD=t^@ZjC9}dGkkhw%%(OfQ6YDy*kZ}RIdzC#a!Thpq~77y%f{1x_{a~+qVER zjq?PMd7KA8ru?`A%#SKa j{HT1${FvD1{I~!C?h+9WBrB$600000NkvXXu0mjfaqf~J delta 338 zcmV-Y0j>U;1DgYo7zqRe0001qplF?uO+J4CCP_p=R5*?8lCe(1Fc60Q29|}?rH@f~ z0HnJqQnK73B&2vjSu*e@o!EJXh?FHS!w{;l7!UE#r6w(jopfSG+;*SttpBV}h`(3< zqLpmty=2E)$jEx60XQ9iqx}9|GT5-eUFRin1o_q!2jsAGG-eMe1mFqTq%GqZMpA!L z1AQXX%Lo#sUT@3?>;C7}{;pA1*LlWv0&mT#thGH_ImSvur^m6h;Qnf01?uUc*t{y@K&@%v@ knvlye>*e*{FZyMD17_-(Bs@;)kN^Mx07*qoM6N<$f{WFkb^rhX diff --git a/graphics/pokemon/bewear/icon.png b/graphics/pokemon/bewear/icon.png index 5ceb073fbcfb55ed2f80f6666e1d1406403db4a7..30cc96672326477db471761a0000a5616d64843c 100644 GIT binary patch delta 318 zcmV-E0m1&&0*M2V7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfUNklkbee|LzXAyKsqR z5AYuX;IaqN`*IvBvm&TuZoeGc8MiWa+tS^={2?2g=@04lPJc+}?sNU&1!dt9y@TS8 Qi~s-t07*qoM6N<$f_OTF6951J delta 266 zcmV+l0rmcg1JweM7zqRe0001qplF?uO+SC&NklfC~1QitT1=Cl_KMIc3}${6z7`|0CXWn5d^ge0*V(F;b{SwYfg3_ zfzhr9@0#3|d4hmqok4@3VOAV#77slljN^3q5qC2OUOw5O<{>WZRb> z!z7of&3bsXX#i~Hz;^h4QtrdP1*v-g+hk!T4Q|)_fp7HmgGOV diff --git a/graphics/pokemon/blacephalon/icon.png b/graphics/pokemon/blacephalon/icon.png index bb1f9cdc31f549ad9a24f60015613ab8cf4b098a..c3fad2f3efe4ce5eb5541960f2ff72390af13057 100644 GIT binary patch delta 340 zcmV-a0jvJ{0-Xbp7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWq{7FPXR7i>Kl)(;zKnO$yvPp}q^Z$QaSZ!)8*i(}x zEgCN~jXuHJOA{T*lCes}KoExa2^@mWVG~Fx zid_CKw@V(x!gn*+Mbg_zNacZWTi+c%f$MFhoQ~lV-O1L1I^F#IJNz^IDfM&3F6vQE z6hhmUQt%bSzgHlsh9M!kv(PZ?OI-pxX-Jm<;zHjKjyF0{{)6q1k8>jV0Pz612E(U53NoP zz*0lOmaK!-g4XSPI5b55uN8kZUMI3|H}n$eGXz!2)G#l O0000(<0|H%Mx5>{69JJB#RaIa-GD@eJ3rY!@wY?x`=~Al%pNqZq*zdMiLT+A zt5PYrI96=l1jY_K#Hf3g3H3vF=}C0Ooi}SbDGink7R7i>KRLu^9U*#M?Gv z;-R(tGQAC(8NX^(32%wc%I`j(a*`Cti6Wz?5Rub|{TT0C;d<=R( z1~;u51YrQ#0Hr`O010fMR#=u>N2~>sVcU?cA54ly^_EfB>MorGj|X}1?vyGEAR6Yf&x0qv1AzmO7zqRe0001qplF?uO+J4C3`s;mR5*>*k}+-qF%U(4gE>Q>NfCjB zTMO<6jSJ*G#C9~?A=|hZEr+1lVkH~XtX3-qgGhFUL`s(^Q+|DYd;UD7es6%Dgwsn@ z6q%4F5vFtL0KMWFb0r;JAeius3)TY@2oQ057z1{fEiQdzLTTzVvWQ;49ZKfNFXn&D zF(S{9LkqFnfYyrrz*@VBLTH>0Tv#{GRLs&jJaPeSjcv6oK01O_v^T-69}T3}c=ksf z=+i;4Sdr)yru@x&B~ks0`IZ;)`^<~P;pPy)WL~5L9L2e+>lqIHzQL+x z$L@C;gJC#8xxn6V9FoC+;s}`+PkbaFLjS}^_k|DpBOkNB=Hm)IqrM`LicKW|0000< KMNUMnLSTY5BZ>h4 diff --git a/graphics/pokemon/bruxish/icon.png b/graphics/pokemon/bruxish/icon.png index 00d049a5c6f8dedd3e16ce5a88d44677a589a2f8..eab625140ebb119543edf8198110817230493fe0 100644 GIT binary patch delta 351 zcmV-l0igb{1E~X$7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPczNklrI*k zE{r+Ctx1>ep)iac!rcTdw{Vq8o&pQffB+SCUKwl>;RRLLiH0{5DW-oV=d^*lz>y2K zu|cS-rsWaD3gFRHRp4l>p{{u=`a|@EhLyD-1mlwzo*|Lq<8)koZeRT~{V6|a+JPS& zATRu&zyE|6%!-F5giXS{YgN6mRLFfEHhqbJzdHNqo?EwG)002ovPDHLkV1j;VntuQQ delta 358 zcmV-s0h#`(1F!>-7zqRe0001qplF?uO+SA-Nkl!AiqG5X~PfOF*zfa`5KO z3Lf$|QOKbL{Efszmpi=E0!uf0eSio`&^!CSYA%_)#&ajln~&3=J6w|&feJM-pw z-rp|LIzWGL8uG#cvSP?1U%5W=u#Lces@uLnfCIcXbEHVVT5DKfhgt?fGg%l7QkQ>X zr{cm;NL32W0!so){Q?4~RcjjE^4yZBsUPu~p>*4{9zltcFkuOWXB_hefKh5WBFEP$ z)%Nmmr|q}rY1hDiUfOw++%cdRE|C2KR$#uxp&bN9@`px~4C5g8@Hp+~)~POV07*qoM6N<$ Eg6V>!egFUf diff --git a/graphics/pokemon/bulbasaur/icon.png b/graphics/pokemon/bulbasaur/icon.png index 7738836b9ca7d398aafe37127bf0bc3d5e5d9f38..d8f508ee86885f87dbec26ce01f80bb364c0acba 100644 GIT binary patch delta 241 zcmVKl)(;! zFbG7=c8E9l|G#yh*@J>?Jeh1tZ=DB1iL-4h-V5Vtb>ZoB6KMd-s-j{y2(vYgXeM}L z2u(_YotZ%caRM0-UK%g~Q~(%Wgpq+L0C*7#;HtB~Z}?}@n6^8Bse6&CMe1rAoj{8z zJ$WBvc31$IKxF$+An7He`ABCrKGiNPA|B&zS56I#Vo{emoxbAF;@7@=e^>_c&_L4f r|JXo^AQzhwdBGnJOu`W#ktkW@00000NkvXXu0mjfKwo2< delta 226 zcmV<803H9l0<8j&7zqRe0001qplF?uESjz@jHFsqU6i2{Hq)$07*qoM6N<$f-DeY=>Px# diff --git a/graphics/pokemon/buzzwole/icon.png b/graphics/pokemon/buzzwole/icon.png index 72e3270dac924dd51292fceeb6aacdda1457a512..c1126c081d054b860bc73d0f324f46c9dbdba16f 100644 GIT binary patch delta 428 zcmV;d0aO0A1NH-u7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPdrNkl)|a|J*%vQ0|}{nc8zfI+fSv_9#2F%F{{p``-x^VlL-nkZ8O9Xx+kci38sgf>D` zg~#a#U|oO5M2rwqLI^F>hF}~NHJg+5EJ_=jkO27LERZnBGQn3M-5?XfzW)$N zHwX<)NGJIh=mr@K6K4?u=>}PbNqq{E8^ngi-4FYbiTg49kQfAh!2aA1$+h`nKl}hi W+aV!h9#?As0000AEN0cgK@2@u9tIxjxlidNBXFdQ!-3-h+ zQi0+2XI8=tOn+Y9^&FhIJ$V-Z0000< KMNUMnLSTZx`K=%T diff --git a/graphics/pokemon/celesteela/icon.png b/graphics/pokemon/celesteela/icon.png index 854c36851a9318712f48c88ff37d219107ba121c..7722e43dacc0ef8ea7b60b7563b62c8f5a0c09d3 100644 GIT binary patch delta 518 zcmV+h0{Q)@1k?nO7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=Aw+*jiLI2$j>IqsL<6Xg!2kd46d0$yC8LqX=|d}2s_^oB zU4I<@Qi_`MqrzEHb9oY={`pA>1XVXNsC;k5nc3a=vWxNG&H@;73ci*e#&XI;nq2SYW9pK{Kd& z2Ip4JMR5C(X!qC(B$E66;v5GY}AS@aB7(o~=>M50Y#w?zo>c-AEZ zp`c+NZi9f!!n3myP&D9CXDxwwU*0Cb1D`M`i&{%qr@{%3L!f05pSIR|%9W=j46@DG z+AQ0&W6?|4N}Vq39nF7-!Yzl;(Aspa@RH)!)+ZagmJ#Umm;MIwd9+n|sR!Qg_<#I` z?pbhBMM94_1z~T#`0sGn=Elj?BitQ6ZTKGqMK3G>-lO0J|DI6zKim%^{vrp#fdAcEPLuAE&$Vf)KclO6PYYNg#Z8m07*qo IM6N<$f@uo%nE(I) delta 474 zcmV<00VV#_1gHd%7zqRe0001qplF?uO+G!IMU8*b zus69~K(_Nmj2U2HbdtkGv}VXa(dlcD;>=Q4{H-LkAH6=y2=EF<0)Khc@H&SvTMJCl zz7ZNuaht7e34Aq;V1mRkSVwUFV8Y_>08aW!d+LF-{?A(vPDJ!9sEX80Zc^) z2eb`>EH3NdWoqLboOSTvnzzY1XhSkcIs}}c87&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPeoNkl`r|KBdjXjQ2RoHl71 zx%%0Fg1l{OJ~JXR)`@7qh%ktpN$mtU6A@~E`+-8`N!= zW^^V2j-5{?1)O1%Yw$|*AIcyDT4fJWpmLzs)-1t~2>ccxc8yl`lHon7Y=PoAqaWcp zx!iNs{LQTX_)>r1>W}aU)@qpa2PXZoW7Z$|)&6(^%!ChoDRPa000000NkvXXu0mjf DeD-PS delta 293 zcmV+=0owk^0`CHl7zqRe0001qplF?uO+SD7NklU5Ji0h3x%{uxxf}a z!%)x=A!TYVwG{=_q{y8JR4E*!gd!Ap2MT8FV*AxjH&6dd?BJblL;wK9%fMji08$BFUp5BtfU$NM8a~4w`jdYI zb8QIJd{=clkc9=hb>{I6;%!d3>gESRq9CAf|7YX3WBu;ZOGGb6L`fzrs3Gjq9SNfJ z90;NvP=QuK&Hy$d0Z@f<0oHbSz*wq~2l~X?JQJ3CVv;=LezZM-?783dx!%db0yQ_U rqy;`)=}~{KPd|{k2?GlD-{uGFS%MLeFH5Z;00000NkvXXu0mjfJ?wt^ diff --git a/graphics/pokemon/cinderace/gigantamax/icon.png b/graphics/pokemon/cinderace/gigantamax/icon.png index 3d1f1e423751c11ddb6fa92f68af9c05e4a200dd..791801bb65e6eae2aa52a5cdba5940cc303ebf0a 100644 GIT binary patch delta 623 zcmV-#0+9XK1pEY$7=H)@0000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)*E001yhOjJc;oP&ddbG^O2|NsBJq(S!fDb->@_LM1$d;ele z&F*uY|Foo}#s6xooMK{HK|w)TsgPs<00G-cL_t(YiS3lla(}}h41_)ULBmCQ|F`W* zV4FC0+EaTeGnpjbWf2B_+xGJj5uarSFvzLd8((o*BGL1T^w`Ip8&K)we^0pJ5bN*@5( zCP3Z{6CkO?Z8lz|L=ZJxFLt>nG=j!j(KA5pQL1WCh7`xhVL zOh|~G?Vnfc+P{&ly|n*(e@7KIN+0Y2em)p!xs*CAe5W~0UH1S002ov JPDHLkV1kWD7ux^; delta 587 zcmV-R0<``71lR1lyZD1WB9o4!2OaOCK(&ZMrDNA%6~CqAHgEwX|EQz{5HE zeE4*}pX2=T=;pUN%^kg{QIax!S=5gtRci55OAH;q2P=(k<1-@m>zSAei@A#}RD@7j<7z-DbaU3Y3B z%)|5y5S+~Dj(@QquzTE7BXL(xMO{7A7Z$2qyQ`-HB^47DQ><~cRm52pSE{NS?dYeM zdo1giB~hK{)+b9;SyaHJ$erFssIabvi61_Ba=LGlsx@Ol1~LE9)}Kg%J6?u{4v}IDc_S(wt?K<_Y?j`rn-YN6_3D z2%3R$v>|8-404sa^uTCq5KX{XK9JM)z!Wg@(F1dQ0<*E{TVQUIxt5Qv9Dq4$w^yJ; z&8PvUXdJuRd%)|UQgz)7Ms5Kq19tGs;|R<_o#Pq`LI+?n9C002ovPDHLkV1l!S8wLOX diff --git a/graphics/pokemon/comfey/icon.png b/graphics/pokemon/comfey/icon.png index 916ac5c188d1bad0d4f8a54d8381d3daa7cfe36c..10d1a3fe5aa1ac8f1dea695de554ab6fe376150e 100644 GIT binary patch delta 502 zcmV0ohjLe?&qOqS9JQM;MdpyXrxMqf7+#alDd3V5Qdk|DxHG*jjv3=GAYQyBJd?z$ z)0)8!HUU@azTl{h@mhaH(SBg($a0v*iG}vdxvUdC&g+F_&yEpX#B0kl-i{`|o!bAi z{@O3w7r)d|dhv@2X6ct(FblsJ!3=&G1=F9*nP6IdOa;^GV{Sj`J)vK^G}XO sBbbFh9>J{raS3J_zXkJhG*^Q80c}1dZg_SqK>z>%07*qoM6N<$f`&@nDF6Tf delta 549 zcmV+=0^0q*1nmTn7zqRe0001qplF?uO+SD5Nkl~tsHN|t7S zk7w=w|ICnjQbg!T)P}2zal^$qH&)8Iim@XRe=I+!_ZFPZB3WOM{ZfJjK z0nqeu8ZmOiLP$(MSBSeoF*O->yCxzZWKWCZ6H7!iaWd$`tPq|hnp?^F2=0#p%Y@w8 z59>h$PsI#qiLL$oNbFq?J@jUl{TMMQk3ERFkm_FQz8yQjocHEjm082lLU(*^=0z!B z$Zw{qcz=7n}84s2O9dSKU#R-q!*ctv(9anm0V(z$~^C3$< zrXUp`U|i{MOIJ~n6XkijBfWeb9uX^Th8Jh8{+=^H@Ny{$ZjE!`sS{Xxufhjp;=-x{ n1hdwn1`q@ysv|>{r2hhsVm%Rp|ICfb00000NkvXXu0mjf%OC-v diff --git a/graphics/pokemon/cosmoem/icon.png b/graphics/pokemon/cosmoem/icon.png index ab4c13b8f260eeffb2253ab247fb32880e2f65b1..c461bdadaf478ff88a4111af5c2004dfcf9e7620 100644 GIT binary patch delta 288 zcmV+*0pI?#0_y^h7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf0Nkl$}e zONhabJICR+?Wv-Gbq}Ib0;+(k%7kEFg?*h#5D@i7Ve=6R@$B=3LWa|+HOPY*00{lr zs(%s_k9VpZN mivK*_E&j`Nr@@o%-_!{fy%Xu9??B)H0000lA zr4uWE!J4nEBZkWD&`L}xVZbC^7y)lSU98K!runVetBn@2ODSwaLRT8#7(*pkM!U=^ zBzQQ?&@(FnJX;mWus}w56&#Bf1`m3(ms9o_eY5p(ViBX^$OaJ!#%PxP9^-|b3N%%= zAs>Z%#V3<)K`h?McJd67q5`rloGBYvyS4i7v!cDK=%42+^uuTR{y<-j^y8HAm-JKK juND0m&o%w*_<#Bj(XpocyjnQ&00000NkvXXu0mjfU&d^u diff --git a/graphics/pokemon/cosmog/icon.png b/graphics/pokemon/cosmog/icon.png index 6057034a9a87dca366db88bd78904caa68220e23..a74b399d12c00612555f23e2d28371919e6f1cd0 100644 GIT binary patch delta 303 zcmV+~0nq-`0{Q}w7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfFNklhe)kN zreN)t1xjMFIik|2Brn-gnA>Gr1#PO2C+H`dmZ}MSyu;EjBJ*y@Ioxjx7tNDLhO!wj zHat{ilrq|Fi%_}50p3DXo}L_}G(T7U>hJl*`P}{SPP#_!C?5DXbZ_^^8UKcEzdvx` zAJA>k9{2}zU-1v=KI0$J-QeGE#dqO9{B8e?{}aQ;6DzwPGgbfq002ovPDHLkV1f&J Bgk%5! delta 265 zcmV+k0rvj-0@MPK7zqRe0001qplF?uO+SC%Nklqqbr;EH=Fyj!7(gd6fA+~)%nuTY@6c!%4y%5HWv1@$jQ^Hr-XJ_e;8 zhar8kX^(?XpR{#74nBQobT~}u3wJn7=?^#r>GwEHr}sFF^)nov%fjIc<&dIK3T&wn P00000NkvXXu0mjfHGp`i diff --git a/graphics/pokemon/crabominable/icon.png b/graphics/pokemon/crabominable/icon.png index e3f32d50465c5d7a2c3d9e7609ca0e6443acbb59..c3ae3235b67d65e8de35e34ab73a00d173ccc20b 100644 GIT binary patch delta 408 zcmV;J0cZZo1L6aa7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPdXNklKrkD{3$>#4u<9CXx<#|w~r70%ir){#z{QE zf9L-U|DFF6{3ris_)l2=f5CqU2LC_t_pX@yAMy9Slg>YK_KrWPe6EH3kNaWZF9-Vj zPCW6K931H{KJlOT!?*v6K|J66ez-cBc8C9e-Va}P78c?0w;u}t000041+zCl~5px^zz~=K(E@0Bd)}7c(X5%ssQc*;`QCFQfT*^`zYb?6^%J4 zGRBtSv7)0SN#2oXE7J**z9R&FB+n|Yj04%>tTU z{I`{-b57e&CJh6-Mbp~eAF+RdgPClog##m$Ega0HRTBru1-eZfz}%3wI9S0yQB>pL zn7S}I7qZ4-YRfDqX^v|gIISB2Sw2iFp5~k56RvR(ZeHT7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfSNkll^6ozKploaKMIP87$Gq}S-)H^(M!C?8_{L(u`)04FTN zC(->r^&K3-NzLJA9n-(&55PtLu7B4pkor4M1>#2=c%(=m?gpM(H^W#U9^gQU1mbR} z=lT@LH3T9ppb4Z~4g7OC1QPo}4}nB}cnKu(!zqy14^1EwKQw{-)(=nBQ4ytK0WZ`5 O0000v43CP=-1-)HpS^`+u#@xXO{Uzj#loCJ8lgmkQpvO$q_uXU zvrSXJN380Nsr5djz=ck=y>_W3zD$&GVowV$7V-}cg@1YG0VX&O2C%#?DHxxxjiz8c zu8pE#?kKtu%-aVDS&d-QrruN$4D+EQ80sSoU~1}P027#x2!{I@!2Igt1#Xv^JdF@e Qx&QzG07*qoM6N<$g0muc7ytkO diff --git a/graphics/pokemon/cutiefly/icon.png b/graphics/pokemon/cutiefly/icon.png index 5e25a942da95822c503505c25ae3a635c24c1554..25af39c74ccffb8c70a90956331d7e7e0b7235d3 100644 GIT binary patch delta 279 zcmV+y0qFj?0^$OY7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPe?Nkl9K zJOxx}?bfSs^80~6-vkho;0XXk6cXr8xSbMgW4nmNz=&*QVyUPPkfTaGca1u%Pt_g!|eq9p=A@D~Nrfs(zF*VSR d?mNK8dH^-J4MJ_?Cd>c;002ovPDHLkV1gPtaJ>Kk delta 237 zcmVVmzl>KcmO|D*n${Z(C01|;L-yo5^Zr4 z5|I|7dsbEeWbZARGLlx#7*#}>XgHk88FyQKbwUx?uZIfYM9xVUcyw+$OXr*$?$$0*4xejNXDff)C)oi@DwxyZV(OdNnq{m}=&xNJ)U*5*Vq0%-+gda)L(r`;P>r n0=||YU~B@h0MI7t33ypErT%PcXD}gu00000NkvXXu0mjfx-?|S diff --git a/graphics/pokemon/dartrix/icon.png b/graphics/pokemon/dartrix/icon.png index 39fb8fddd094f0cd6eb4d1d10f869a4a17cb16fb..bd378938d3220f97d78cd0b61f805eec4d4946f2 100644 GIT binary patch delta 302 zcmV+}0nz^00{H@v7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfENkl(301gip>{ZJOjqaRj#^N)VG0mX|EsmM;+ApigX07*qoM6N<$g8I*U AyZ`_I delta 269 zcmV+o0rLL&0@wnO7zqRe0001qplF?uO+SC*NklN_-cC`e4f3|)-Yp}Ayr(SQ87|KN^~kY5Vb0Wd`{z;bQz zkm0Fi1tKQ9wu;?RqfrW41b7S*+D*E4ImT(CkdMqpsfj<-=%r| z1Rg9ocz`BpF67n$G8~gqZdVTUWjSvE9YbgHC|=`xpDKz`gHTa5k@q#Lhl+Ti^~DFo zhJXIod@l@TfiQ*#!kBCnrsh+}+(%({4p2G@bMAgYn1wIQ=!YlF#}EH&-}vzYp9+@D TZ4@gB00000NkvXXu0mjfALMbi diff --git a/graphics/pokemon/decidueye/icon.png b/graphics/pokemon/decidueye/icon.png index 6078f20b83ede3f2ca9f08021fb1225f889613d4..8cb628c31f04ee09d41161cd2e4f3834f71bd052 100644 GIT binary patch delta 339 zcmV-Z0j&P{0-OVo7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWq`$KlrfUTFbD*V5CMUh|Nr&|T;2%D$t72} z@@BNrU}^ih{^9~~uB#pa)=vQ2pXz|cim)AlX~r^FPk@yw+iU@dO?y^Hz=Xi8J)&>1 zBtnwvGeBhVsT7+I!uQvTirR(U<_4)=HHV*qPS{>*lpAQpckMD5YWWCtQK z$nmBDy&p;s>4yS3K~N8mA9jMk#}Bd-#N!7! l38MUPodj`T``;AA4+0ZM6(FA;^Zoz;002ovPDHLkV1lVRk5~Wz delta 304 zcmV-00nh%N1Nj1w7zqRe0001qplF?uO+J4C1W80eR5*?0lCf&TFc60Q28SUXD~P+R zl+YndvczL44b`eXQz#v@B+nGcYJ(ka@DSN)$l#$-?GE)XLB~R&x83pIe<$4+MZX!Y z@pGC4g;P*)r@5c&oKZokX7vJvvtp$lL2#9-E`}a@N}sLLVDce~5qeO(-Lj`R7T15d zVvt-!A~m?uq7dwjaoNL8VGkWL%M7lR9dc=FSl!N88+dOkZtj12N~{xL9h01RycVCcq z`H*HhnDl&%D>LBG^HH>GAg1So41gT@b%yW~Kg1_1zPO7q%TJX60000c837&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPejNkl3;2pfiBUmT=*I5WNPFE;NVEI6+O4 zBL^pD^!tGztaHIe{-&Hn(XWlWen@uWr{}X4gmc{iFNk$0Us?4{1oJpG(C+$^|Hu)@ yTLj``38eDF5=iBTC6Lk&A&~m-encQo`{4q+xego^IzIgX0000JipBxJ2pz|2RA z43@DXKrUACACqZTB?+0^*sL>TnNjGFvWAJ{oY4uNMS@rb0?{a}0A_!tT*BOoCHxFCrY(lCbuX?Q~MT`N>$uJcPJmK%J8CwgSQWr6O=1 z#*Py(!`rwp;G{N2Syq7BsG)%H{-_3{DHDjZ>OWtf&gG2i@nd2Y!lAs#(&K95Y({_i zl0mdEUpmSFo~`g?p@5TJF9*}!1g3`s;Hq<1ujsDxrvlu3RO*Ob?$M#TSBPaU8?l$@ zaz#RjxBv$dQ%AlsLS1iJII8pZUH(l_J6LFhNuU-+P%R8mBTV>H7!fyN7&vUgFz_Qx z$-jjOxnvh6JGKk6pSg)J!ns-)L5D0&7(V(cOa)e9_@0w?{DY;iuG#u8!h8W~+08d2 SB9yfN0000*Ok-& diff --git a/graphics/pokemon/diglett/alolan/icon.png b/graphics/pokemon/diglett/alolan/icon.png index 1b575078a3487ad1a735ad181c4242add98a764e..ccde6cb2a3c5f2f283fefa50926094383ea3a9a2 100644 GIT binary patch delta 222 zcmV<403rY80;vL!7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dq01ONklBj*Kukbfr(7a} zb!q}30hXnk@Nf?;AOyw^TZ}H!UD#|n2m5e@?6o%kyn2+B^)IMe(pdSV<4Nst3gv9NU@|l`Z_W&Z0zU$lgK*J z*S?-H$=lt9p@UV{11Q_&>EaktG3V(dL%wDM9@k>#)8Zca&nM=jys?Zp)No|)rV^90 zPOj}s3|i+4i#$B*e}7tzZSuOXFL}RglokrO_2f7^2FzmkDOX;zr<~zhI)8(jI>$ca zrZ-`Q%h#s3E~yTg5K=CXt)jhu*9y^qM;Sj&l5{(!US?XJk!g47PSx*U!HK67d46o< bF1EClDS3j3^P6NklNJInHmPX&PMysBOip1&jVU#0=X@f(2;QEA0uk- zghT*q^0asvw6KLR!a*G{uVNkZY@tF1ulWna)|EsO+w!KZ0eEpUz2ARHBq6~cBtrkX zJ$*cMYhjYD#C3xG)T_z{@F?WtE!l#Tt@tkLQSGn?ShQi*-D^%Sx0FgSj9H^jf*l~lh#kfX5_%lT6Sk;?9pRJ$oKEwF?ONr?o zD4POFBxYbK#<%p1D8t~qRY2mDB6cNEtArH%C#nkUp#LqjappbySL@fp09_VF2|4jY;Yw!406>q( z*WfJ7ae*F+kub*vN825QQQ+L`;U`QnYlVSj&7L=FtJHq%yGZnsqRD$dASF&Qnu8xQ y4NHZ5@T1;_kKm2`fcjb(eC!8Ub3fF@R{j7u*V1}kNzA_h0000^w2uVaiR7i>Kl-&-(FbIX$EMaXgIPd?q9@zY8X{)zJ ziE+u!S19OV+kP_utmRV5fv<@t_C(1T4ydE!V17IUpqTD5cvPFM^&B$+=(dj99 zi-)4_6~YwSTmp$NtVK0WBES+UDLdqtluz{f2`ImO5JpA9b-e(V41~S1gRZ9(ikyfQ zqNGeU{6Xy!o+ci@CxKsQ{m02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);00031Nklb^l5JkBG;sWteavN5u zC|#y?D%z!T5orrIIa3)$+`47YS1v z>WH-M^tuP9$vjtJz75(`o5*e%e5lTm%&dd!N<=z0YIEK|e~4olo(tgq6uP*@o8{Di zE!#f0xwC76ZkH*H#@W;()iQkH`^QU<>5K+h<8UcJkn-A-H*_rkJ{zqK diff --git a/graphics/pokemon/exeggutor/alolan/icon.png b/graphics/pokemon/exeggutor/alolan/icon.png index 723d0a4ead441c58f1148dc6385a797ab5b54dfe..49b788b715eec8b442346f25da18c5cd4ba971c7 100644 GIT binary patch delta 419 zcmV;U0bKr=1ndKl7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^wOG!jQR7i>CRBMaFFbpdsA(#aF|Nq;Q-N!Z}cl~m3 za2;t!ttyHi+P24+8P@*CIG~y}2i4XH!c1$`+5l>*D+gZVebojGp0%!s1L8DTOoi|5 zBnT_p#KqS=42rf2HJR5AIM2d>_?*t|6f_TpxQrpHxKWKBmojyTj7fhaf?$kdMR6O0 zr4n&4h(AWBdsy$K4{X#s6#)n$ik~F$sF+8Sa_^A*>+3LI01p|Uf(x-33@EFSo{8^g zP#B6zbLAzKXm4Si3j(A8MKKel04MOKfDp9b+P9JASVpJEP|B&Hf}L=SwvA%kCKEJ; z_vAaxUHsRtFY2~1kUL|C2?M!v7&{E)#$nF!&K#!hn8aah_aIg7Fdqg&9OlzNSV8`m zfjsnwbo>v7bo@_$$jATmhh+R;{*aCTOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0003zNkllLq`WU z$~@c!4tHUIVL8Wsd0=xj)@%e}=0ZW^1SS+Tfe8d5Vj#$-6Cm>E8;lq91IGEr{|9Ez zN5Emu2sq3>0uHke%3<*V#m2`#I4nL&!eR08L7M)tk1w<{1wY$ARdoOW002ovPDHLk FV1i#pyqo|4 diff --git a/graphics/pokemon/fezandipiti/back.png b/graphics/pokemon/fezandipiti/back.png index 45834050477c933a373c44dc1b995747e4fd89f1..4ca492548109873b7491beffd17a53efa2dbc9ee 100644 GIT binary patch delta 818 zcmV-21I_%01<3}GB!3`dNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__0P0@=06Lcd02gnL zEp)*E001yhOjJdg)1?|695XOwMI{|}JtlItJ{MJoeF6Y2kd?tcT+Xu3^8I**y1Z9CrM z1r>e0Jdq__1JCqp=KrUE?j^5Bz=}@YWZ(!`UHRaehk*}*t0LH);*S8C7$-pHAhBDz zCx}eOA=Xbh18|I>4Eyc`=tyQNQ}EQ4lh>d}jjyll|!|x z#WL^$bn#?60&tg?qWh4YRqO{6xP+=Mg>54{YuHYMoPX%jg83x?{}R|~KpEc%s-(@m z0y_!h!*K>86tv>W&dKwGQRFi-)}1E8Uw3{-$wNY?-|K+;cX zn^xQnkdA9JOXu8X1EmAx_Zxu7Hj9*w20Gw+Bl1wsjjLwh0SKYTbmCeDO1M7?%v9ym zxMrXN?thPh-3IeCtpWzPS%mMg17wkZ0hqo5wnyFIkG|+8eF{K)4+FA0WpN)}jJTB9 z0O|4sHz5EnYM@kosRrbkq;q9eUDxgR>CEK$(mX<5aNjbM3MK&*9;iG=&OZOz`+22)hmJ0nLf2^;Szv>&U!QVI|&-#n;cP-I0e*8$(+I; w04uf#CxHE4s(@n#IE7TR07*qoM6N<$g4CdC$^ZZW delta 622 zcmV-!0+Id628RWZB!4YXOjJdf(4eP>Fm^pD?#wM39UMD9g(N6rk~w$EXQEmmNx)7P z{{H@?udomh5Je>&eHpS_0000FbW%=J|NsC0|NsC0|NsC0|NsB_-ghhj00H1hL_t(o zh2@sr&Vw)rKvxz^sO9}%_k*^!&iMmw$#*d_vkN^(1Z;gget#i?#wYw!49Pf(rbtgdqqVg1Zx;Bo0*oHy&gN8XtUu(C!FI-r!Xb0BQL>yLXuKLQVI)M0VVOgnq+!66D4F;+Ms+C|8Bj`SOJE2#2EoZ@ zfQ_K=Ovv+Wt0IIQK8qk{VVI#YKz{^Ys)%QOko%@$=n3=; z9=g6T>oCjGa4wK}PpbsFpj{zn4i{I#)B?8&;977TgjiD;d=>QOj&lbFQLNtBDiCHg z=R%+gqE|j+qAIBCfn!k%lw5!~d(P`ZO|e)Sr*_E>pc2bRqw zw@K7VHfQqOch$HkJexAV?`Y9sc*V!AYJT|XEnJ2jei#gjU4DETTpIRy$G63$;KFdt zUl`6R==(tWx%dN!fFt1wPCv&0000hUSV?A0O#mtY000O800000007cclK=n!07*qo IM6N<$f-1!lwg3PC diff --git a/graphics/pokemon/fezandipiti/front.png b/graphics/pokemon/fezandipiti/front.png index fc841ec39500ba2dbe884569af9eacdfd1ca1eee..1ff68f5004ddfc7cd6b2265b56f2a0178addb38d 100644 GIT binary patch delta 1000 zcmV*J)4&eK}C8SbL2|l@ezrsKIfHMN-=Hw3e8095FjF9s)z&RmDj9_kh zfJ;J-86$@L?EV_wEvLPG!&*H6YNltTR+OSvH+hshBLI1&hpvU@zBC7!2-8oCjaeJ88^Q+2OkEf!&Z;_Ns5{bYzzPuq z(1ZgZ$$8E#B|X5=f&r>OpEm>DRX8M}0ZfpQft`U%NPqGnzktCBnJchm;4YD}rO^T7 z2>nBVtJgGg89=B8upCrMM{KLBOj=Vr#sET|mu7)=ME&(rq_wMTF$^Ir^RA9;bZfyY z+KQ2lFch!Dr34nYD&+lIvd&~1(g45uY{fm?$Ok@Q9t;q2-RX(AQyalIrI>yKfxwX8 z5L7szM}N{P<$2XVB?v8q%B0uU(O&@uWeC9+jfDCOcuEkI@CvAPdJV7==2?I*cJ$W( zimhnyHTt%SZE#0f>+4NFu^VIOf`6p(FTi`Z$Q8lbj7mP^)i z;<1)YXBKpmwCn8^!BU}`>|}L7v*5GZp3uuoZX+#xAo(Sy5ro?jCoU?Yp9fRg(VqN{ z(FnXw&VK0YX+>{p+O!n3OUjNQWznI3+F_=)@d%jb)u=701#)*#qmg2na9WGEknMT( zaU+Kw*9);Ig^(f-52Xzdz_4jTWF4os0E@u^%6ENyF77-ug#qyT+QK?o!tV3-|KkTJ WT`d>r8vRiK0000Fm^pD?#wM39UM+cM=dQak~w$EXQEmmNx)7P z{{H@?udomh5Je>&r)RpX0000FbW%=J|NsC0|NsC0|NsC0|NsB_-ghhj00PuWL_t(o zg}s*xbE7Z}gh9wpkpKVByR~yVrhk9G=6U`dK$hhf1Q93b zWBojfE)IC;0tB52m=_t8_SC6r2tgUgAYf+ZVx&4m735(I(Dfmtghyl)qk7bi`kYhB zAn0%a%R>7kfDxm5K?jy}0Q9AloM1raL4s81*Dc0PN-i@yVhAvWO)B*w4w%OQ>ngQY zk!_1k7}O*1b${JfJhnK|!)POxoXwyQ0f5PJ8Po${(3x#?uoFs}rgWQNj!BUzm`Vq* ztH!K2pd|bpgwa?^T-W#lurEiG0RRX9;Jv-C2LX|QRSMIXALwDgdqF@lR5shFz5~$G zApl{+`rr|4m2(X%KGJVE5IbO$5M$k-7tE6#5QZ)YOn=i_ORbTE^$9@{0(y^wn98N^-?0AS$OY%R(5 zJD{NyDH)W;{Oe7?^xB1z3q30s4$$}N-TCm!vf>GH1Tpk&`vl~Oa~VLHvQ?~AXw}F+nAUtp8>7; zr^O?Q{8P`QVJ0+Qoeb-XUV56OSv#FN0#CR)J*qE_rO*p=Z`CKr@m701>(!w^*9B2* zH(d~_y=VW{newkp+=P45q~dGGb=UnQ^lJc4l;hm)Ukay%gQWfSsD+dCRQbQxAF(?m u-z;kb!vFvP4rN$LW=%~1DgXcg2mk;800000(o>TF0000R{;7`MBX0 zPzv|;nntwvB<;e%0C91eh}xQHb5s-{k$4_$gSB|t(*rAd9SrwH^E=~PW= zLwctPuQ2@(xY0vRWdcBa?Y#XW69O*X*&(KYg|8S_E{W8~e85&q0Aqiy+H4Z@AMsyb zT2~K{%#L}0YzgyViU4^gOq2n#OPDf1b_o*&aFvANhdxOdoFq*9Si;-^h{6;n;woFB P00000NkvXXu0mjfaNvZU delta 310 zcmV-60m=S|1AqgN7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2Lk{M-txZj0002vNklP7a(T5QlC$o85oI42? z#7PHV%qgKu3 z^!chGRD;pVfS@(H0!VH&_!^X1Y81eto)hMIv0bP%R0n7>W}{q*CYVcNma#!QHB6=~ zXG0u2Vo@S+@Jr;lwD=`Q#%CC~-Qe7tB2dN~>oB+#YvNdYhsuK`&LL2)9}DgLC;9LC zfiT{5g?Sic6cXlX&>ji%GRU-3D}y3V-!_QKcZ2+!LF6-o?h#O~Zp31vKmY&$07*qo IM6N<$f{EaO82|tP diff --git a/graphics/pokemon/fomantis/icon.png b/graphics/pokemon/fomantis/icon.png index 2604f517d27c70a644d284c31d36e69213985469..d26f29932ca053ec7a9e45c05f16245f5d6cbf71 100644 GIT binary patch delta 277 zcmV+w0qXv@0^kCW7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPe=Nkl1Luz6sJpKEw;jiG@C4#TSME0000CluL5NFbG8TgWWXuzij|}CPrYdGZhwI zsJj5SRIjz~D$#n>G3R`;$n?5#Xm_|iM(L0-!G~TNtUD3$RSz3WKOAcV&h0F!Obo^zNSb7Q5br7WKo_A+AS*I=Z~3HL@i{H{NtWbAb2&&18QO#R(l=;%QH_ zZgE(WX3!l3`qMcs(b*&f(@U4;548Ch{;O($<^TWy07*qoM6N<$g7rzU$p8QV delta 461 zcmV;;0W$vA1C<1j7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uKJ6_K<>@&EtDVYz%m`A` zFeVS%CrD@*jR`SZaSZ`uvPbpC&;94~f1hF8?Fcdbh76|)AR^NZ4Wj32|D7Ds)`Wiw zN#xnBMO=L)&Pn(oyTbeOYMJ3{7|Rk!_g7D8I$e`G?XThs({x@6NCyE{zkz8nAicwA zC>FL0%_8Xwo+vFasIXvaQd&5{0o80^ah`b%25Q!llMEa51`8}nlwswdCZxx=J)f%x zM85IU1fsp_8h<_$R;NnfGw~gG7_tRWalL58O^6 z(B-QugGVImuwCPTL+N0+IJzS*V9u~@qEd(T zN=i?RN5f6r`YufYKV$%iX8ze`l|Q6jQc5cnBOf3rJ)`7GjbDl+Mwe=QSR^@?jE#I; zIN4zUBOezY?HsvV#Roj3m~SV1Kl)+NOKnO&WVT%F}@c(~nLv#&+=vA%d zki&E@kk0Jew*OY{{=K}2V7W7ej9RWY4re0f#iBlrauH?~R#sbUT_@o;0*69ov((R% zay_%d@u{B-PDfc5WJoZa9noQZl*M`Izhgwh+}dt(jB-t(REWB9OLX>)gHPi$k8R>Z<;Tp2CqHia0DfT9U*y9(zl|J$>69+%00000NkvXXu0mjf;9Iq3 delta 458 zcmV;*0X6>G1Cj)g7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uKJA8}!<>;M1(bxA})R5;7clCe(1Fc60Q1~;%%DUle7l#>uF%^ScwfP}~b zZxJ~Q87fuv(hfWs?Gl!Y+f>M5@L|-%al3=K&7XXCzpYP*zboLA^9~t8utQ8c9e{sN ze7q=mYy2jFJxzp^v! zz^dP32^-A7s;b{|OXNU{^^lD%HF5Hei4Qh0W`h*)mz@QfT_}|C=VY3$h zu}))goaqojjF^OPfrqR6r&Z8qioBRFqeS$Gjnm`Dk6sv#r*)y6K;j?_IA5kj>qHO2 zaGW|{F7+r3^WEDv6M-MJnYO4$KlVkS^An-Qh(@3>R zVD!V9ayh%vqaR>r%W`q#$2zL3BR^ixE&rw;-@UN%ZeZqR`~Uy|07*qoM6N<$f)^Cg AU;qFB diff --git a/graphics/pokemon/furfrou/diamond_trim/icon.png b/graphics/pokemon/furfrou/diamond_trim/icon.png index 2acd3220d359bb2f6e862e4aefd1ba4e2f297c09..815332baf34fe7eb7130ed7d050079b8c46112dd 100644 GIT binary patch delta 435 zcmV;k0Zjg`1pEV#7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrTS-JgR7i=9mjtb@Qa@FtA%<_`F2<@nt^q#qhOa)-V8X)xj3LQ4JlzZC~FH)*QV?2 z(e%|pgBBfn67&gWodHq)*4seGxt?L{P|-wv81&T5&}Y)2LvLI5$E<(UYpo(_j9`mB zDQKxUGncOsCP}Ear{Gr$0&oqg_M!ol_mpPVtw(AGPAidvie&UI!{QIo-Y2@D>^WW? z^2Y$LUl&3+2t7D|xp;&utbbk;KRy~fDbD_Vm@sA2>Gz`Bjm%%kB|>HKjeWAH$R^Eu<|43!{o;sAGjN@ de89Kz;Rm5`9=Rp12{`}&002ovPDHLkV1m|{#lHXm delta 486 zcmVeS=x;of~ZoQFSe7|f0g>>@E2>q3)11lh1s1PI>a)}PicSs zi4pXh=)yArS7IMb1ns28mAHU0F{ZuQVU5=g9?Uv|W>W{C`ui9nJJo)no#Mv?jM>er zLX34f_QkwD&m;tFx)^W!(uR=JO_|WrRQVHtHzG^Ur(1-_Gfl}i#^lG@wj^tt>;lvw zTWiuqg9iq1*tnbov1lFS913oiT04LESmzqHy0QxH2f&)G>L~*tFYoY_b1*rOZ|H@X zJZvW?d)Yjv{(Jm5qAOE}vVa!l(KxtVA9Tl_#^?IU3B)QxC15cP5wQ_4TcPMf%-(Dw zXzCR%Lib}0VQwB1_=q*=MIMvuB3SWQ$yJdKc545Z*}m$l5R$3}&HEj<#Yj>gRIhkH z(#IDOu^s6HJnh-?NFVHPS$qb4u*Fiqpbzc@=#f6;2U_|weYB``G1dp@`TSfTRpHO| cVgFVi-#PIE@q=}?n*aa+07*qoM6N<$f*}3k9{>OV diff --git a/graphics/pokemon/furfrou/heart_trim/icon.png b/graphics/pokemon/furfrou/heart_trim/icon.png index e065e47667a0fc275c1dd36a4ff58dac3360b2be..d779ea9c2c8b93f6738dc30db5a256f85e3db778 100644 GIT binary patch delta 420 zcmV;V0bBl=1nmQm7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrOi4sRR7i>Cl-r8KKnR8>3WbcI@Bg-|PPZ8k$#s{N zG%5Of7!$rR{*;N@V;B*Sk4B$SE(e6^fQ+RGGp>^0M}1EfPialh^90aw*FiaMO%mDbzKOWgg=QA>L*hrrhsBQvJ{Ujbkq`W>eE0zwzaRolN1vSl O0000R5;7Ulf7<(Fc5(K2B#zsfCPIG++H50Z`3VID|G~^ zQOCqXo+atl;p~7^sUV$uVDq=Psu#?sJ9EDKQ0lK1IJR`H4e+RTAv5dY_eSspe&EW5$(BpN6f8iOaB#+&;%pdM4^mIAD+^! zeAk4++S6BIVyk$pmkA9;%8dY?i40j+7vo(VQ$&s$98gbMB&+7PQqdJ;ETN=5Co6q1++f^3aVhj+vH={X!EXAt- zU(Oc|){XtihPt{-&_PDMEBcXEz9Zmm=x6M~Jqe)F`ZzQcy+P8a!3W588xOz>168Tz z*tAdfJrLPmG3)nX{H;D6;(MwlVW4_>?0+rEcv9{jMKB=++d4UFSQ?00000NkvXX Hu0mjf(8SOc diff --git a/graphics/pokemon/furfrou/kabuki_trim/icon.png b/graphics/pokemon/furfrou/kabuki_trim/icon.png index b3cad982e8bbfe0c7ec6088f4063afb00dc067e3..6b3527207dc19a67846d2e48ccc88433e7dbae6d 100644 GIT binary patch delta 394 zcmV;50d@ZU1JeVL7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrGD$>1R7i>Kl+6ypFbspYR7$i<{Qhr?-GW$uwle~< z6N~Gn?)bLt%L=Nyc2QkQ5b=_%`vu`~tzZWpj%I@Ao`V5Pno`W5Hurq@4WTzw1WW?{ zj?A08`y_)5+s_XcYO(TlA4Ahb@zY%6bH8eS7)}o za!izqQW`p>qOhEz;u@1EN-pEXzQcAplx!BGLR0Qs$aWUHvfyjZm%#GcIfJR)Zi2_0 z74G@;#t_46iu9~2mHgzO@LW;4qRdk-b59CJ& zkeMGnKxTdn0GatQ0%S_!#{`gxA0t2peuxj791?Z+c2tmq#I9UK=t>J%W zflh>isH|}5LF`>)D=mWSXgHumR${#94aa3 zw(7flusXH@-7tzKc9am;<7BQ$ygyFU!&9@M{D_<33Gfxu@wl4Sxh^o|E=(tYW|bd2 z#A;kP?%Im5)zQJHQ)MELj<~I)_R4=_jdb#{^q|wt6sVrx9oYW-8E^h!fa*MNVVEgm zXLz(Y)OJQtD9TFjmL8ZORM%mXnI0I(tWar}ndyOn7=>CsoEdA)4t_S9eT}o$N;o1+IFpE7r%$79cbB+@q*TswM87DrHdoDQ7CO#orq%!13 fJ~Zz5kNNlps4@Z;41+%b00000NkvXXu0mjfMi|1y diff --git a/graphics/pokemon/furfrou/la_reine_trim/icon.png b/graphics/pokemon/furfrou/la_reine_trim/icon.png index 15aeb37e1b3520809d6733a46ebdd566e06ff59f..6e9384aaf664b7710d89a583f6427384368f49cc 100644 GIT binary patch delta 386 zcmV-|0e$|21j_@E7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrDoI2^R7i>Kl)-MqFbG5)kSZU{@c)0?!QE6gCVT9m zEvMBo8SprHt^Kxg*4wtK%CjWeIwcR@dRHOv!P2ByXStaT(QSs?@ZG}h{uHo3Hbw8Z z0lowy3Fd&-Lg3$?>$;)v5B1lIZhh}J2cqdJm-7JKY){M^sBloHGZKIF6bF+6rptwS z793&GKtgm4lzB2N=X@>?lvfg4UVIQRsFW7H$2rVm+wxMm1E0i9l0Pej2wvWCeZ>rs zIAa)a&LQ9q+`^|tgmM}n(xV_Qv3z^u&*KscoAIvy;Qe2F{WL#3ef*gp8y*UNBs>)S z$atvuvA$U+KMp)3e)K~8StNcOeAxLR1s_&^NXgsGk0bJ(9|a#)en`oO;0IHj{HXch g0T9G7+F#_uC&+0V8F^(dng9R*07*qoM6N<$g5@Ntk^lez delta 444 zcmV;t0Ym=F1B3*S7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uKK4r8r2|q2 zCKetBR<|8k7@AfzOBc?@mQaw04+pzWng;;9-Iu#B_ve=+zxROEacnR@^!e9Ek;*eUlV2q|9Np=?sO-d5vB?mXdT z5t^|Qc`|^i;PBrEVoABd{h?d7B=HP!99xsx(rMW?3xyttW!dx=1bRpNR;CyyuI5;8 zq=^{`=ybYMFltwz$IcOoZOphHmU(|tQxvM%+@NBL9(J$Hr2_6O9mJxycUtu>(>u(6 zdCa{SCr1kSK$OkZyIp1|)ww%%HveSOO9exSImJcW^PjcF1 mEgvw`SwUSsSdZzC`S=ETOXKl+A7fF$jch<5NMy`@e0$PF4Z4dv2?8 zh?FqlXKa71{k2ew$21X*dyz7WDF|Z}3i}&dxL{NY1@l`#=!Ky7EfGSM--;yxQTG;k zRuiluSW|S>F4B_%m~&#RO`D1c$4-i=U!<=UOu$i~fR%^ZkUju9b7+5|6D!=z^C)|Hu#LLuORq$9kD@&%lq04}l-3_z?JU$A>pRNQA@gZbyX{z5){1Ld9{vJ1Itb^rhX07*qoM6N<$f)1Fro&W#< delta 445 zcmV;u0Yd)Q1BC>T7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uKK8P`Lf9smFVXh}ptR5;7clCf@sFc5}$gA-X>1(obU<;F&^WKJKlPY`uH z1gbK|N}eGh8_{7zrxMwP78~f^s^0wR{=1X?InLi5&~kdOF_@qxK|BYedLqQ7Z%cm^ zbs(BqP|b;w=roGBOq4(RQfmX;B1L@A_iufw;`L?`Y7qM#z~v)ur-Gm!D8@1>LEUY? z0c@B{jB70WrjAw}IH4U3Uen~LFt(diP11o-+6p0ZtQT0yF*w#w#nE)V?hYb@B+1O~ z%3qSaiGz*MDQ9`(d(*X{>{=W(Yx{phg%U{ydi023^9FG;1&-Fve>^|e(ilz<&<>+P z4@Wojis4`o6x0H2{pe%hwq(aM2}Xx%UQmj&!0J%BbILLFtPU{0tj`!o*l&#=&o9cC zpgiLk=TXhF^`oEr&dfFH!4J?KXuYz2R60vB=CL1iXdN5;sM>$W7zRJSz)C5O{7_^@R7i>Cl);X}FbG5wkScS5|Nq-E5T&-Em3moe zRUbW*@fb(%IR4u*v(G9szjdVi-eF@%IHY&D4g(FjBi24{FoElih{%`DW`ZN`2$;uY zAkF|p5LpH+29v9#>y#0*;cy)-e6f;UJ4?whJlI1l16DmZT=bish8us1?7FI&si|^| zR5t@Y3Jde8QB}(<3Bm3NXM>tePnV3g0M1&7iP-TpgfSQE*F(@P2 zuaT$dRWA;#IuY(@IhJCGm%!Q zOEo(IaZgyf@L@*5i}v|0nDkVPLZ=MTHqV0BBycdrG)rI-pd!}gA$U~oBK#=qT*Afl zE*B{I6NsL|L2aeA%H#2pRt78hi1-qtW@79^GyfoHHneXrcTq5UI5z9ID6lEHZu`$T z0_kvbaFCif0j`5%=!~vkt41YkqriXK^jjx3dJISB-yFzd%3+K*i?GGto4V6kq&}ze zS9qN2D}n+Ac%mUT_GCsH!uHRNePL)DkOHDn0L2DRNCBO<59>e_VHyaUgscjtc{=03 zRA{})lBMwBRhGt7Fx_?__Zy~mjkHo7N^Gan}$2(ooH l^C6m*whKPMac%F+$1jwN{7K0CuRj0)002ovPDHLkV1oJ(#x?)| diff --git a/graphics/pokemon/furfrou/star_trim/icon.png b/graphics/pokemon/furfrou/star_trim/icon.png index acb3a5ed6ce3dc7147e350027ea7111c812399a6..551c32addf3ec12b1456ec79c28d674a75563890 100644 GIT binary patch delta 439 zcmV;o0Z9J71b_sP7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrUr9tkR7i>4l-rKPAP9ylCL5a|y#L!Shv`&->E2G3 zOZhnn`W?qt88bh-d+&=Piq+kr(RI$aDJ;CV_D;eB$C?h*1>KBQKM`@>J@Ly2uM~`K z?|LADF*HZ(0IKi|cY-mbrWI)}kZ4@m^nhWFs$cIw>pi?FbVXxpleT}cSy$(IS_#iV z`y6oM$v<6=p%s2TnAAHlkr#*pKFLf4TA$M1G=`{|%cVy&k%06-lc`kjoVITr@CSh{ zR0cA=T&m$42iA8bcfz6x*#rPwyO@;%fPj1#m{ag1iMHa5L`fjmm@)*5WUiXj5nQ>; zA7JfcReVqL=>PL~{R4N4H;m6Z@FM{t@FM^s^J51@~k_ys-5BC(LCVkH0o002ovPDHLkV1hICzmos} delta 502 zcmV+lKuT=RPU4tKY!zOT{JA^-clSlnwT_V&-;lfKAQOPOu+M*@ z|E?jO0{;Elb|GpCF<_D@S>+T3n1VvX7_$PQu!49>CBX<+;%>EtI7NXqUDcNDmyjlS ziRc6@wgtE`krCZ3gt5(YN-;$AKK8rMT+C&p2dDZ7f@8)YkQdGcmj<<=H_d0#4;l0S*xi4e!6S)051osqH&a7)>(;)08s>FlnIgDkn@i@9AtBPP z)QyNBKAA%bBW$LM@0VGcC0Mg?Gf=DbGJ}Z~w7UjLdIOl?E78sm7H3G%43%Pj{SDh~ zU_zw_rYT<^wVDNdoIf742>AF$5VQ#RAcntdp+i1Qtk0p)R*)K|*EG1ZLgRpU7q#=P51Wf&UjRW8Xo`5C*3o3%rrs60vG!X*8 zOfZcg;jg&_3FSP#zyV1WP`ndBHxT%3Nk2+}$!IRTV+RM=hWWj*pXOk##nz24)y}6# zwf7_#wmcj2HgC@@pVA%IjGx)P4_9{2`hR8j4y^1x^k3N>^gr7j^sntc^e^oW`d4;G m{VTg?{p+)t^k2k<^?v|XSrJQAJ;|y70000dtHL^2CA0|P_nf{eL9ioL|s*OmP-H@~R0*{qYh7ML)51{NmPZ!6KiaAdw9ppW%z~j1?v55VE5c2`HxBrqI-gjKseOF}$ zThWTD)mMHo*{JktDnm{r-UW|$QOjZ diff --git a/graphics/pokemon/golem/alolan/icon.png b/graphics/pokemon/golem/alolan/icon.png index e796f88842dfecc2c057f922ab7cb95c39f91894..ccaa2714e850d9de02a92206de34b731f6ea4357 100644 GIT binary patch delta 345 zcmV-f0jB=Z1EK?v7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^w0ZBwbR7i>Kl)(a1Bn;L+oH#H!na9H<3PsQ=L>j~(#g?PHF0gB{c#Vz*UY%jW4DCU2h{4~A6ml<#u z*M&b;U1mVd4WxKT?3K`H=zyUjn4ahtB}1 r^5HE&F7n|OAXoYD3XmD=e8{&SiOe7QVkicN00000NkvXXu0mjf#QTt~ delta 392 zcmV;30eAkQ1JMJJ7-Iwj0001qplF={000McNliru;|mWJI|(c_)XV??02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0002>NkluF;2uV5Jl$()?5H9IRGg* z0EbyAbd+(K!_dQ-Xm-09J4jiH!XIxId%~Uoge%X}_jqhQqF=OJB*GpfkmDV39udsZ z0NyY#`$n7sLt;O)2tEN#=vxG(7RAy)#;asS_6AB-67?cCf2c}1)-}*CC9>RitStff zzSE?&$2sJs=ksh}R&;&}wTC_x#6C=q6@>gTrgt0+;APExLLC)T7UjDz+oXc$bUaNp z;Y3HlaUAV+SwO4QF-pYgWnlXuqDweN`g7}F2s7Ubb7eIw`+?f0Tz8a06Cj)03v?e07U#K6F>|-V3Hp* zKrkGz_;CTmMuIecTmVL~ksud8PJm1RX#B8Cp9sQ_p#fw|kOmOj5TpS_AYBtg01+QH kgwT^rK0FYFPj9!YHV>>3`V(u6%N1%ww0W_ z&z354fL3z{vt{IxY$JtnApiSHt#^6(40iIA`dbD00;cx#S^#GSX$50~5M165=bPkPMdq#GV^bTMo9fQTNf*}TsG3QK*jKj*V@eC)*D4Gz zQ+uChVTfJ%mtf*U&BBoQkP5gZm1jd?Rv-E#P=pbsst>Yc5oS}W94x|Ew!06rFb(ZW piQX+S9R@_LM1$d;ele z&F*uY|Foo}#s6xooMK{HK|w)TsgPs<00Bx#L_t(YiS1O;Zhyoe3~Pb}Z^{4v?d;I5 z5D=TR#~V7G3Na=j*w^(@!+(mKA0Z9^AU>`s@eD6&d2351fvmiAeK@ z5Hstn52Fb7RIqXn_zm&tOwPgK68lUgAVb<%MI2$|!sGGLQ~-SobFql?hoeNR=u|jU zBd=L)hya!dSbtPUXl=qQCIW;@oZNFXrZeBYYXK-q2S*@NH;_K|f=Iy3Ds%IqA2_El zHB_|3trMe4_sToV0JOv6f=yamOV1ZP1_ zK>z@;j|==^1poj5Fi=cXMPi(TdwYAmy|n-T|8sNAq^$O|gMV7?#f!zPDfad$_F__$ zd(Fk9&Alm{Vq#iBK|$$6v|j)K00Cl4M??UK1szBL00ApWL_t(|oXyfPZp0uE1yF8) zhHB*ki%Ao00gBQmXWOHs%eBk_226TpF$UY~A}KdCSmO^G;0f`xAqivz zS8_Qo1(}=-b$X=-FX6qU;@6HTq9zh z(4dO*RjrA#pY`Klu>VkFbsqVhR6<<{r~^%&H)W@==Ri? zZjmarz027+$$V5Pv@NVb`s5VtV3(Ct&3vWqyn^ cdNV)10O#o)G@+eFvj6}907*qoM6N<$f{Ss;^#A|> delta 546 zcmV+-0^R-l1L*{i7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uKZ9o4PhkpKVz%t=H+R5;7klFw?}KoG|Fs?#8Pm){^48DoK|NmKF$IkdN8 zSac}l85(F=L&+N4g13n3z6R?SNDa9Z0tOL3gHtGu3d*_yBiSZf{aGn;4!xExI%t2s zo&9E*`62WVk9ZP;izLdvM*&U|G-`sgJ{7A{kOCzRetV-UBj6rNuJOl3DzHH=aJl|q zlSKou&LDrn!xqNvcR|vbDHFYgdlm~KbD(S=Fz&fc!?Vhw#)aK)HQ(Hq2}oX${?Vba zd~9_)`uutkEKLDLFKlzk$5){n)0lr|vF6XW({JPDZcc_)p2D1mfQN*Bmqgh>d=S1E zb(vq!5IkvPa;^()ILnM-Gx?F?Kn#Cx=)3tU zVf74SlYRBNGA>pLKQXqV!{B$D7OPzS!erPxHX^E~4O^RhYU&}WI)lsp$;6n@5-H6c zf8o>cZdXF*_;NbsS9I4=DH@xHe6l26XI5c&c9!vxu+lXBt?`io1a&^7Lal@V$gBQ7 k9+E_Kf5Z~R-&XPmbxQag@IwwE^8f$<07*qoM6N<$f{MiSJOBUy diff --git a/graphics/pokemon/grimer/alolan/icon.png b/graphics/pokemon/grimer/alolan/icon.png index 09d83cb95e7b5510ced85c7a56194067873a41ec..38ba79b2dcef557112a07f6add581dcfaeef9cd6 100644 GIT binary patch delta 347 zcmV-h0i^!s1Ed3x7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^w14%?dR7i>Kl);X}FbG8BdWd8nhX4QD1(K|yLKA5( zTdC#Bn1K-9vV7y8LiHvsawSn&#iCTGJyhAFP*|>M_arFD0`=0}R6y@UE};UU6=|(& zr;OaFs+D$w-Z4gNl?xaW;k0}qSd@cg=bQl1vI*dV$lEB%MA0VscyND)6O)MxrWYXA zRVt5A%sK2kt;hwU2aGwq!NOoys7=^xT+|!&by*qc<-#ws-}t!rGeEW<=`}zC4;KK@ z?cr;HI38{QqIUpU5-J3*d2egQHLg5(}H tfE)xV0ipp2CrGui*jF0>f_yVT`~bQN5LTm>mF@rl002ovPDHLkV1gCbjb{J= delta 413 zcmV;O0b>571Lgye7-Iwj0001qplF={000McNliru;|mWJIxFB$q-g*E02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0003BNklJvf37EwV!=(UAu88-FyPI+ z9$w^(YwV3NHL6`7f!TI{wQWcTqc#V9uk?sZF6&J*ml%5B(}OH@^a_56+$^Gb9U!`N ze&@1(Mfw>S|9J^8K%*3xccK)Swip6qhrmD&OjzX?FuZKQ4jA0!-w~U4z!bcGD?Bh8 zLuJoY2h3_-FG(f{JuoYErz2q8TIezW0M2{zn9e`oTTx#|8^5s=%JdP77FVe zorfBQcN{x^9D35ac-9D8Yv{^G1=UE}> z2dGX4b$}E!6Mo!8~%{@{Z@LJyfgx*jqf{6Ucr$jTqS s=0pf&?vFvmn5iE^AlX~zAMvw%0FCeo_AY_G)&Kwi07*qoM6N<$f;F&XJOBUy delta 236 zcmV zy=BfHf;g##AcRfy`1(N%8Uz9r0^ER9<MT{7CnI?6tTk!gd2ooiEHghB-IZ&; m2*I_gK?PF%-dbol_`$5WDECuw5<0000&^#I6@fY}Ot) z@KXWEQ$(Q`IXIv=9;NP;_Rb3;n(1{`y>cBPDC$fuc6Wd(+>r5=Fo|8OfGJe@h-3Tr zAhK>uz?+#oEyHJT)#5fR9wk*(PDh1<>1eIrc8`AmKRN!jgV+D*a31?X^Yw7q53BKy j{g6a>-w#QSU%Vfl?|&3EQK7XB00000NkvXXu0mjf)v|X? delta 246 zcmVJ{17zqRe0001qplF?uO+SCkNkl5Z^4KRgXCEULxX&gV}>f;u=K7 zfGkU_@`8a~X(kTDsLorsGB90I$PFKxBpbznaJE%N1o|F;FCvc!z$Jcn=(x#@4d`M) z&=5eK86taFOtDg`xBIt3YHO9!VU;IH+h8GEXS?VzBx%f|BMNcTD5)2sh`fr9Wi35aw8cztpET307*qoM6N<$f_Xe_rT_o{ diff --git a/graphics/pokemon/guzzlord/icon.png b/graphics/pokemon/guzzlord/icon.png index 25e862d788a8c46aa54c90dc613db7ab1542366c..94ef70d8a24e329a38df9edb1adc92d7df05bb09 100644 GIT binary patch delta 536 zcmV+z0_XkX1EmCz7=H)@0000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)*E001yhOjJc;oP&FNd%eB1|NsAUbIqiz_Oydq?!}A6tSR>P zDfVJglzYv^q|Lo4oMK{HK|w+3M6_Q300D$aL_t(YiOrPTj(@{22t5I`c4|FwvTs|29J9)(OGr1+wS?65NVV)kR=fj9x-e+VflQ@9*YF;HahNP?n5bGs!5vrPi zmsO7{hkX*jb)@k2tHo_$191=}vxa8$h*Js>bpcaw;s_wx5Ly5)l2M>BzJC#y`OYA1 zV`nU?*6BH(P~))^ah&%z)0vjrc?U8VIHCujbFH;qJbzx{{V3_%F#gB&TLbaQ+!{!^ z8%TLE5EDHUj|MWUcrcKDERP1F7=W#TfcP5&5qdKapOuY)z(1DACj*%l^VvX#!`ux- z(?Gbc4zn6a>jq-u?UN-J1EFak=^tq9@ z_LM1$d;ele&F*uY|Foo}#s6xooMK{HK|w)TsgPs<00C}EL_t(IjjfWwYQr!LhW!TS zKjc=VXBn*5LSViP?`d}{eTM0fTXAA&uhwLzU6Wik$^?P<_kS;0wm#>c3O{Xx{IN0g zG&x-=iph7=GBbY`N?WaIU&EsK~Yz3|&X9%nBr@CtbiR^?>Sj{F}&k@T)Vi{dA zp+rz3QyA=W{XPMNNEprG3;XWeb>SpPC|1=|-bd_?sKHf0>O-=CW}(_^Ch0>6ZwX_> zmunXEF$Mv5(tiZOc_%WMFi1;Day|j7nW@#d4C!dQ1Qc+){2_`7NmypVV~COL8U+~V z7t?(hl3ov>`;(bsjR?ul`|HITOM=HhysEwc>j_<6c|D+VJ7kfzo#}tZufW)7H^BHi zFm4Nszvr%iX+@U6)EljU$$4A@qx=_OXtxDMHo$}^bxySaCd7u&1DHzC0~j@6-e-bl zU@jFH8CB&5Om4trt2^HKpbAVOP@V;+4H%pD9T?YuiEmE;^DH0VWX&&in?W;$00000 LNkvXXu0mjf;t<%L diff --git a/graphics/pokemon/hakamo_o/icon.png b/graphics/pokemon/hakamo_o/icon.png index 4836770537e3c266d38f6a3b721665726872ae34..90986aa3d600aa29f00cfe2a65f66b8e0028a070 100644 GIT binary patch delta 377 zcmV-<0fzpf1H%K57&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPd2Nkl@Agp8aW_14@m zyu#q=o{5oeGJvY%Znis=&b1wexgR}%`(beP3Fc-)H(@A;Ww!cCKB|9?!P3|Y2S%WG zotsPdlsZahv)BptYc?QqPwv?p{zF}>Olv^k&jIlR X36vG%(8;W600000NkvXXu0mjfBjlu6 delta 344 zcmV-e0jK`M1EK?v7zqRe0001qplF?uO+SAvNklC)txw2BQNl{65%(cOd8Ic6;UhM$GqkFoz-V2gi$%fUKy`4->3WdNj< zIq2T=GhmR{R439dFGpu#HVA^MF6ku7xv4cNhycX&!Y%W7h7;m5ft5fjUK4N#plN^j znL$Nm9oM~uh5*zjby+xp)ySz$sbj_7hISqifHJ9&95Lawg;D&_J(adg&F9-=BJhQF zY<++T^EK;Hdi-|*KK_7WRxGmTuO|uv^uD_=$r8-ng-MvkzX_9S9bgv*@Z?<>z`pOo zEEg=h33G;u#=i+uMG^-3a8hDKVPHfxASbObk#t}|%m}vWgA*-Y%WK1yQPk2tCTgzf q;&J;zJ>*>kUyk2@m7oyjnAI;G^SdF*=JT5X000007&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPc|NklAZlVGn!Q zW~LmlDyd2HmgWB~e40D%Rd4|yZxk_dadVjpfCcuPrvgOwg8vHdAbAHaXcczBBeL@IRtd!OXp zrIAq(zJU)y&+}hz;>tBOHG6&-IK2jiE%!+m(o_FtvZI zr92Z2V;F0@3%}FWbZT{ZI%x_mU?T1{vT24j!ztb8oaH+76i&N5%W}kEM|i<~#>hK= zUw5W*+hbn-ar;mvngOQ~3rn%YR-RhnA@&$y8Xyf<9RzW_#EZsj0%H%rOf9Ft%s8aL z%s8aL%s8yTL>v}iFy3kbri|BIfH5p;GiV=oR*oVMPdU$7=H)@0000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)*E001yhOjJc;oP&ddbG^O2|NsBJq(S!fDb->@_LM1$d;ele z&F*uY|Foo}#s6xooMK{HK|w)TsgPs<00DwN41-qzr&Oxq_kY_t zX$pgpBAxE%RhkCaxJgUD*XtJpc#!Khb5P#ai2)Uu1)$c}BzK^-b!{!pFr5`NWJS=x z0@1QQSwO{)B28d`56KO}bO>AhlI#fz`oGnHQyqNdhN1$$TfH1y0z3iMM5ROZJQHk< zOA)V;26lU7SbuC)rP4DNO4~-8VpIT=m8ll2YSOw5-P*6xDA9+a=C&)V)E!us>ar@^ za0iPimLZe$rFmTYfohC3A}gVmmrAY;(5#1e(SH9RWAD(3uV6;Uz;=8~=K>G2Y03-r(fP`%T zWborU4-Fk468t#NWNX|B!jG!+U$?kKU|Foo`!TD;eoMB;EK|w(}pu9Q&00DqWL_t(|oXwIyYQr!X#dQPW zty6M{PTkY3;3;!%(0dq6wMJl~%e0_?sL#-?T_l@05P{I^XMe{@ESEyZYSZI=|9_1A z`gk+@`%NnNb)Fj3F%9vRPC~d@nZy!a*H2v{yyXGY2&taK)WMB0IuUdYp(Z`IXjlLr zvjh^Bf`!h@vjWCj0JX}aZ^pThl}4x)1`B82X|f#Taid(H0#;jRy;bfJeMs1s7O{2F zMdVbP-&YYf!+!#8W_{T(UO`H7e6&l*5<}HcRD$aI5@TmP)P8G@WSOk}rz55Y#>>>ePP0G5?Dl_p{|^}ICB002ovPDHLkV1nQT@Hqeg diff --git a/graphics/pokemon/jangmo_o/icon.png b/graphics/pokemon/jangmo_o/icon.png index 0a8a2c2d03dee5f814c71ec36f5d9039e324496e..bbc7db29453e1a0004f10bce1ede12e147ef6f05 100644 GIT binary patch delta 298 zcmV+_0oDG{0`&rr7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfANkl3y69a|iF?65$k zsugvDhH=5BT4QZnM4g%BCbD$^MSz@;bp}LzYq6FYz^oDQ$2y}dQ$uRKv#WMwhTDv$ zni)AkuBs#e%qLO-+>$xaUJ!Et#csQWC?(kf&Epr}W-9JouKH+wVStR|i~%zF`_BOq w@?#8;*kKHikPrV9AUFc#Nj_MB{9ZoX0eE&2@eOT(SO5S307*qoM6N<$f+b&humAu6 delta 261 zcmV+g0s8*+0?-1G7zqRe0001qplF?uO+SCzNkl4!NO$9IJc@vP6!+ zPl8O!T;q^_>n3#ws`&PGV30|{X#(m(oiPDRKUJtMMbP-mw0v>e#0-K7ge%DnG`?|z z0mrhfm;kdO60s)x*nn4+rni@os07`(i?~V&02S0$ksi=^=7oS>!x9d(#o!*#@5<%{ zhW%r`QyA-iz7q!aM;CFzfZX|0?!r70UYN;`uL%RAFmpd@^FcqZsAZYcwLL`u00000 LNkvXXu0mjfs|0n- diff --git a/graphics/pokemon/kartana/icon.png b/graphics/pokemon/kartana/icon.png index 7d0b82499eff844938a10fa12fd6eb1ef98f353f..bdf3ec3a516d1ee60f622f16fef5f432c8b337ac 100644 GIT binary patch delta 385 zcmV-{0e=3R1Iq)D7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPdANkl} z%M*|jglR1puvE3jUP1Wwlts|OhcI6<6L=r}GcAG&!3 zq23?=SU%R{{BZb&t)5!250#q?fH+E3rQ#@L?H(54?2PMbQ@y8fLR5lbQEoMj;$r|1 z+3Rf_H@G^`PRC8)r=#zBXOL-o-Ms--AGTR+0gFDA5XRvRE_o^YcVX#U+rJyizKhlB z3*r;-gY_REzdk?)kp)3WOPD-BdctG@@=lmrfET~F+%+7IR4ajr00000NkvXXu0mjfiNc~` delta 338 zcmV-Y0j>Va1Dpep7zqRe0001qplF?uO+SApNklQ5jJDhMcHtTjmZ&ptW>GD`PcuS_>YgV9|s-d|u&zV=q6UjkD2MC*QkPn47fVFIRL5b~it;0uVb`;lBF2b8ZikPe8xs3~$al%0< zQCUBJ3AR zgM=P=`Y&d6^$=SR@CPAY^w;LU0^>d{D_|S}YhWgVC@`L&0L-j7f@Wa)g&+b?UML4Oa-H)|j9Pu8`_ga7~l07*qoM6N<$f=Q2<+W-In diff --git a/graphics/pokemon/komala/icon.png b/graphics/pokemon/komala/icon.png index 6935e996ce6d3775dc4fc9c2db8b8e10f4a825db..96af23fe188fb3a0f9088e3be9d99e89edb4a814 100644 GIT binary patch delta 314 zcmV-A0mc5-0)+#R7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfQNklj&X&(M)Ek9tpB{Smfrb z_O9=M#|{X*yR~Kx^g{!GM1f_&)&d7WqXxjak>iY11OT6dv}BI~z<_!n3@s&egbuZa z92iI(RF-d30O=|2Q_OR;Y=&_bH4tCJw|JhvP(^;%-_)-QB>uEQAfbm|2xRC%3xNzh zXd#eQ52Zk`0l7d{J(L28n_UQG(}T&mKz2Rk0+~Q{{n@Ylz~A-56ZWtZ;0~wI)&Kwi M07*qoM6N<$f=#T0b^rhX delta 267 zcmV+m0rdWb1J(kN7zqRe0001qplF?uO+SC(NklwzSw& zjE%)s#xAAlyp&i4^fa*%MjMkt*x3lHCaEo!9n$3S89u{HlHVSR{!GsifL92XVxok+ zl&K*nKV>z5dq;%cDF9@}9w9llpxUzf0w$$KXwp*7JK%WJxytGta4v3of&Qp#261;E z`}M40h7nP9&$Bp3rSLI%fMW~jHy;FgJvZQb=jRUBBmxQ13Qc$;M)4K@c&-e(Zm<$0-X00000NkvXXu0mjf8P&JF delta 375 zcmV--0f_$l1Hl837zqRe0001qplF?uO+SB3Nkl-@25Y!KDlr9ZS)VaZv zN$BpKp`DYgBmUZ3kK6CRj%CI1>Np4_G<&U18lJ)#D%BPojS;b z9FQ?c?o=z2)~yD#=Wte(`GstXQWx6Q-=Aw(pb0w~sM{^;!~;@$Kc3Tb}Ecwj!uPS&(OWH6MT+C~>vZTBg);2s2+}Ne)d;m{RB%8~;MfPeRU{W6 zWFx1hV1sv-ID$r-;%YUq!I@E+O&DWtTqpYap@zt z!nCc=($*pCYoVp~g>eO9W59!CEleM}bI7=3iq-NVV>UM%s{!Fqn#VBg=PsLN{R4z0 VDOwD0sF(l%002ovPDHLkV1j(otfc?| diff --git a/graphics/pokemon/litten/icon.png b/graphics/pokemon/litten/icon.png index 5602732b434ba724b44a2ff70595a730900dc76c..7867b32c6955fee7d8299893a1341a31d80fb434 100644 GIT binary patch delta 310 zcmV-60m=T<0)YdN7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfMNklkG64|jo`5bw z>a`N^uU!tiu@DW65kOkb3?Y)iV{ibe0qfa2uw1qSJ?;>Y5s^1XYMpkdifmKV9b&kR zF!T(74`~sa+@?``9?mqmx8MNKtY`ZPyZYy8gKD$-gWUZwpZbpaJ%JQ|B!N_aB!Luv zB!Ogq6oKTozX+r@kOXq(kE1}&Pjn}c&L95r8gcCh%l^<0FP*s&K58rVk^lez07*qo IM6N<$g0;wjV*mgE delta 265 zcmV+k0rviZ1JnYL7zqRe0001qplF?uO+SC%Nklw* z1FK;$ZW`grDZo7yY`lU0h?w}Q<;Gk?0g1vv}1eCM_ zS-rtfGk6ALjTivvC1#tZd;#3et>Io7Ls~hUOTcaMmjjtifVO` zL_kx0*6$63IMakzBoPR9t#T1?wClZz795Gt#1*C^^l{)qCS7;B`Sde_SATmxC=9?- z$HG`?#KKtQKf}TRX%>iu0TxPx5gQg^Bq72?)6T-UXnaRqyYj>IU-jb&wE>huRx-B0 P00000NkvXXu0mjf72$RM diff --git a/graphics/pokemon/lunala/icon.png b/graphics/pokemon/lunala/icon.png index 036b9b37197b20975445f2071966ff05d0e45b51..55002ed924dd81e85c7d7eda76191f4b9436a679 100644 GIT binary patch delta 440 zcmV;p0Z0DO1A+vQ7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPd%Nkly(T>C*2t^y=!S;p!|J&svR?ymg*=%N* zWD?5}E!J}!e-k3VI#8SfR&K;pkYF? z0QkqCN&^NVRZ~cCxrqf}El{|S$PKUzpxUVDK0xZwfwV@|Z7{z9_0oUzHGr^2FF{P# zb^0ENBmo*kYvLfs?Z?xn@THx%93{g zWtgirVF8pNbcj#J^feCxyTt4RzlYH36|*;=uvmAhJnXM`1Je<^OVHCVm&BU2Pk(v* zzhb6tE(VdQpab`;NicX_F+m_%Fm8|}kR%ufl0cF_{O%@!Y=9wHT5dH>inXHICOI8XDWLiT46JCCA}=(^=lr8@_`2>Fi|h#mb1GOCdjcq+?7?c2dKV}O kqi=@V$zS2y>Hn=TKfA9m^f|Y38~^|S07*qoM6N<$g0yk7R7i>Kl)(sw%xW{{O$lDFdV}Ef*vt zv>eL8Pl?+MmvYs)$Z^hf@O9>ZQ%(95V3Xdw_XWTvU@@WjLnjl6^xnD#7>RA;QKd;6 zvKe5P-RkwEubDK!ARbAVas% zgTr|p0m$WOpnIMkDgc?o047A+0k^nm=AzIb69T5|mZa|iHsANy^a6NeSN*!K{P?5% zkc)MG6#8S%EI*zAQX*Cv7JP(2njeu5dZ*RjpOGIQ@*$r5%lU8ze3%#Z3^uis00000 LNkvXXu0mjfIr)c| delta 358 zcmV-s0h#`T1Fr*+7zqRe0001qplF?uO+J4CI!Q!9R5*>@lf6#EFc5(K1~)LXurM-Y zZt@gJOzC5Ea;gd;yb#{49_Zpk0#)_mAAu~o*oTXh*zUxLdh(J_x$|A_3nBk1z!E5c zx2Kauu=tV#SVGH6;M&)s=6)|NV0sQuJzM*mDG9$NV@!*?>4ndgXPX7nb5%fK*Ghjr zrWyo476VpIDk^HNEv81is5@@5#yr=Zs7IS+tdywLm_QR0m;Kxr2MEM|}aXW1R zu#3L*YCG@gcD-X)yWXS>d)y2IYf@4T2$e8jRptlR+T>OWeo%F`m*~eqafMli34&{3 z6R;s#mh|u=iGb>4&=NXfD5fG7s4{1MxHAy{!aw`*11qP@P+mG*MgRZ+07*qoM6N<$ Ef|M4Zi2wiq diff --git a/graphics/pokemon/lycanroc/dusk/icon.png b/graphics/pokemon/lycanroc/dusk/icon.png index 65d8394f4e670851a9d9cc4829852265081ab5e6..7b860c14ce9eadf6580b015fdc7490ab7d3be8db 100644 GIT binary patch delta 395 zcmV;60d)Sv1K|UZBq<Z{+u5Xo&l_IL{K{78AvERi6ag zm>KF0yB-{QrlT#NO?-Ezub&=T%tv?6lJ&L&l38~jQvTO|{jfilKQ>n$5+IKKYGJV{%~MyQT-K}|sb0I`mI`%#mTO+SA>NklI7}5jXy54Kw+}fxgA) zk5M3#KW4)W{;Xl#->>l#sB~S M07*qoM6N<$g0rQXtN;K2 diff --git a/graphics/pokemon/lycanroc/icon.png b/graphics/pokemon/lycanroc/icon.png index 8ae43133740c618b989b88abc3d86c9e1f99d63e..50a6a2e9d8ead7ea0faf2d2fbacaa17a5fcfc8d9 100644 GIT binary patch delta 400 zcmV;B0dM~31KIL|NpnWlG_=tDTRS~ zsUZ;1i8hCGxqMH5Fue@%f*OS83q}rw1Sx0$aFKz)Jpoq&fQa}6*a1>Os4{_+o`BhL z_}vn4p1uaa@Np!hUUoG*ot4lTkW4uTHr2o956_4GSOKj+7KZ8l zf!Q##Km4sf+COLM4|!1QkKYs5~DvxflU6G4Kw(|Cc^~djX(AR uNq=DDhbj=9`r##z6F;o=^y>3p{O|y-z!vi~Sgw8m00004#3C6@o)gr?KGm|K@Vz~?={9oMP2PAZDk&Np1S?M17d$g zD>AWXc-Iw*)#gc(HgON?l#<6K<%m^(<%IaW%rzdNYYL`)q@+B|deFWhmy{}gyygKH z7NkOxjp-ULlvlitfosLnL%>G>Stv4FO@MMDV$Ebmm8~M?#u|KknvSpy3^#MYp!@-* z4gS-*#DGZ+L0eAagJ(;Jb~Fffw$y*<++Yyw-_AZ_JQxImK2k(udV`=Q5~L5F&%1A1 zuW3WMKKP1vIy7s#FDQ?->VyIDzWID<4Z@^1$RR%5NrUmRH>fd)OCnWVg#pDEv^9J* z$W=z>+!WdHM?kYkZ+*dM!Whq0b79=vkBcyKKdNXp#9#UG1r_7Nkr^fqt^f-F002ov JPDHLkV1hD+yt)7Y diff --git a/graphics/pokemon/lycanroc/midnight/icon.png b/graphics/pokemon/lycanroc/midnight/icon.png index f6b98c949de5ed49a4267994b91c6bb73678ebd2..33bdba204e61bf0a5da626c41eeaf808b316a91e 100644 GIT binary patch delta 361 zcmV-v0ha#a1F{2<7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^w5lKWrR7i>Kl+6x`ejfOdyU znK3@Ir{Bu47d6$92G>{QD`|4^m9i;Y$=^u=fK>hcp z^~eCC^auHeemF{hz%eP`=^&Lq91rCn_0`nFbdajYGj;}kk=_?OV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);00037Nkluv1-FG5QhB*NAd203>jtY z+pTxWkimoeP=O38Xw3Um1`i&TvjrKgCX~qMzCa7TN&5ItI{o^y>^CdM{T{H6v=ewS zC`KZpm#A0+V(UtuB%#i6vJ!7eF<@(~bBeXJrn91a^@P0ke?_NV0&`wy*BL7kcpHz^ z_2R478FLYjA6MhjE%Q4xLU_F?D4=vks|~EJKbRp+3K`soru*dYy?ZzLo`GdNO`{LEIinNr}`T4#iJKbc6$L?ntX(Hk_cN z=M^x$1Kq_-DSEeSQ5!NGrD;YPeFk+6Sh z4wjY3Y^5Hzn_J#xgmQ5lhkGiqCT*+9vWgki8=8|1m7=eh delta 320 zcmV-G0l)sb1BwHX7zqRe0001qplF?uO+SAXNklGJjU=R5O^`QcEggyp_6*glx7 zUC{+J3W8h;9$KZ{f`e528XMyvU`BNFy%5Dgw<25haXM(}-6+5^ljz0zH3W zDuj2zBzgPJakyfgiQ&b|plWsg=6U9=I3?*G9_LrJ1a{q8gaF)WL3+!~y6IupiOMkX zu=Cz2f$SYnTq2(%n__ZPorcL+)xGm%_aL5%7gbIiC`XvsO&PpsCj5*=p^&|6 diff --git a/graphics/pokemon/magearna/original_color/icon.png b/graphics/pokemon/magearna/original_color/icon.png index 5e97b3ccb37dfba710504349c2d6291316e5f901..0f1b1e9052137fe833551002af3e8607d65d2bcf 100644 GIT binary patch delta 387 zcmV-}0et?z1Iz=E7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrD@jB_R7i>Klu>H~K?sD;dP?p{#{d6sJ1$8HRLx5u z6za3`?+oJjffX{vr!Q)vJ}x(3U`TBsH+r?U|#N(3X7r2yl4DYglIq&0(j|y zs}+DkrFOvOVkSsk=|E}DC}EA-qRN^6SpsE++`{a%ETN5w^JaSXg4lmyDS(!p=E-fx z&OFLfvj019VITOdnq)hd`f40rq&{}cX;{|W!a h|A@ago&LvvjBlR<6!%r*JG1}*002ovPDHLkV1f%owTJ)! delta 375 zcmV--0f_$01Hc227zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uWYCY;0abpQYXBS}O-R5;7cl09m~Fc5`xf(&ADO79sqVq3e~W($K^)TEGc zBS_;tPnvWt_a?bSkR?(n3XWY``6=QVRVfn4bb36VhIt=jKO6{&Fg1yx%>s+qHMf5O zBz8d;CY}Y9IhM87=WpS)G)3-E$SAxqTNJVEWG)I6vFEik774qabK}t-%l=j>fdsgm zdLq2pQ*Yw>j#G71PbgDX&)!z6Fdh8enCgMg!T0~>yNmbCKWd`=^6H{Jf^2y9U)_{mFlm|8;8_Z(~ zHE#$Gi_;-IZdaOnOy4)4%P VxUGh{u8IHv002ovPDHLkV1ky{n_2(> diff --git a/graphics/pokemon/mareanie/icon.png b/graphics/pokemon/mareanie/icon.png index 7b7dc44fb219dd9ee69511e00e70f086313a49d4..7464483cfe5fad5b41544946c0d049ef096f7025 100644 GIT binary patch delta 329 zcmV-P0k;0&0+R!f7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfeNklBPL zBlRYyX>9A6raQh7jQEr;Tzm`>8s=q&jQ|2p_!s~*vyxB01QoVNk04Cdb3PQ>5?(;W z2~~mi+HgQU;$@IdiCiH8#OMLB0PQjK$W{92qG7TphH zgu6h-|NknG;e~>wKt={R6$q{fr0<7aAYG3U*96j*I1>mD0>O2Gq#q6fsg~IM@Dj-X b`QZsuq87?mp;RjX000R9NkvXXu0mjfvZ9Bx delta 278 zcmV+x0qOpe1KbNN!iogme6kbUx-9##5Z;gT>*YEk!mKxY4xByO zGcQ1`HFhu1TMWT^TwP*WQz{WEhq@rc004oJRRT5uMd}5bMMXd*`P4$y3S`mb!z+J% zVNP2pNhJUl4Mk4FfY_+p=tmUh cn||B@_K(7r*^bm200000NkvXXu0jG}f)5RO$N&HU diff --git a/graphics/pokemon/marowak/alolan/icon.png b/graphics/pokemon/marowak/alolan/icon.png index 3ea2a868c353724056482bf33fe1f3c7edb715f0..d434c92fb7021a56eabd8152d852fd50e4191777 100644 GIT binary patch delta 374 zcmV-+0g3+a1HS{17&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^w9!W$&R7i>Kl)(-IAqYeT)Fb@=-*&)ms$2Bb^w5;U zCYu>Y#NAiQPgSksSvPuXtzNFIdh2dE7~IiqtHS_`itT&swJVFEO0m>utfC^qW|Act zvCE^f1O%|s&^ZfG-$8Y+lWOP$rxjcKtmuHCh_VSW+Qi%B@bP(s_OV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0003KNklmvU*vis{gOF7{VaO}{uFUI73^L$A10r<6Q%u@&b6R(r7hrZ|00Eo8z zidG2mafyQTZMf(e%|2O`V)W{#P^OqEKY_~f#Ms#fTlq3Fe@6X)97k0R6VkR%5YC^6 zYetuRb{E-lRw+W2+=HY>nPeF;1NIXW5OpTSg6}IDMAnL~vT$c4@B9;y1?O11kyqY> z9!ZJE$p*Y{JCtLI-KmhaqC;|!_`U>E0igAUr^ml{`vrpA+S2eJt2y)rOf2Y+f~gN+ zjPe*v0|ziBIIv&}x1zCNmWK}uW($1mU_u`|n9#=!Ozh(ZCicCZBz&me5Ksw&?bL>;qF#yPrSU>{hprl%XtFijsa5V!#6;x zd{8{B0IBmqgjnHG=L5NRuu`bYhZzu8`4E4Y4=;`?7e0FgMI8VD002ovPDHLkV1i>V BeNO-Y delta 236 zcmV4MF6l>MLwV}8w$G>1+lRTP7g9R zKvqwfEEdq}>K9h7G5l)jQFCp4*J9B~u`LhHvGJ&ithRKenOz3OA@ZK}o7<6OdXHEh zb}HsHGw*q{c$I@71|3UeF0h`9uce^tl5v7S9@&|jYa1E%uv1m@&}WCy13L86IE m diff --git a/graphics/pokemon/maschiff/back.png b/graphics/pokemon/maschiff/back.png index 6a6a45eb463eae4e713d22b51393f815db7d39dc..4891b2371a546aa7a5b64bf6afea746bdc5864a1 100644 GIT binary patch delta 563 zcmV-30?hrv1k41GB!3`dNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__0P0@=06Lcd02gnL zEp)*E001yhOjJdg)1@RHAvrBIJ~u{ILr-~iWIr-GS4L9%Z!uL_t(oh3%Hzt^zR#gjEspxJnXmysY$it_QvIrrLul-2=*cGB zrTE}iSIn;zptEvFS`+l?m2YnV@dilaUlX)GdTj%g)Y1aN65y+g9e_Ik^UCi5kh&IF zFG~*=eZ&YYpzpp|hUFmC&knGsc@N-bAI<>40e$=vK!3Z_r~U#6Jpi^Mpo9uYhiZ`F z5_3Qb5NwQ28WU8)93VC&d;{7R41_5FxB$oj;V^;cD{uD{kOQPUNCrVTM3C20&Hzw0 z9Wx+6XaVAYm!u3cfQ*390W5;(74(xZ1H1zSCYbmwg8A(a(;|RnKl%-@`dt+cy@vUv z!|HjOrz~@@H-KgN6yQYl8?=6yo&rAY|E*iUp+BD$FVs002ovPDHLkV1g)m B?nnRt delta 552 zcmV+@0@wY_1i=K5B!4haOjJdj(xm_Y|9E0>w6e7BaTx!dT2VnsTuo+TVPdVFzgj?2 zfpU%r3+p}L1i=lQx`%9?~=!~-n|=851!$2XR_?w3y+(ixS*RQ z3*-kW2rtHaUh%EOpSufg4TJ_)fpk9Y0;y?^)7C{HqjD4Ua9YBE3y55h3Zw)(nFyS3 zhv4J!F2ZEDe1B*SrIZ!hoq+1ZT?oXCiNJYz3)%|Gp*&qrFli#~^WHV#AmBT`7m)Wd zz($fT1*rT`fo>@J0_w%2uj0ADX1FYzUf`=r-=Vo6m9^Uo+yMJwp7X~cBo{pj z4|RmPmUHnUh_MKkJ6^V)kcLof1Q%0~Y}wkD6-*GR7k{vKV#4RWA9>ek`7B6Nfv?tF z0CdcQfN3UR(q-TAgMjPlX%DTu%p)LLS^@I|K`5WDco48Z;?kgc=Q+kVg3RmaNva(M zTt}JP$Oi@Mmqc)o{l}InAYKLo21CKitso6|1+)eX!zlQE88{P2Wfy&b?ftb@zjPF+ qf|9lA&>_PU?fJ~}f&TL4ALI{v3NN+2CDO700000S`aZgsVbD zGsj~)WEkFfYn!jZLW%ZzqFCd^S0Bcp%MzH|!kg%t( z3!`es@zE1VYa!Q`rH4AMU8@2=RONtdxeow7u;Eq<+&6|J;9^&HLNQD2rxVIeb9G^Y z5Y`~@R@U`HP=AyXy*<$%BM7aQ^=KiN7AGCmwtTNXs<3M`RUJSN`D`Mp%vx<(&#!wk z8Z{v-(8O6Alv}5ADK=HDk+OHQrZkQLfbG~beZ>X?Ojs5X0dFKlXE2UQ9dI>*nlXu_ zRIv!tjh4|60Z35+=Wqom#f2igB!FLQ{L%>lxUxV1#DBGxe4D1^ML!2Xws{Wo+cs@o z5&)3^=mkJU=6P=VMEMTr`wOD?76ut*7B@is)b%@HfD!Z#FnR&P^c%zh=>y>SRd42i z!~rDsewu{x=)e&$;JyZ)IV1Ov*ltKk+<@(;-N6q{XeL?{DR({H2EbHof_-j|HigSm z6wvm4yjK^)0|5W+_R+0sYz0J-cV}z7EI@ZZd`_7=-yeWG2 ztW`<~3~^QY0%t zDW7IN08CL@Re#QGBuY_A0SU4OV3M_}^DzOHOIV3?1$ulD^t1A&Cpo)geU4>>NS0+$ zG*9>PV}g~9?ZZm0H-vQbSa1lSnaPiVi^aY=fCCF^dt-PtZ+@S~34|v=YfHyGfE!$(~aVmh)*JnTsdjj+ZsDBBVegXhB$lZYxu2Y5{;dtx_ z1VGf~=avaF-CNro^vACO4%C&Q~=Gu9xx2MYZrhh1KPGMK897l z0c;7sCw~b=G(WOvQ;VNu>H>NM&&Mn0=RjOZvIXcFz(aCIKsWn4a45qR-P$6|f$tK7iW(0O)#~){&8RvU?Uv5@kLxI#O=A zb-Cn|OKl(}}rAPhteG&qIy|9_jAk+HzbtCDk4 zM8#XI0gZ&Y+xC;;5$}0x40}_!?Tp@E1^aGh?+WI-Ili6+$S@BF+T!Nbi%DRnE!=AL zHD4?g-gkUftEJ2etZZ;tYc*Q!%-f_u0rby26wE_lZL)zad#41^+Kzu>g-bjOXkCv% z!c4cKsd`pG+9EK_!atM_fnh=Kz3fL6_R(l56b>;JDX^+Z9K&!r%|gK5 zV5o)%_3Cl>l`b&E=!xS)`$#vP1-b|&pTb2ntKSfRxf+&M1t6UTUp!ZprU1{FS7T+o zb`Yqv%LCg&>844?2)%!d9dy*pQ*nk*0=+#Fq^6d`Lms&l*yt3vJWMZ5T$vb`Mn!WE zuP?_^V%E=sEwA6FTlk0LA0WRD5Z&JgfGj2M0I_N2T7LmZ@*@bc0%YdLL69pzk{?Ns z6CmQl;KxLeD<9fXVi08EL-J!g39|B`O_w_evhpGMu?>P;_%Ju&AqaBe!y-t6Bp+`4 txbxx4k39K<4{vxl`S2>3l^^pXz5#1BD6wx1Sf~I1002ovPDHLkV1gnS-pT*~ delta 466 zcmV;@0WJQ&1eyep7zqRe0001qplF?uO+J4B0b)x>L;#2d9Y_EG0hmcdK~y-))sn4} z+b|G-{RGtrmMD`Aw`a0kez+q!;+tbCT2p{yS3{JhK9B&Srb^xkfEp7KfrQUk$7;|9xdsD=$RkQh+Iy>< z42Ap?$+cCgu_@qJuuuyy$0+?|D9e9Vn^tN#1|*NzDw89W4hasJ4=c@D| z8EDh2ehf=QHJFDVD^UFKLuy>Meq40e`Z4IZ^lE47&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPekNkl(y&j3Gd6FgFHaWCAa+w=rcV22YypMsR{eF2#g6X@Kxk z(|j4S$-_`x7gdHi($T8-Mi<9$h}!6}gM7fA7Y zuL9v~FAGSbEQ=m7$Yny@B4#0tRWs!f|86&{)}M{N4P#pP5O%5ML%B!e+j0 zcSmj{@15sJHspJTfQ_O!W~6C@aOi5LOaa07)krRi#0l^NEzO>7DNfpsuZ8)J*qlxN z2w{Q55hZ0jvCvhk;lco&GcF23Rfq->nH0DkS_vcRe28(^@E%PLOV1ZP1_ zK>z@;j|==^1(8iZe*t1kM??UK1szBL007QOL_t(|oZV6}4#OY}>gpcs%st+0e?E<3^FE?osg8YiPG z0OT+jQ+a?JCussPkowC_OX>=v*Cu%#fK{kZPdf`_4m9VhagwB6rbI98Ouzs%%B$s# zlqE~@`1aInN+LQ%v8|$c_BY5L)Z9UM> z6NLZwiXikSL0VGA^&&{RKlv~TlKO)WOM(nOR0O&BP!eSFp_K%g)$RfDfFN%KOA%Ya S&VG{s0000VjlUP{sUrjIA>qT45;!b;D3|l$B|{a;a6DCH*jQ=y57(mcmMzZ07(Z$PDHLkV1ld|bI||* diff --git a/graphics/pokemon/mimikyu/icon.png b/graphics/pokemon/mimikyu/icon.png index 89c587683affe897e592715b9df969f2af1d44c5..73d110ca70d8ec9323042258efdfdefd05388a8b 100644 GIT binary patch delta 277 zcmV+w0qXwV0^kCW7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPe=Nkl;Y5V0)~Bl++YAfRIM7bh`35nD=)&`=1*pcT^5xMYWVTonj`&p+irg>pj4{vW zC5mTwi1Z0=eN)#TfA>cUEPv#JSpJ|~5U)R|5`^jS2UUWYen9#AFF$OE>4#DvuOF%x b`N|JJ+|Ck2Yz;>700000NkvXXu0mjfV(xc8 delta 275 zcmV+u0qp+Z0^S0U7zqRe0001qplF?uO+SC>Nkl(PsMN7a)uv+=XebQi*BuyGz~fWmd^=C6-zt(I%zzVM5P)(4hO@YFn*%rL zOG`FE1Mww~6=ImX-It8n?yQ#q(-QA$Lz~!x8oru7gJ*oRYO)lQv#z#ypw7=7=3;+4 z_JkYCvt>M?hB2qX*+|=Vy2LPB;UAYAg=Rn+M6Cc)2dY0AMR}O^?Gg?i)=WBi{zF_e z6?{sJi|OdXW$IKPKhyL2=qTI1!C(&;SD`_tvRGvB?&wF0I=uW)=)=>GfWo}|z;V9w Z;{k{0n=|b{(+U6p002ovPDHLkV1m=ofY|^5 diff --git a/graphics/pokemon/minior/core/blue/icon.png b/graphics/pokemon/minior/core/blue/icon.png index 85ee89151770056a10b27eedc9b437a489c5c4cc..60f670a1a84c5b4c191ede641ac6e0cc8be42b14 100644 GIT binary patch delta 297 zcmV+^0oMNg0`vlq7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf9NklSLSwXo(N~;qTw1)`RDvk4_Ky@IoKw^*~R0sP38mc<5p2k2t9E1BSsy vUIJl38+xc`75W&X>;!`8kEKBHqXM}B5@8PZ%!hdT00000NkvXXu0mjf%@2XL delta 307 zcmV-30nGmN0{sGz7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2MH7%mwU{B0002sNkl15Jq)_J%rkTA=At@_T9408V0LKlLdk9 z5;eQWZvN|WU(D*uP&6EYq$Afe0*+Y;lq3S%7-LiK1at=zN%V}p298_V_AKOy zT0baFnTTVje1RiT!WfI_3zes^s;wV|G5PjY31gls%pW!YeM`IsSvddz002ovPDHLk FV1jlngW>=H diff --git a/graphics/pokemon/minior/core/green/icon.png b/graphics/pokemon/minior/core/green/icon.png index f724e86aeb85b824befe6d7af9798f2b50df179f..cf24afb332a299f3a18a9957cf5c16884921090e 100644 GIT binary patch delta 296 zcmV+@0oVTb0`mfp7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf8NklG u5(o?0&_g||(8m~MClE}3ECqre703;s?h6R@N3JLU00004Tk`5dyvNpw>ztiW=BVTwOM~D5!2PUvaD-P-c7h zh$+o~-S3N8eeqR84SLSwXo(N~;qPCq)`RDvk4_Ky@IoKw^}tVhsP38mc<5p2k2t9E1BSsy vUIJl39eSu|75W&X>;!`8kEKBHqXM}BX?_f1J3kAP00000NkvXXu0mjfX<~gu delta 303 zcmV+~0nq;R0{H@v7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2MH7)&l7-=0002oNklL@iW=O_GHMJw+uoXQC9Ih> z@N767v{e}PR?*qYn~)$FdGgIqCa0=Cyv%(8#-Bx?bwwoizZ(q<*FdAe39vy$9#?-a zQ)DJ%?Q22T%qtjy(d{)zQM%g;tT@n-t(p-dZTYO$N+e1exIkQ7HrOO6ZqJw0l@G|H zTYSXi>RbQ!#Z105MZ*E`I`X)};*gac7~>F9q4HoSwY4xNKi3-zVa$7l`2&ITXpLnBw3q+@002ovPDHLkV1mKu BfXV;> diff --git a/graphics/pokemon/minior/core/orange/icon.png b/graphics/pokemon/minior/core/orange/icon.png index 40509d6b5116d6bd5ebea49b209e2ba9d259e8b8..7418f1ec53f4a239b6f5228c50c34b2da8e0b00b 100644 GIT binary patch delta 296 zcmV+@0oVTd0`mfp7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf8Nkl|v}H z@^Vi?wB&5tRi_GglM62iun4sT05WFl0Em)Bbw@z=jLEblGAEs96bOXI_8^Lz#{DDH zTtzxSH3`{|00p4Fuy<26;$8aZYnM3haQ&xh=VFWU>I!V uB@h<0p@(`_p^q`jP9T{6SPBF`Dv%o!h6^izjHAl{0000Dl0002oNklR1cgWLbT*;+f}Cuc#{h+39tyY1OPH->i~$7MRi9&_l(K3Br+$RXA}s8#`YkJo5uYk z(_BS5Ks5>3j{pUrzOZ*wHR4_R=jA}xh9%&619%%jXgew}k?-~<+F@w}yCZh&@r7Ca z&pWfsulk?*u0FP@kCyn*AO8MLYdv@#`snnK4=?m_UJv}Fhw7f`kB1(X{)mGrKVTSa vOV1ZP1_ zK>z@;j|==^1(8iZe*t1kM??UK1szBL0004WQchC1 z5Jq)_VKKN+<3gRAuo;*#Ig7Kf#T3q&Hi9j_TcvdqTLPEasM5}=OA&C9DIeebFubmN z@S^Jm%uk!Z;G0OfeH<+y>4AdxnGhlkxJ%1^@?$Af1*K<1>>s)G3fZUf}Lc3 z6K7_Gz|Zn-)@opm7WmB4TsFC=Xl^f`acmz@X21CemF~aR`n4~#_;P3(PC&Ae`vnfC z`eiyN%|IPPKJ`JtE0|bw6uejvWYD_j#*ul56_5zC^*JaTMQp4_6g6^6?9 fej^P1tuQ}s6PIU4Vc&pC00000NkvXXu0mjf<~f>M diff --git a/graphics/pokemon/minior/core/violet/icon.png b/graphics/pokemon/minior/core/violet/icon.png index 4392bdf3b9e2d0ffd24ce0ee1ed9b79bafaeb241..afa5589627aa2316da32b4c9c10a5f8749df110d 100644 GIT binary patch delta 296 zcmV+@0oVTd0`mfp7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf8Nklzw^NgijcPUudl;*Q zyxfxzEjinE)u{sB$s@dJ*nG!)X8j002ovPDHLkV1lPd Bdb|Jt diff --git a/graphics/pokemon/minior/core/yellow/icon.png b/graphics/pokemon/minior/core/yellow/icon.png index f7dfb73362a75a391b064a85ceae073e266a52bd..ae71fd9a24c19f172751b68bc9e987e0143af400 100644 GIT binary patch delta 296 zcmV+@0oVTZ0`mfp7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf8NklUGKSD9_Q>Qn)5a^WQb7NM2^K*nqx08z52?g;3fF`1S`=A`qC0)f!j9z=1|xPN4t zt4If^CL#L~pa9et_HL?1yi5PQ9O&Ax1Uzp5ZzBk8M+GMG-QGkyY+z`2#Ew0_FsuK0 zXO{U@|5M-9$2RrR5+C}*-@j?C2hT$vogVVxg+9*ffuHnH-8231(8JOnaZu$441A>#gk2WEKs0BI38R+K%A=j=VcxnFzq&h))kRFT)s3gTmy{;XTT;EdETPTk(GZ; zb*u$_v#wwyM*por@Y3HG@WF{rY}E|!Y0sTnE1oE5;1Y3h*=U2HxIJG(Up^pDZu1e7 zt9Sk07c=|P6b(lp>d5m3i(^&-MM=Oq#<*B}0WDx8Nr7?Dz;i3>o`C{U8ycl46LIR4 xFYqKv7~_yaq4H>FwY4xN|9ozQF@F~;%nLfZQlkTc=iLAR002ovPDHLkV1f=5dhP%K diff --git a/graphics/pokemon/morelull/icon.png b/graphics/pokemon/morelull/icon.png index 221ebe545728d77abadd96b0d05bc42f73f02d57..1c50141e103afe35f1022e1e185348e685baea47 100644 GIT binary patch delta 293 zcmV+=0owk@0`LNm7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf5NklNwO(Q>T4UF&oQ`5~gY@D!i4pf_{t%z>M8tRiS0*tP7h6^YfH= z=77WgF8%Zd^d8T3I?Vk)-W4A<%s4(2$o%^^a9imFwqb53d--D=W77zqRe0001qplF?uO+SCqNkl}Q$w5D2f?!6jg4E*OYMqRSKmFxrH8kh|XaH#|o@UCRO|z+Y%O z4grOf0r^W2NZh1*#5+*{uFF=|T3SQR0vpi<$y9P(^s31XKamhltby?g8tH$q4pE zYe2!FznJf}_(*Mluho+u9r!Rm#sE3<19^a4@}mfl qTYlUEBwp*+0aE1y-sS`TFdtrp*%6=~I54&V0000Q;4VJ$|zPnD_(uJH;6wOHdu7lK^e38c;L}K#A7M z5L`?$5|s2xtIl}b^@w*>f$AUkqc1ob!c24k@(8{FaiuttTVU$74}gppaPMFYMBabP z^_!LCZ=S z>}FB`muXTul(^VcHS8~|Gw4QYq!BBC8{Muejx)3mPn#3MbfAPeZ(6l5oPREi^do)q d!~LQkUu=_*)`rKl+ludFbGAZGUQ=rxc~pRdqHcnE7ZQ* zIO7XP2qd0mxzoZ`+_3=YIk;nt0ST%m7+C|o2)T52_xj|!>8mI17PMb*?-?|>vGzsLGVZ#dm#>VnXu*)(*-l`;; zO9RM|s`!Ll0FmVC2l%eH>u&z&1akPJ6UZNb6vWFPS_)+HM=g-aAB{jJe>4Jl`QuZ8 iSSb)Y1adz=`~r1W8UzqDvBa7H0000zk}+z;Fc3w3gF(r50hy2! zBo{~{NT=K)>9iOY)Y&)7T?7Vq-!d^)XGNREtC2~+nNE+Hk!JL&>Sp10XBsI|0TApI zd0Mb|z{p5I0vK6M3kkq8;7Tw_Ari_U+kRH*1mN73LRJe2;oNp}5DL9cIdXrD z7jRHoX*k)!{N~W9o0UpkBR(!g(bE}NznE*^UJV^;ird9A)Vp7gd78y2pN94fz|-e& z1!Ro%G~@-43AU^F(&E%~RS|IyDDMB_KL+i=>Z30nzK*u5BLiex_XS3h9tof@$e}PO zKoo$46Os!<&Fiz|!cg<{D7i4<^wYe_^wR7i>Cl-hvrt9gRXiBVp}L6rV^-{>=v=q5Cr;cU`lM+PN1`3jd50r1WSMM(CtC;xTgZ4 z2C{`=klo=>+S-taSqhC?refhCT11SJi9-KWjRfT@5w@6DFuko}(}(;;a=GCPeF^1= z`r=(KZ_i%b(qxoqFHxRJoV6=q9JVITjSHbUln6ryWiKgf2%EO({_84I&4-N)$KR>s zU?*?CefHhte-pnP4^MxWZ+Q5$4?N>x0>}Xm6F?4lSOBu)VFAd7hZP{@a89RU21w^o{_jd>829QdKKBWmDoe-@+N@%?Tq!FS6qR^oM uq!D5sB{VJ86Ct!RCGX`G0r!Kk#}DuGB1)pKl9d1e002ovPDBK*LSTX~z{Ift delta 554 zcmV+_0@eMD1o8xs7-Iwj0001qplF={000McNliru;|mWJIv8J{#eV<*02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0004&Nkl7xV5P*3DD?-nZ>{ACS4~1jxMZs)035Nb`N;{#9k4oOvn!C2?CTl7e*nqV`+@gUUy(oX?VbQk z9Qfg!uTx2BWOK-X4?fC-78D$qZr1N5jY?n^93x1>B!UXvR%@yvD(4Jymy*zz62v@X z`OuQH*onEQ5T-Y#F z_f9r|qCf5Le+pYd4I4lZ1Q5&1IoCmYfW*&guYk}=`x<(kYx%d3vb7`Y0ag5Eq z)@(V(w3&iS=m3eZZ8agl8$k6WgEh2;sUh*e3Uj2?SGB^NY2<(tCI)aiIALP+emG&Y zA9frsjPfHe#0kTc9|6^!i5CVJMXbTW3!?-vDP9;YJcuc=vBDTZObHG~7%hk?q4m(h s7(v|m1u#_fDhSc)9J_*a|JzIa0?}$Bqgv_TqyPW_07*qoM6N<$f=8X_X#fBK diff --git a/graphics/pokemon/naganadel/icon.png b/graphics/pokemon/naganadel/icon.png index 23204c5d18dae1a47dc1e3ceae119b4639ce4476..f1194b189e2adf6034d0c6e44523f40f5592e2ca 100644 GIT binary patch delta 499 zcmV07&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPecNklz(Q?Ef2t{M^BFql=|Npjt7-=;2r8AxS zklk61h)T{L$1e@Q9-Da4AnGgO@df}-N`C;6CvbrIfq(!KC1M36qba&WI)PGJ->_&IwN7mn zO>2NHg6o=**p>B@t)zd*ifD&yB`-4sA_dFoH)8qE4Pnr^OVQH&L>zBL{^{^G+{Fua z0vU!`-9a~qx5?~}Zjiph><<@&fbKqf`on=NkjWpu$PmcvkEmh*lOFu_zXkFJbb&1W zkp!~#M;6G+ACo{H{&*7zk{w=?z;PN2Clh#taIZ-1o5lrz$PhzF(w`vOVZRKR$iGYu(WnTW3J>B z8{WELj?Z3Qa-@*WvGU#Knk?+G45okE%r;@srZ~?Y?R&S_g+P3`UoG%!vjVWHA+iR4 zxxg)jAwibHutC@F01AVI=}!{@6B>#ZnDA)f5TY%?4kEfl-f{Fc3-&5;zkk z&JKs0t1vOC_PwFCRZ32OnARE*v*#e7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWr!bwCyR7i=%l3*$Hk7pp4$DG zwy0_&aSFyZXWM@C0B_>w`GNp6{)zyRoXizKE^5Rv#Y;+vOn}!M1hjwwDJz(bXoVEG zm4N=`!Eo>?M3ey5ZxC9?3ZTaW(0~IHgaX_<0f~qB@SK7M+94CKEUL1Brd8@T6Yxk)TBzs>4Sv9*7ppwH@U@yDXvyAhwJ$J{V zLM66U5QNu*`X>CZ&)+L%+Kojqm=ZR{04ZLGP)rg?6-*OE5l9hC8{Q%i)VcD(D+0-a z3B^nT$%2W2nFLb((G-&fG6AbVCc(7nuL8+}Sp_l+W);XRm{nUKRWLD0MIgGh+ypc9 zFa#0?>Ekx^-~s`S;`1ce2V7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_ufk2Sak$U;qFC=t)FDR5;76ltHT7Fc5})gJH63781z?ya*J$={rkrBSU#! zbYp?3@dgG z;7^+bmYvj7Ix>I;fcH^d=)Xi?88O=}vOLN|k* zGe9*oenQ;`p{Zv9KSY7N3&MQy^h)~INA)g1dDhp@8rco@7+do#5`IT=!@)j;E#ZX^ zmZJbA=@Tiwhr8n3!X|9cPPK2GBm~bq6DR^f@4V%5T&uPd%<|4S$hP8xH@3K45on^FQ zCF%UKw2L*b9Ovx+u5~?F0+X>fOQuMb?V=UHt4qMh4!5i0SSqDLnSdE0m=hh7sfTnG(>378)+E|v-xH%YVF+`DJjA<+ z_PbCaUZL_(1Zaa}EeNp+2aqajomb=@J^|jRz|mg@G4bjbu>O9mKfdE&3k{U5)c^nh M07*qoM6N<$f*+Osy8r+H diff --git a/graphics/pokemon/necrozma/dusk_mane/icon.png b/graphics/pokemon/necrozma/dusk_mane/icon.png index c188b1e3ca04342e6a3eeb458327b801472e1a38..c60f222f76a5f9196d40e0ec9c89f90932aeab66 100644 GIT binary patch delta 428 zcmV;d0aO0)1N8%t7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrR7pfZR7i>KRMB$7FbFFK_O!wO|Lr8~CQh7ow};*O zQ10Bckt__jy4`*g`5eiVd_Vz$kH91HlG6zpfZgwenMnd6EWHy_Vy7^Z-?!bNq7>Jy^wBw~vfr94@@foELq!qm4 z>~)VuIQB`UbaaTfR{A;-vfzG#E{`(wa4R?$HliQ0D%2ALRg?l&$K^=i^wH@`VvRT9 zqyPp|lTkP3hKiS)nbmARO~)6E-_L}sb78I=SX!JF_=>$@Ie1>&{p|11)@jUZq?pB1 z++{i4Rib~5w}HG3mrGj(MQS*K*)8#4&>=_P4+RcWD$@%wc5W?0ZFenq6C zz>;?!(<2Bum-w(P0Gx!h(`fGq(Qtn{f*fDO0pJp}1fgs?FU&VxrB!Y$%xm)|=u8{a z?q-47EYtF8{o)|4(iI5T75B9ZB|}@>>P6_=wCB9e7YEIAN0Y?i{WgekfM#<%;+5Ux zbidykhF8Cie_(zD%zXU^FuO0n-1%65dGIj-gAYD%0%pa>2+Zr65BIlxd;%1pEg-`@ S-jaL(0000l=i)( zTK48C_V%pR)oSKSDPm$;K|w)jIel9I00C!7L_t(YiOrQ+YJbE)39wLJJ7dNn}^OfPQ2Kz`>6K zEGv)+M}akNKoU^^8eeyzi4k8uB55Vr0VA{*O(77hJsNS}@VHeMI|tx-HT-GW5%IYZ z?-Tg&7VW1$HGkG+aj`YsZ1p2xGof!P0A}yO2~7KjaO}o|M%pF@pgl>g(^5QIQ}4#$y7@@S^FP#6N%X@AOB%TZR5{eM|kD-gBk??S_~754|h>Q}0^;N$*1c z(0kK=En|bM`p07*qoM6N<$f=RjQB>(^b delta 459 zcmV;+0W|)I1la?S7=Hu<0001qplF={001yhOjJc;oP&ddbG^O2|NsBJq(S!fDb->@ z_LM1$d;ele&F*uY|Foo}#s6xooMK{HK|w)TsgPs<00Cr4L_t(Ijir)HZo@DPM0Eo~ z?%srb01HJ9kR$g@b@rsB?8#D}B$kU71?ru~8j|8X=l=S^S%1h;M?uiX<5^+yI5>3m z!xfqR^0)%AIVR8jHg?C>g@oNfy+*QP#Ub1$fi=3kdc@2RA-L=p=K0a~eg!KaL{A~< zLLZx&L#qZJ)oOZm@Q$qw!&{iGJxoQg0t_n&`1?$QnV&D$F)ODWPiP zbF}%pAQ602bboTYw66C4Tr{C3l!ezzvQs#OkfUtG$0eFY_rqGj0jD%X;Zh32**1%# zkmBh09{BHn|A|8}4>&Aw#KAT(;$S(AIJg`}9E^oH;NajAM;zda9S7*9gdK;wKjDy; zDr7%v#R2-PvXB-WNSgq>hl)em*H!|x;sBpdfh!I`mqcsp8nxm8bnAj^I4EteXbTRy zztF8XD6t%~H5?R=do~3nD>9%9b*VKA?+Sk zYO3}S591&F^*H|Z!KZk6Q~;j@7D8#i*r`ATYM}z9YZTx^JC=fBx<~$g) zuUfn-f(+)Y(35d9fS>s^_|Ho(2l}OSFoA!x9{eR*oG*ex z^t4F`yzEk@L$j@X_@=_b-5+DZYy#Jy(7N$h>(&Kcgj!OFADm;L!s4fu?#DccDPZpN zG!ND=<}+>|eud0I2bNIBB*wk=LSZ>t?d%4#k+DWJWD;p{RrPBb7JVhOYPC)Q88eN` zfht0CyVqWKTdqrB>tKIN!GSl0SB4;9)fTZ?Axt9dm)(KyL0YD~fXyZfj+Fsi=3jfB z)Bla`_x}$C@9?+nc#pr+{e-{Mz2Lv0JK}$*TN3^ox-4Pi~o&-8~!&0zJvcSVi6@#f~~XnPxUEw6hw2B>7waIrqztc4zP}C)x|%v3Ig{0m}six1z#JI0S#( zDsJ-s4!|{QjCefd zbd31Byr{8dRr2oVLdit7z;ZQ7nwM~XYvh*DvX2T&^`YLoB#GFuRJ{^a? z7T9orwgo_W;83{Us;YDxDs{H6jzhHY>4^h&ryU1{O}bz>h}UT*bR4MKrX3DUI~;)i a1BWjv-aY#@$i>+J0000A^17=H)@0000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)*E001yhOjJc;oP&FNd%eB1|NsAUbIqiz_Oydq?!}A6tSR>P zDfVJglzYv^q|Lo4oMK{HK|w+3M6_Q300AFKL_t(YiS3lZj(@{22t*?Rr$o&E|LxA; zw5!HAJyhDmsz{X*^Gv`^-nRX}fZ{Ig;qFTW?hztv@F2;z-`T5~!U_DaPegqL!aAPeLMdK)PrKf%;@-q}xH+rl->VNg@Ss zK#TUI5Zs#kzJCU|KaWE|hTB9y2NgUA)gjPMsh@`MV3`Jh{xC6VI_in21-?=$0?g0& z9Y!-?{n7;T7TA=;62J#xfSOg1H; z<|U9ah{yHoFTs?iY6{LfpHoU8aS9}^0y#f-zEKZ>Oe+MQm8!#)V(5kv$l4&4y8}+> cjbdKn2huDRfPT3MHUIzs07*qoM6N<$g2m{=6#xJL delta 359 zcmV-t0hs>41NH)t7=Hu<0001qplF={001yhOjJc;oP&ddbG^O2|NsBJq(S!fDb->@ z_LM1$d;ele&F*uY|Foo}#s6xooMK{HK|w)TsgPs<0099>L_t(Ijn$Gtip3xdhP^=u z-ImT7O18y0yL21$4B|F)TDp}w_VH@9%zEHu=SO0G!l%?f7JsDFzBhvn*?LA?Yk&s1 z0V86614tcVhhOEFsBvN%hw0q|GkNCO1afb{Lm|bHlOwfp7to#srf;)S(J_CJc-zPCBw!i!U(oymjDbe`{ zVircIfK_drg`sOEozOeA--{Kv!)4d1o2~Ewr!erRGr#Z#(6Hp50bT$A002ovPDHLk FV1h;wss{i7 diff --git a/graphics/pokemon/ninetales/alolan/icon.png b/graphics/pokemon/ninetales/alolan/icon.png index 71ac99d5a723e34befc7fd7f47c9d787b9bde132..f433689887d957e282514f0caf60e2ad46f3ceb8 100644 GIT binary patch delta 530 zcmV+t0`2|T1fK+u7=H)@0000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)*E001yhOjJc;oP&ddbG^O2|NsBJq(S!fDb->@_LM1$d;ele z&F*uY|Foo}#s6xooMK{HK|w)TsgPs<00DkUL_t(YiS3lhj(@};3`CK9@ko~I|NpkV zK|6#*bDy!&OQ^yzhP*NUXaFyof9Szr6J1-n-*+pBz-a*LzU6}5TbQoO@te2b=}N?G z<4mTLKr7KS*eFZr5uCG^#q)_Mpklw}fj@Q@?BhzxDjDw3UIc`h^lJ!qayOdm(Y14ABEC(dK(S_hVx_UApz`pxaiOK~tw&jiGz@VtLzf z`WB(6LyJR^V|67QFK7Q<{EuHnws0Nx4G(i=de5u^xn0!a0e?f^+V z2#WV@r3Db5{|1o4!xKO>@gUCt37zExkmAF{!{HT9J}f*O05Ol+BS4mKw6iik0b3){ UFw=?601E&B07*qoM6N<$f-OV1ZP1_ zK>z@;j|==^1poj5Fi=cXMPi(TdwYAmy|n-T|8sNAq^$O|gMV7?#f!zPDfad$_F__$ zd(Fk9&Alm{Vq#iBK|$$6v|j)K00Cl4M??UK1szBL00DhTL_t(|oXwNFj)fo)hIxZ| zn9)`WrF9FO79JjGJtTNq*#W$rO}5@OF~mP}{rME)Zy$&spHZZzkU@g1XHx+;7BZhL z3=(48J;sEx27e^ieZe@Qb-871sN#l*qin4Jdy_-25xbm94rp>d5D}uon)9BzDi992 z745rWUPw`I+gM2}T$hDtv5;%gPU*q3pmZul5_h4__(^4rncM6%b4g`_iAk0m$eGiL zRiS1ZcEOhGNAkDDsM_@ERc(8j316k#D*204HU(`4Tj zfE$<$l|`Tf80FCNmUZ|FO!xtecLP0vF*6SI0gOYhZ(x`YZtwtx`Ctbhz!W|{ff4n; atr_1BYwtjuq5As(00007&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPc;Nkl+l<8UZ{;2`6#~s8^T>K@5P<%LPD%Dn;<3ypU0rFOSiMv@CxO{XzcC4z$;5ij$lh)fCd?0tHez2 zj~v}7AxCL*uk2T)?ZrF#4f)4!$F~F$gQY;4Kb8Usf2;)({@4hl5j%mnKgwDlr$3eg zIsLH|NcYD|Al)BDCO<070ttWEMui_<1!Df#`@!+y2l=EQp52`pg-qCnTmS$707*qo IM6N<$f+hQvw*UYD delta 326 zcmV-M0lEIP1CRrd7zqRe0001qplF?uO+SAdNklb>!3;_KD!u~*EJwOG@ zp_}`t4%wP#6b1t2Nu4`5M&-fK5LQWsOg2kPE@F9XrR diff --git a/graphics/pokemon/oricorio/icon.png b/graphics/pokemon/oricorio/icon.png index 80936904c0991463261788fae2b8247f4a5414ca..a5f53870fe5a34e3bb7bdf43a44786aeb2df0781 100644 GIT binary patch delta 269 zcmV+o0rLLH0@wnO7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPe&NklP-;Y71=! zk{ld#BJx_h^%eoB%RantKvn(04OxF`)j(8+2u*=GMInO?iMsa~B7=0mbWL@Z0`9A> z)FJ7Jr*{%!GpP3%a{ecqL$(%VOl(?2oYq&;aD-S+n7f5V&vU{oau`kGMYa*)F_B-= zBKK+OX#8$2PU_Y#>2LT!0kZR>1jxd}w*i6+fFvJEfb4uI0CMo50LXDNAEm?#Ar}r~ T?YBgU00000NkvXXu0mjf9$jtz delta 253 zcmV}c87zqRe0001qplF?uO+SCrNkl6B@SDBiLEu zVMx{vvkl)0O7DV+r40$51uZtASgD{OVGZ33rLi$iH$U?ye^?Hp+r z{I%6~!v@Nz^(l|ySNFgh5%$srp5IHN`?p$NPg5*$81N7R;Z#V+A<<&Vcryw2P}LyY zb4Lvc3^^=;vEKm3FMy$PErFT&kig7*NMPmHLDzwmtX+N7OWBL?xki33M$Kgvtn%DF9VP$!|0RU{<&33S03}1B!iFVrMO2v)1>w=8V(WiE z6ot^Ct)(UJgzz}FAw-y5!!3kR59ha%7I|pH&R5gO4i9aydQU(@M5{DC4M;_^j8nee zqs_EoY5iD^3vTQ^J06^OuHvUAYb%*9&3dJx`j?7vmem*|XxM7K;r|0!S(bv2F7qgs z3=K*?fJg!anB_A|opWGde+U8?IJG4b7>J((lU~4>#P}G2`7R$%JhF4YC3sgP00000 LNkvXXu0mjfdPRXj diff --git a/graphics/pokemon/oricorio/pom_pom/icon.png b/graphics/pokemon/oricorio/pom_pom/icon.png index b60855f9188f9f939fb11186e826117ea801fdd8..d757b0564aa6899caa27773263488e4395b7e3c4 100644 GIT binary patch delta 302 zcmV+}0nz@61Nj1w7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfENklZ2~J33Uq*il zglGsr7t|mU#Qkm&i#_t)zym};?+z#dzd^L0FOljO$)icQ^w5|-SLJ>NRD3;q0;;!) zWT^G~U}hQ(bv=;J&8nL~-kpQ(QO>DtF4prElMd{Pt{vl)$m(x~aRn;NVH=cNdZ@hdT)_6&wDUG=u;E002ovPDHLkV1mEhdx8J} delta 343 zcmV-d0jU1&0-*zt7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2MZwuC89zO00035Nkl{PD=vfbq${hm@i3UC6?eE`3|tv zv*wCy)sodsiF=+;(k3-DOtAgO?3Q*U+xB9!8*VK7z+FafyLP(v@K2vjoJ-^I7>BPs zLA_;*+GVI_#<%UGMyz;&<5|+l^ASVg0m_lMs;r-$3x~s@03#;57dT+#pdJ`8{S9Dj p0*q|U19RoW19RoW@AW5qd;uFKvoUP;7IFXp002ovPDHLkV1mrhn8pAA diff --git a/graphics/pokemon/palossand/icon.png b/graphics/pokemon/palossand/icon.png index 3131f2c20540d6e9a2c451305a1f474f0000cab6..80f64f8b00aee86906ea3f3315d884a4a2e0f7c0 100644 GIT binary patch delta 298 zcmV+_0oDG%0`&rr7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfANkl53#px|0rJ7!kVp-{y0rk9w>!@ zZi8gPCxO$23_e8`PNV_O!ohScOa;_!ks(9i==8T))gFDMy8-eBp!YgF0rCR@Qsu)a wK#F{r2FP*rX92R6@qkG_WCmCH@a=$j0Y^9(J@E8_?f?J)07*qoM6N<$g1`-W;s5{u delta 245 zcmVA>07zqRe0001qplF?uO+SCjNklnWjdx? z-zQCOm6cLpS0K3v0sp|8!b%Y-%69XZS&$fGzBz-^bW>owD$Dp#Ku0Jl5P&8^1HqxI zAa*2ZEaYrDiP#FjY~_T0CB)3I7Lr!-WO#rf>)yzK_rh*jL$f1WmWyKE;RV+75{Y5? z(BA=B0TtkD!k7e{%MzsR?O8Z9uMb7QRzPV+TO^}^OKNm6>3{gyIV{XO=nou!Q<%9Q vO<|^f?0!G!!cejkYWk2H<8(iE@}qeHl#I#}zWzfT00000NkvXXu0mjfY-Vhb diff --git a/graphics/pokemon/passimian/icon.png b/graphics/pokemon/passimian/icon.png index 6daf24ccb6f27848df0860dc2028bbd5fe4202a5..1eed7c54129bcc6e04fabe7e0d1c3e96d1b8ddad 100644 GIT binary patch delta 373 zcmV-*0gC>o1HS{17&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPc}NkluK|XF=mAxCU8;Cp-q!)B9xbS=YCc)zATHcm>#XjO zC@dyaT?r(V3L7A`wkaTTPEgz40uTa$9x(ug1n9O{2#iM*LaL+f0HuF;LUe$QUt{Efb6pAiwA=P!Q+6)iq8r1>n=q5RW^={0FT{4SR2iObgG6IhKNG`+l*rEd> zjlg)xUl$ZU>|Br#cR=sb>U%)y1~B4I&(8k;l|^eg#Q#USai z+TPNnUY;tm-W7cmV_GE}<*wRw@Z7gU!v;C2>DFCozAwOjeEtG$L z%kZ_9EoTb^{cc?Ys5u@=h28^av)ni7)yoA6wn5-V1hM74K%jWOU4GC3UlAL@-VGTJ zBj{#UFlH#v{2UoM!rXlg_AnH}n0GSh(o8|8R8*5e^B7#~eFCZ~2DEBOysRPrwnF-& z4r%%{q(ABq(jRrm!h8=MLjBMo!*WT~0e|Upb;wg4f*)Q7?2+GfnEGLEI!yhrx-BQ^ vP|JB1MMbqbkO)+|NkE$RHPK;`&>z+>SFFnT<7uF{00000NkvXXu0mjfXWpOT diff --git a/graphics/pokemon/persian/alolan/icon.png b/graphics/pokemon/persian/alolan/icon.png index 75348250d540167e73e477483b4a6d22335e1b28..21ad48eb3146b1d73682f2cbd3356283dfd275fe 100644 GIT binary patch delta 324 zcmV-K0lWUl1C9fb7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dq02eNklt0G-H8~{Z$oS2Sa3Jxaa;qxIG4Z1aD+ItTSY7Zu>N{mxl zQy?V~7g&L(2?<%vV7h}mh%lk#^@W`M1s#Qu16Ay)oJFyvtGqM z0E!;of+(#EV6$j+lyblph;~67{2FQZJ!vYdz#dT3-6J0UROFD{LI&gjnd?vey}r5- zb6xxW4*=*V1mk}nmo;_k$;QXHzxO;KXUC5Rq|LfNAaM!90U2y@b3n%T!PL9nhd1sU W5in6n^Be#G002ovPDBK*LSTX%9fnT; delta 382 zcmV-^0fGLG1IPoA7-Iwj0001qplF={000McNliru;|mWJG$(g@#moQz02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(8iZe*t1kM??UK1szBL008VsL_t(|oYj&+4#FT1MY#b^-9!8?O=^sB zWulkxq;9>8^Z>N<03E3^)K*=ZD695m_%Op$>erU$31~4U8h+7?0V)Cd{?V3Uoj|CS z;uxw0bXIAKRRb^_XcjB2WE7ySRqRqIw>!)?H6!iNW`A0pf8hYRM|Z^KfU*KLsbY!a z0SiNvLODiO@Gb+@768aOGEHs+rMFCSuIl1{ObnE}^L6~uMl$+N`fKwr57zkvnSg7? z;AO)9wcZFaZZHb6o&eO7EoG3Yrx)WQfrl{tCVAYi3S(2nXJN#TER357Gx+fk=GhN_ c{jMK3=WmQ@5MwYQK>z>%07*qoM6N<$g1KOq=>Px# diff --git a/graphics/pokemon/pheromosa/icon.png b/graphics/pokemon/pheromosa/icon.png index 4ab3a02a4e19bfa09f39b535bd01014bce8334a5..0ff38de88830f316865a115b5bd4136f4a64fefc 100644 GIT binary patch delta 493 zcmV)}9sD+RZYsZFa}wkXvfoKlP}4?2lmd?KdkDSG4E1i{;s)qi@)_u~=QVN3 z-KFzLi}Zl>EJ!r~x*2~hJC8a)0Aw}nMf<1YFM`SFQ!trgtTPhDoPx;|b4UdM62*9d z_-?wp!w4jtt1klCfD?$Vx_lGJ>X0Ci!@UZ4fkfbwK-N79#1lav4u}FtGJF!qIzi+G za_)jAasoM0&~5`GkYErmkZ6!4kR1;O;k6obsZwBVhqQ(G1NJRjhFE?8+Fub2veGVr j4 zOC9mjy-W8Fm3rfCW#nJmp<4)~;A034yr;5@=*gf_0B`7*e#;S}c87&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPeoNklO1;V*d2i5-~i-h7Cz|#LnFh?HxKMYCN zQVEla#g~-{xY2Ta7wegQ)%em2wHHdWxcEFZi&F&5W~>xpq(7@fugGiGPHx$slJC7 z5p{r(HLl+_0A;j76yF=M^$!tsd-1&z{o4wngp`QTcfC_;5Pn3jkjQ_CsIRtw0s0tR ziTypIoq-`?d$1vu<4f%$c&r&`{}ml_3uv+dJH&Zk3Ul5+`GtJhAFDuCe>j0G{_p~s z{SgRc_Jk3=A3BNBn|Fi0YhG2-S{|JM(1 Y58o2TEvCI;00000Nks-uM6N<$f`wFxegFUf delta 362 zcmV-w0hRuc1GEE>7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2Mq`>zS3xc0003ONklb>k6o$FMyG0HV4<0)dukqr)qdioyw=9v& z)*P;@)l-<2L<)|V$P}jmZ1zf3SP?1kC zonZnl+5-aK_Nc-U-Opf`hh7Ya1o}mTdIwpY7yar?*;|(b;6S+oW!ucsRLTdsWP4DUdauL1 zQ#}e3gdv630VW7T1uAKOG6*vOH6mdSh=h@4ER4iTnBVr}8^Bzkzh)wFGynhq07*qo IM6N<$f|kgYnE(I) diff --git a/graphics/pokemon/pikachu/belle/icon.png b/graphics/pokemon/pikachu/belle/icon.png index b3c0f00b37d1f1874b2d77cdab33473d31223664..f19b2894547bfa3816fa92186fa56f291dabecbe 100644 GIT binary patch delta 396 zcmV;70dxL{1l0qO7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrG)Y83R7i>Kl+CWhAP7dMf(;}My#L$Ihy9x>?Oo5! zxadNT6j9IX^^L>*k1){_fiOK0Yy24~PSY*mrC@cdGA|XtHt%K~;aK7Y(|!OK!i^b| zvQ_A8cFhqpOpD0Uhy;iUCK8b-lY_q&0fJXzAqT+RZ^LV?C({Qp#xB+G9juFPZG2vZv>X#-a3z4P5yZGpQFFAk1z5^UhC-@s{gL?L@P{>jNY}~1AH5$=e_$in qkq&;?{n7N`o;>f(AF=pf`r!?s0vGHa8P_=g0000A9tQn~#}qW@mnl#&14VkC}h0 z#K4$S5t1K5J2|gZv>cFSUuYdHfpT9ZV^T-qlmbzYfA1UGtSw5{O)jJK$08 zXIuDR zp~ybWyd)k^?Wr}{FLjrFi`pWX4|RVV5KlDi@SqTyO%~3%Sz2*?*5Q>kgJMqY5K1=w z<%8N>kW^_n@*!&g)dlmaBE%O`RX~i*MhO^DU~FXxn9R$>kwMMJj@-9#nV^ggcm%Ql z2B_;=W2Xd6ijm9ha8}@ee#C7)Du_Zi8?8mbM;{;73luz`G+84)E>eG(-!?2Uo@u}) q6zY=8clK#;#Wf%5#h}gK^6?Eg|I3o)*nqkK0000A$_ diff --git a/graphics/pokemon/pikachu/cosplay/icon.png b/graphics/pokemon/pikachu/cosplay/icon.png index c826dacab095adaaf7d773e90407cca302577c3b..21d9172a1f956b3d756786da46745b70769fca23 100644 GIT binary patch delta 308 zcmV-40n7gU0{;S#7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfKNklL;$moxSK=x>{5QrTHSqS84QQY7A`r!>h?G;{6S5Mpk0000oNk!4HAFj z2mnYq#u4ZsVUZCC4eJv!S)wHz0E=&VeM7bu`MQJWi#=Q;3h-&81bIQZ?QVKWwcqLh zMPNGtZOG@9QQ>KcHT;_*o`gAg66P1Et(5x~y&sY3*d5R%v`tMIN>F4cOaoS^6Q=ut zmBkx%ZBP@2R^-xuQd|q(F$wd5Nthn8&B7F%gn6_d-}TnEQ;L!Wf&c&j07*qoM6N<$ Eg1BsW;Q#;t diff --git a/graphics/pokemon/pikachu/hoenn_cap/icon.png b/graphics/pokemon/pikachu/hoenn_cap/icon.png index e5f8bfe206c6819ee41d6adc164458e314cae7af..5b9cbb2ba6ff13b50757808699317383b0ef1d6b 100644 GIT binary patch delta 325 zcmV-L0lNON1CIlc7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfaNkl($^66{vs5O5zB3^X?735>^ zBzk)y{SOKa-2Zt~5Ji21IYG{nBHngs_$i@^x7+QQE;(tC zB4JTwmcoc??HCDTppO*A4VtGv7BhZI{pk~iLoN3mA(8%L{wDfpg*g^uu>k+n&wzhQ zy+j`0J)1#|dI9kYZcGSTFD+AJxVcu+r2sPIymh+(4OBZ2M%4SIkv(itiTbC9!lCxE zCqBORun~qnrRUk8Bn*AEJcCsjYFkroZYm4oV~4qAVTjFzjTK3OiK9OP-z6PrV(CzZ zEDQ-=MuaR3m8fle$t=tW7#xJT;vkHzj>1^%g!yehegIuNuQ`OZp9BB^002ovPDHLk FV1m-Tm7@Rv diff --git a/graphics/pokemon/pikachu/kalos_cap/icon.png b/graphics/pokemon/pikachu/kalos_cap/icon.png index c903ea9f3f8c5e41de85b6becc7b7cb4f9428c57..2aae11d524b092f080e72bc675abb3e22700b146 100644 GIT binary patch delta 330 zcmV-Q0k!_S1C#@h7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPffNkl5#f7mMk)^|SuDs1zS z4QJ67`dX`%h>##jZ(&qK8hSeuYWt7~+iU2334GhCg3yu?cxN4`PQ-r^RuQukS>JpC z2k@9&iJzXx|3N9?dx#@V@=LW5($~y$90fye0c17cfMng5BC_tE{6fC$k69qIKY~Ce ze?)0ql<(o8!ogMgZD~Ry;$$)+VXoojQ#25ny8ki4I!nf^R#=~^Q$VyqDy~g z(BAeFpiIn>UR{)ISSMyc@2Zleb3)8VS}sfVmYdoKIOjW~3*!UK@q3dXwPJb8ptA=Q zv?Q2KFaV8R00B?WD8dn2PvDS-UYvji>Q#gG0G)lT`n8D}Z(R>S0Qm;E4#jq8q@yV^ z!~W?a7uBC~OM3OK$07{9?0*dM!q8p*a-F~;45`<<>coODL#d=Z2Vscsq*B@#A81Em zjs`>Rb)c4;8kq~ikilaI7lfeof|K)Go0CI2%pu>?#+6wM?A{lMphnV5UXdP>5zX(rs0dvkx%XKeo_E!&XA z5}9$|xzkB)6WVGn_?pNbXS?b^)*LlILce)+*`B&x4TGdJ9c}^_$X9?ojqZ=a4*4z{uV4}}PL)AFXBc^(II=4LH zx8`hx>t}vA>0-CQJ+GqP*9P}iY(F64r2rIc@AH==ptshhCky-icEtZt;EoplJcbnJ zJBSE`KLRNX6b=R}0<=%H#UD-}kw2E)`D3X#`yed=VUUeL#)_L${arsi Z0o}q9!j%l7NB{r;07(Z$PDHLkV1f_lj(z|D delta 361 zcmV-v0ha!e1G58=7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2Mr7Z=w`uY0003NNklt@Z@2KMy+ugygh_g5a19Yna?GC2=Ud?NB_OGrNpnz%v+<L7=w*4zwO5joLQiqS#Gu$00000NkvXX Hu0mjfQ*V`` diff --git a/graphics/pokemon/pikachu/partner_cap/icon.png b/graphics/pokemon/pikachu/partner_cap/icon.png index 09ae0c691aa0b47cc20b7324d87dbb68b53f1dda..737fababd7d49b68955719525024863c8f2ff490 100644 GIT binary patch delta 331 zcmV-R0kr5#glt1)jZbP|F^+yF2_Mqg$^DnM-j$-AEb;oQ$4 z(z{4;JrT1VL5!^NeUDa%;`(-{-WEjNUR-ZW=zj}{5|Sc9e`}pmgYbVNT7^VLM18RZ z4A9TuN$mEBb_Rxo?ZJi=jvuv+;IU?$eia>Z3utx&I>h@vCFXtqkBvacMr;Ja!yp@hj1f1l d`oDg70hC4(vH__#b^r?i002ovPDHLkV1k~ukY)e? delta 370 zcmV-&0ge8Z1H1!}7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2MrDcL^L)>0003WNklRdh8S?xX35W(OgLM* z(UEs-XBLQ86VW7FV_X!+iFYK#Ezy1Y9r@0m5P!OC8}*yJ6(QapUawzIFGsEpuIYcX z37nY|2Pl_Qn*jk&&nUx@uDOC;7G|*$8fX>+c01_&b1`q18u!=b0whqZfbCJPmqt3; zqA=p07TKu(+OEl&Z?1aG!jOCXAA?@JFvQH21G6x6y60*yf-vLlk<~s3L&`8KZHx~L z&X?L?Y`hLMDAORfK^QW4>|uj2l%v${C4(?Mpb!aDBN9dzu`n7dVSd|>Zy(2?6>g_8 QIsgCw07*qoM6N<$f`b&C$N&HU diff --git a/graphics/pokemon/pikachu/ph_d/icon.png b/graphics/pokemon/pikachu/ph_d/icon.png index f0b66bccf8441175a893f783ddfcc290672893da..3d228c4275c3677b596642b918326e9e7599ef07 100644 GIT binary patch delta 350 zcmV-k0iph`1E&L!7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWr21!IgR7i>KltB)IFbo65Xj0hrU%}ut}z!tTRSZ-$!46DoUA?CpiVGo&J%hh+MHgDs9eM#kg)ZbGQ zj1oxlhZIQmhw{UVKeS;ke@KBOe@KBOf7}b^^v8`Jl0OzfWPhwuAWwhrIVAe*heIHH w=z;!Feu&q%g&x8m>#ZIi;@3X?@mqd)02^%=5xlExO#lD@07*qoM6N<$g0O;;p#T5? delta 357 zcmV-r0h<1&1Fi#*7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uoe2i-kq{Qv*~5lKWrR5;7!k}*!iFc3w3gOM-5N`mts8L~*&&K>{>F~t;L?-w(ALj0|Pc-~xsKl)-MqAPhuF40{+P`~Uy81JO1>hTeK; zwLV3f7h{>^rSz#^sEFs&lzV(X`I7)n9{dM1MQH9n=ZkqP%}z9K>Xv9UZ`7 z2C?T9sNAHv*-`5$h-h1=oWZ#*QyorlQ(P%ym6PDvXv?;&MrcHwXAsLp=jr;4ILkJ_ zsZafb8ZJ`a>8%GTkkKDXAd^29KRo@h0;@kB0$Kba1TpzT3uN%eMh~|?Br*EKq(I*O zz|sEQtw3<;q3#5NOAjIyKM17jLkohN`n!Jk0+6y4%C)w0jsO4v07*qoM6N<$f)ZVt ACIA2c delta 385 zcmV-{0e=3g1Ih!C7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uoe3Zsl0KmY&%ElET{R5;7!lCe(1Fc5|_XQ&58-hcsw!sI0b&cZ;JT!#$J z1Orc1w|0wvC0Fucm+W z^bX5Wuok*uL!ecoW$_kDwp;hg3fmfESwcfpItD6sA25^j z-V@Nr)#0Y_4~8`2`lloQk3#y}!kulN1H(?jWC`)zIzSc}6>z~Z>Y7QY6{TF5RX+i< z$V;{>p>V(`11y8y17_d@GVOpFXt*`dJ77=-MFrFY#sEA%(>XBP=v?~1uxcg69GJa` f95BI={W2e)vDdG*ZQOTL00000NkvXXu0mjf?A4_- diff --git a/graphics/pokemon/pikachu/rock_star/icon.png b/graphics/pokemon/pikachu/rock_star/icon.png index 2c8d144d60748b5f4929311166cb6bd7fd7a6f0b..89025f0f3eb70c86e9261e6224243c3fef7ab580 100644 GIT binary patch delta 336 zcmV-W0k8hB1DXSn7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPflNkl_X)0mGTA+L6}n9=y$&Q*xq_vb%RW2di!JXRdj-h z0vY`g{V@3>1A2cX0vY^~3S{<2a{UK?r1{{Fu*2vNELz5G!xxZv6_gNMz;?a>0000-7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2MrDmq~YIL0003KNklkKXh0=o_0#hChTXg~Lac|v5wpJKq6&9lJ?vicU`Q-B&sY~cIP4x5Omj|J z@Ni5E9$L&94}Jbr#fQ%VPb@o=QOXjhQITOkq-2?4yYeXruUCURRA`NNei3*sAiT+4 zxH_<-Ik-zEi!*zs{E;p2xyvOPOKmk{<~F}OsAd^ea_%kU!xqSk-ZhpS^9|?2{jdSC{cr&>{qO;~ z_QMCn^uq-t>WAU3A7;gCKf*km`Vj_1);{`yFd*lCBmrqUA_)jqL6U&15jU^;yM1^8 YrzjMFxVFsU00000Nks-uM6N<$f`#3ThX4Qo delta 360 zcmV-u0hj)e1F{2<7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2MrDpDe2Oz0003MNklZt~5Ji21IZ}#v+oj>Bgeu-{w`02GA~{mT zDX>taXqLi=W@X1n7z2HzC~nX^{jr$wQ|eEjFdS;R?+A(X@AEg&M=Q*+7>fn?kA8m! zRO%)2`0m*ZYSaseS8!uO(0XZ^8pF-Ck}d_9*@&$r1ytZSIiYZR{TFY`C)Bhilsmx# zgIfUsFR!R`i|b}^F7hlv!vfuAKzD{M@0)quN#d>B1!$n!fiR-pFOBSBi%Qf#JroYL zmp$?EwTF!`^eH{h1|?zWtK}K2!cbJ(a&uEz7#};#Eek_zE^Mqw3QQdR5%@0YKod)c zGGt*$@H`@9VW>oH<4a~?M!?`8%oPV=Y;_dIVkgXR`|$&X(ywgtKa7q50000Sh#<-T|LtOwu9`G3*uw_B zPo?)XjR+^DC!dCy;~KF92p84QRgrjJ4LWg`9=6 z=}SRG1qeuD`w^)C*!2BOqs;)aJ)6EG{o8!75S%!V@-MZIpt+`>aTFPH3rL~?1ERQ3i74)${6fC$k6j?UKa4;&e^`O6 z{;&es{9y#*`D5#iKeiQDf4F+M_`?;5tbO`}T!CEu5eNizL?95F1_=Z*N8H@%|N7wt Y!fz7vIUsn;00000Nks-uM6N<$g6hhO!T(g#{sT2Mk9Z;>8Mk?7N z)9jxX*`z-=Yw~&1BM3v?@n(=0hE7|~AP0gl)Sa#%2y^aU9f-nETR-xR(%J_`=gVGW zl3oWITP;!8C=6-b53o@fDo`o+C!;U}P$Lm$heQ}vrot$!g!yehegJf%qDDPNr#1ip N002ovPDHLkV1k*BoI?Nr diff --git a/graphics/pokemon/pikachu/world_cap/icon.png b/graphics/pokemon/pikachu/world_cap/icon.png index 260e29cda2c50d5fff88bc8be659e0686773dc9f..58c4ed1f4883c968117317918cdaf8f8d1165ff7 100644 GIT binary patch delta 52 zcmeywG?96Nil#!cN02WALzM~xLqjtI!_R*}`XvKHsXhb4t9S+mtLY33;`x2LB?mX^ HxiA6%k8BSq delta 21 dcmbQp{E2CT3KwH>kh>GZx^prwH~P9T0su~r2U-9C diff --git a/graphics/pokemon/pikipek/icon.png b/graphics/pokemon/pikipek/icon.png index 291e148f1a47b6c9ed66695a5221105bf64ee3d5..9a65234d8d1e732ca102b1242a157a00a5e09f78 100644 GIT binary patch delta 263 zcmV+i0r>vU0@4DI7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPeyNklaB>}52`YSOwSvJzOhD>D*o5G7 zCI&==MP~3sfI%3tEv6H|0YTNi=4=b_m%+F95ZdHf@mMK4z>TBiepW|&YNP#Y-|^IV z`|)f)Hpc1)rG>frL1|&`{m2S)_G1MknIKkO0omVn7ZC459f;rT!w0cz4S85K8dm@S N002ovPDHLkV1ieFZbAS6 delta 260 zcmV+f0sH>a0?z`F7zqRe0001qplF?uO+SCyNklO))F?P{5+(NMl}Pv1jZ)1D!Mg-Rm79CF(o40&z3z5&{}Y@ zka5SyM;dqogdi4#2!B(>D5ErJ5(`6flYlFQlK_h!9sleSv=y;L-)atyTg?^I50wK{ zIuK+Ag{IznNCshjm@UO*&`ACz%)CaTe+!cgf)BzVIkBOy`tbx~OLIUcKlu--AFbITa3qhoK|Nr0aOtOtOrhVLC z74p(Mjhga39zPktg}$B}ur9d)tvZ&O&hJ1eW>bU17_>|b=H~9zf@}~PL`CUvFBq?Z zR+Yz9J!upzTa@9F^htxOQHx5J^jQr|R-xt8pkc@c#m4fyrFM}UIG=xQn@{vugi$x| zdbX-k*XT{p>Oe|~9+?bbjLTvPt*Z=u>;)39$vNGb%{V%E16M>nCw{c-IacDF6Tf07*qoM6N<$f>z><8~^|S delta 300 zcmV+{0n`4M1N8!s7zqRe0001qplF?uO+J4C07*naR5*?0l06E-Fcg4$gGUw#4i-Fs z9>Lo$$~?}6gDj~D1G{Q-z&ZO%YxV^tu+1_vy-=^1R8JK;5F(`94OUo-&}c87&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPeoNkl;-%B&`$ocRAYi<&FV1#j?00000NkvXXu0mjf D{6=Mw delta 212 zcmV;_04x8<0-pkq7zqRe0001qplF?uO+SCCNkl=G zLZmoEaR<^2VQ4E@Lblazoxn~=7h#15+rGaDKlZ?lbLqKhE|gVHpCO4p%WFB)h|547 zdrEKMIG8sLTs{T6o4ih~5}`FRwivU=^L=E3KbmCt9QR`~Bp zV9U4#5eX=ZYUaKJcu>3Q@57XUXf56@!f>nU0ki#}w$qc!KQ#{9IlO!|vCg%j*hP#08Tip&R1c8IkNf#Q02%r5dHxST+RMW9 z{2zcsK5RFlI)FqzwD;T4$m^xwY7tCv8?8p` zUi_x_$q6)*_S%mx><#AbcHqT#ALf5-=F8a00000NkvXXu0mjfD4fFA diff --git a/graphics/pokemon/pyukumuku/icon.png b/graphics/pokemon/pyukumuku/icon.png index 2e3e04451d772fff4e0c570890856f46a63fcd5d..9ef614755858449bb7d8ded2d6a71e1e4ac84c63 100644 GIT binary patch delta 262 zcmV+h0r~!+0?`7H7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPexNkl~*B5oR7BvkdD5(L~AL0k2n0<^FNZ8h972f{`K{F%81 z_Ty1UQKEbWsxG~?d}0~!)&%PdS^}H%kzm>@KO$9oM@Ns<;71LR!H-4-Kn6c*fFwT> z0Tn=kALu{400`}ECqarI7JS$N;)j5K_)!DE34$#^Iv;j`;6nlN0_unk9|mP75dZ)H M07*qoM6N<$f^s`z?EnA( delta 214 zcmV;{04e{`0-*ws7zqRe0001qplF?uO+SCENklrRB871 zz8;)2CEXYtP&bCUZU?|!+c6&r=|6#CcmPKLGiKX5s7qa-+&ZZwqWAgSZV0bY_|ib- zH6%{ksev^}V$n7OL$o2%XO<7x`>SON;=p5$Jl+7j`U3!JJ%c0a`;q@gZH>YpDdj>@ z7$lZ`6y}-4gy_N`S&!6(K@%tn4Z@UQMtNbr!4$m@IExqN?T4uUyZZiHUUSfTc8jf4 QQ~&?~07*qoM6N<$f^|b(XaE2J diff --git a/graphics/pokemon/raichu/alolan/icon.png b/graphics/pokemon/raichu/alolan/icon.png index d005cf7e1de3978f2cf02d9ec165b6031cc2ce1c..2098d83f95f0f3ce3524dbdf689ecf7a32ccbb6e 100644 GIT binary patch delta 361 zcmV-v0ha#31hNB=7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^w5lKWrR7i>Klu-}DFbITay3qCo{{O%Apk1dGx(9tR zN@8Miw}Z0o+qO@Z$c0{c?T}iR2I%F&P>uv~r;#H-kmWX$D*C9(fq@GOI5?!8wGpN}fv2G(Ujwj9=T2w@8Wd~7 z{u{F{Nn--N>Kc&{=>0ObioT(4S$$%5;8^~J`Vs<}5)-HaCM3`ROhBL$Fc$=h?&A|+ zd;+}%n0EXaFeg8Jz;r2s55PqHcmPbyj}DjxKRRIk{CKT9EPWhQ&+L9*00000NkvXX Hu0mjfO`??< delta 505 zcmVOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0004HNklBVor(_aZB8z>Vb1pw|W78-0!o08KwRf;1b}66r2); zJtm-*Kq@BCpY9ZheDg=7I2i{y&lS0ClosU=!f06dWe& zMInD=7v>dqe{^{C(x0#&y`{y#X+Qef4tIbO1sW2Uj2%8AitP@P7rTJa&~=R#%UHuH z&I>g7xoiXE#jY#$eg=xq%~QGB&k_aKudLO>T$D#cq_vCl!WEmm)x`6>z=jNIxgU&8 vCZ_>g8IlLW4;bPkjpZbtmNotTV|)V(qwxm6?ZCGH3jhEBNkvXXu0mjfu~yS) diff --git a/graphics/pokemon/raticate/alolan/icon.png b/graphics/pokemon/raticate/alolan/icon.png index 4acd9d0404dbb87aa4a89cfc6ee291dabfa6739b..072c5ca6e449682495503884f59548b1f0c6339b 100644 GIT binary patch delta 380 zcmV-?0fYYf1H}W77&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^wBuPX;R7i>Kl);X}APhu zwR>)eg4cLDHRYD6ugE8CJ zFcZY9Hh|tQZvxt)t~LO!RyEaquFARu!N+p|9P!?wI*1ey%rVwKBDnYEc1Caj<+l;< zp!ZkhlX2|s+ltlR)Fb4!{uzHTepevXjwXRD{wM^p8fF(rA}WC(AFN#<>FkyQNeZe2 zk|b6MWKCEFvaVqhNcKF(Qy|kH>+ydGWcninl7K0Yhd*pTpcuP#DyZE1`4`;}FAwm) a_~9FZJQ;q-+ZTEO0000OV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0003VNklm&|bGF9r*vLOHbHrRZ_@TV6ZVik|VDFn&q zx~x&E&VnWK)E&m!n1PB5l{^$fk_Iwox5zJK}!}IL~LZ0_kApHFYfzaFqQe<+@E)e&_N+9Nkg+LBJ fte^K6{O|OV1ZP1_ zK>z@;j|==^1(8iZe*t1kM??UK1szBL0087kL_t(|oZXT!jsqbKMY)0X)1(_8A-BpE z=rV`dlToD$Sdl^pVP*#mR9kEjg^s6hTbO6eN1rg=iD$5cEtM6xV8|1ch!5g|EUi}p z<3ezum0&py0Kh4fTm>(HeLp<{&)fkL@K4+(*P#yC+R~%-e@u*cV+DpD!X;HJ%9Q8j z<)HzSDciFQPfpgxbpZF(4_l&~9@E;=bpn*lm!3ZgLz?>)Mp(%%Ooo2UE{rU!C7Uok z*o7h2z#)vZriU;MRAJh0AHp<&sxS%;VLCsGFp)dci!jBHNtpXO3RC>>|L4aWOhlB8 UY<|z-000002uVdwM6N<$g3S?+c>n+a diff --git a/graphics/pokemon/ribombee/icon.png b/graphics/pokemon/ribombee/icon.png index 10117f123441f15ea5586e2bd0dee87156d8ad26..46f0ba787cdab87a38084c411f0d3053608ec3e7 100644 GIT binary patch delta 355 zcmV-p0i6DT1FZv)7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPc%Nkl=oESquGNzeN$>e`Hfs~x7BoyGU zqL{C;S}Cdnev2;_{v!+YDtu$hO*7pRvpv@fOo6Z{@WgLp;fLAzzXG_~bS@AV1csBj z6HOo+)aehWK<fuu$QJnsZKxBTmLl;O^L-66f1)`_D5(o}~ zKntY%!P*>@K)N29KzJijCdYo|{Zm0K6!0g3ya1w36LR`MeAxg1002ovPDHLkV1fm| Bkskm6 delta 310 zcmV-60m=TY1AqgN7zqRe0001qplF?uO+SANNklb>!3`KPV-XRz8z`^L0 z+ZdVBL4(Jxo!p^Iwb*xSfTmt#Ap)9qF-zNtD9J#VEU7j=&|eh&l)A42S>;adZ{RYZ zXm~Fs9yS^Qa~!*hjNgCY{~!p zN1Ntgu8!kh&x!gw7r7GcU-z#>ff6f$RFFwujBIfgrU zj9HlIH7j9=g&87Y*pJ3^qXOzW@LL diff --git a/graphics/pokemon/rockruff/icon.png b/graphics/pokemon/rockruff/icon.png index 5df839ab5d32af10d7df0c2a2a1b2ae3beb99ca2..6a7816898e6d9b431a01352471866dedcda5478f 100644 GIT binary patch delta 332 zcmV-S0ki(@0+s`i7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfhNklI zx>(4|g}v*W^`Sqy zK)64;K)62!fpCAE1w#CB5D4?fC=lk4Q6SVGqd=HHjsl?pqd@47_jdwW`{5P8_Jgkm e?931R@B}l}65)!Y3iJ#B0000?63+p2(Xbc5%Afw011GOMcjFhmn6H zzOv7{(QT{{=j_xdO$@*pgE9ePEIy=u0lkskX~zJXTH9L+>U)735?~xzNHTS3mU95BE+#egMiJr4kT=Kuzxe0000NCPu5QbM$1!Xa`%(hx#-3P#0 znDg6Ha0NW)B_g0TEE_{w2mL1Wtw>J{=q0Tgl=i(#b0qF z^Q1gMAieimAa0maAi&)M!4H9`AGSb{2xPC){E!L6A@f5ifE)bq0XBpXO;=rgr2qf` M07*qoM6N<$f>hsWod5s; delta 227 zcmV<90383(0uWtko;O7RtPv09+LKX@$ivS;V zMfV7-DQhhwPM5}1DR>#Vvy5FWOOR`$Lq`PtbPEAG#SZ3)B(UfHait>uf{KS@AplP} zrMQS2fQ?mZ5CQP$IK3a%c1{6ifj^(`2-93LVa6^KhRtqao|!P%1Yrgt40!MOo%*o0 dnGZYs_y8_lilt=pP167X002ovPDHLkV1j{*UJd{N diff --git a/graphics/pokemon/salandit/icon.png b/graphics/pokemon/salandit/icon.png index e0c6309c75446da9653a1146c2af91ca572646cc..37fe8d7e755ee81a58a483e9e73831236dfe841a 100644 GIT binary patch delta 278 zcmV+x0qOp*0^tIX7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPe>NklZEr9-4* z7NUEctyo-ZPpw+G)AfcR05X_C^dev;cuxSd7gg6K1Ey~s(F=pkP3$-k1Z)5eAoqY9 z7}rlPDTeR~R0WmpJsN~XsJNnCm*RUjfM|bef(8K)DOSRZHcZH!tt?hnF>a$GeBs3| z53SC%r~a*ek{|I_2Z#eG10VtfVFO9T9w4Jlw)h5!{}WR{90J7j++no5=?9nIhAZ0Ex6pMyG0uj=K(N5idx^r(rP6tEARl7BqOfK&5!+jD5g;+ z9RQ74J~!awhW@)oJy5=ZUYO7YJ0C(A52^6*KJpai5t9y Q>i_@%07*qoM6N<$g0riI5dZ)H delta 262 zcmV+h0r~!k1JMGI7zqRe0001qplF?uO+SC!NklhHZ2$lO M07*qoM6N<$g3ujz(EtDd diff --git a/graphics/pokemon/sandshrew/alolan/icon.png b/graphics/pokemon/sandshrew/alolan/icon.png index a1cc049bdb95d2e5cbaf2f4ef86a14cd92be2b8b..ae93de08b63dd5ce969e51ac122ba2a28f7eb5c3 100644 GIT binary patch delta 298 zcmV+_0oDGg1N8!s7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dq02FNkl9oI`WLV5bCR0SB$GK{vrwz`{EQ?E??r8FM8Xp!8A#4`$Dq zkOFj91zZeW%$=xA5>k-VJQpRJLWmgZ6^@UPFTx8$;h|tgn^DM&j|^(UN@g=@R2OOJ z_o)&}PAToGL>OkQdCwlCo-%iO@#;D6SXa>1d2o09qk$~EgMo1U{fmJ#_AndB!5$U^ w!SVag2GV^0$v|3vC delta 350 zcmV-k0ipi&0;vO#7-Iwj0001qplF={000McNliru;|mWJI1poUFV6q~02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(8iZe*t1kM??UK1szBL007NNL_t(|oaK_g4uc>Nhj{~rzCqnxZgC*+ za9tRTJ`{_?Mc+YJgQhMHrdJ0J(YZ;}^tbVa+#mRa`0dO@r?c!7(42x2o8kn(DN`q8 zv)0vBcYxLIX>k@Z+*+Za64fM@05<4MIbusL0EuR)5Lz^`a0}@Eq20)JEVKxRV w4Ew^uxTr%A2BQu^n8XkAna1JbhySi0Zyt!1sk7#e*#H0l07*qoM6N<$g1+&Nf&c&j diff --git a/graphics/pokemon/sandslash/alolan/icon.png b/graphics/pokemon/sandslash/alolan/icon.png index 88cea6049b4e046380e320f632546c7f4e11b2e0..9df450d1ed8594ced07983bb93326f457e1c9771 100644 GIT binary patch delta 389 zcmV;00eb$71kMAH7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^wElET{R7i>KRMC!vAPj`^0txN>|KIMktY$&o1riD&Q|1khOp6+m3B;K0)^;FXduW^ReTNPFB-^P=V>5v z8pt&M3By3#A5u7o&;La<{--~r91dbTe+hrc!$IcxKm0>NK^VZ&MvN1J(;)8WKMjky j$HPIM`~kR}gdgJtKvf|_f!U?`00000NkvXXu0mjfP2#Ag delta 451 zcmV;!0X+WB1B?Wa7-Iwj0001qplF={000McNliru;|mWJI0BH%UWWhx02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0003nNkl(wB_8^Qbwn9xj8=c#HnZI9tg#2n??dEXj3UGX> z2~H_Fu96y`zl08#G{N=#B=nLd)oLc}CDRo>pqT=KOU)&ff3&bd#&|}Vre-zlo*uYn zRkpQTIp<wW~yz>;(&64WJ+7^_3R52#Ewj;$dmP*>0q>Z9j2`!m@=3Har2`-c} z9yE&@yqjH?t9-l+t^xv!@>+?!7%LzMNcUR$N|+9)5j+vb`C;y8AI7?vd)WG2?zoEB zmfw9x@;Bn&RRe?O!xJ!XCt$iy97wMby~};7l)+)-<4kcq0W|P&5ei|pHqAhk&|z%( tKp4Ei(s%hF15%EO5Z=0c0OC)4d;snv9Q(uu6kh-U002ovPDHLkV1mMjyUYLp diff --git a/graphics/pokemon/sandygast/icon.png b/graphics/pokemon/sandygast/icon.png index 46167f5ab661db2326084af91487bedddfb6f49c..b4028109422aefa46d0294b31e77ff14c7b9af51 100644 GIT binary patch delta 289 zcmV++0p9+;0_*~i7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf1Nklf7_|a+LHRSi_wd1 z-W1~D)3o$#+piW^{Zo>tDCmw+JLAra(f2Oo3#6Xpv%UY$6cV10Mpp&Uo3){_S`CfQ27S5S1VB nn(+}ooFUf_lYz<)Hw)qki(?m%4j+kK00000NkvXXu0mjfHq&=1 delta 243 zcmV8Y_v(xTvd^4!Fqk`;*A)x*yM^*5>jNTost_Dln@=ygk|g9GZP2 z6MP+T{b*ajJ@#+R6k)jni^nqnR6ul|8GEY%5+FF9GN1$kMw`zjNS%a$kXs_sPOin t$fem2S0X3;*ihw%NyZG?5B*b5&kI6)!EJILzIp%v002ovPDHLkV1n|+YpnnP diff --git a/graphics/pokemon/shiinotic/icon.png b/graphics/pokemon/shiinotic/icon.png index 510d61a97c21ff983ab9a6aaaca91ee8a17781b0..68adb4ff3449e49656b06fc5561cbb90e9884b12 100644 GIT binary patch delta 307 zcmV-30nGm20{#M!7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfJNkl0z%}6B>eDyqtFzW`qN}Q1_mkGp$bMh8zx>96xHN?*{XA@YsyQ}5(-w; zh0t&=rHB@t8@@#re6)U|HGtXA5gEol23)8bowVI5Tc%Um_i>r=)%n5S+{#-Z&nb}B zA4!8aztsMg!x;o*b z7zbt3bm7=cSeUMX5C$N4 z5|<-rU<&}-!x-pJ0b&qC#PIGM5)fG*kkD6H_CP#(-h;q|?#@KWY?y&^!Ucvn0)u}j zL&R(VjF|#aW##i_%oghUY#o{Dx%anK9xc7VE{}40rPjwqex>^;(v#ZIh&iR|vLc{C zJk)fF-Oftpeb*ZAT`m*+Nd1*CmDXnp*zAoTnkd9}&X0)9Y~T9PQibk*?CDtNhi}N| be%t`p+O)T9Npnm90000!3k9P1Cjt zkiaIf4b8H=yZ|1&l&~rfUJ6)B=>m%pG4NjyU+CeyAM*si-07*qoM6N<$ Ef-wn=)Bpeg delta 308 zcmV-40n7fd1O5V#7zqRe0001qplF?uO+SALNklb>!4Ac+!2YI&vbITw- zu|p?GASYk2s~i8;HyYe7A_P!U+v_l_0g) zP$(YI9?_#Mgu9ESuXZr>nnFdWPv_dovJls{wkSAV-QlowLURx}Y+a~{#+rWJ3A}#_ zlMhDwxMUbsB9qg!giFIS5eshQ4w%l*)zD?#c#LV-eh`y(#xn1ON^*K2n$BGz2=n{v zG{o(P2EBcIfjvMrXhczN6@g)*JrG#*K@Kbl83n+!6Fl-L;A10Tys23f#ljKhn}Ygl z^H{%Z(XjgA{P)6K{IM_>`cjzuhlL>Fsvm1%4*lR??Z*SkdJV28wLQrI0000P zDfVJglzYv^q|Lo4oMK{HK|w+3M6_Q300C-AL_t(YiRF~rj(@`-3`8S2mVk%x|Nrfd z4N1za-M4DBs8N*8U>gJHIKD8D85`F}ha1qD77eFjB3sfRD+nhd^-t42Dgiy}nSZm?g^D%rzR^}IxN8C@4t z<&iO1O)5~7Q(NQI}--qE`0%}|ATlKwm#?qDOmJdLf? z@kj~6QL`JZ$1vD0__3nLUoswDZiz;0Z#Sz>lOe?!^LFxl9~Ni7{m1Ovdr@nhvk!@; z@ z_LM1$d;ele&F*uY|Foo}#s6xooMK{HK|w)TsgPs<00C%8L_t(Ijm46^Zi6rofc*w1 z#Ly+8&wx(d5U4}eWMVZBQFU#ft;&kRGa%QSbvPny5w0~KE{52 zz^oz-U12{{$hzY4^3GVNN6;C33(*Gs(F2hROa{{+=yI#0 zMCP0XV&<9v?teap@Pw%!ql|GlNh}xoP9jOhs)URRO&ghvNjUqyZak^qgXMa(UeB z>0ZERed^5(!~WuYD-83q%)&r1f>{{wOvT|{-rPuEQJ}s zN*HI*LKwCc#{7>kcR!pki}m*8gjxGxh1vSCUjJ|W_ySDjFb^90cM|{r002ovPDHLk FV1gt%+Oq%v diff --git a/graphics/pokemon/stakataka/icon.png b/graphics/pokemon/stakataka/icon.png index ad79ba34d88888a4256003b021bb7f0883e9ecb5..359b1a248cc5fe8daacebda3efcab774489080d5 100644 GIT binary patch delta 382 zcmV-^0fGLM1IPoA7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPd7NklS>Agcy z)KoB@31BGY%LcW#Q6Z8CjJjKEqNcA66H#Wam5G>F3`k8Z>ZWfYrRoSUlQZb)TJ^`o zh-LtDx+Onl1QdukxhX}EMg`|kuk&aqP;(wip`NQ#_X7g_Rr~R;x|GFQ_I{r8Nq0HldyB~(xeAo}e_&@Fk c`gi-`1x4c~NLP)-=l}o!07*qoM6N<$g0+LBu>b%7 delta 330 zcmV-Q0k!_f1C#@h7zqRe0001qplF?uO+SAhNklb>!3`KPVL7oj6rq@7& zbHbdUH^^aoE=Y;QS>UUi1J>3e zr3GlPx5u=Uq!bNRbUDc|NO8Jw=jc+43*VzKHi{={N)4+JzhpcQvPBm?wMjkF76M4N zJ}2Mo)s$e2 z156^q%HATcNZygP{#^mk$%U{MQhy(WjLC)42{66Y|8e1XS0Ph_e6>K#ALjxwJ?sVY zO1M9E0y$2Bg7zqRe0001qplF?uO+SD1Nklv}P2uqc>d?$Nq-8+zZ?zMYzH`0KKjM(|Ku( z>Vapb z!~s7nQd%F!*3%*vzF`mr7t2sMCgh`JwoFHHKOKmEmicmZK&5movR R_%8qe002ovPDHLkV1iGBXu1FZ delta 215 zcmV;|04V>~0-^$t7zqRe0001qplF?uO+SCFNkli7&Apkg*v66O_!)QcL}}C55?c#uj|e|S*$??0WjoTGw7{n8{l9tI7EKF zuE&mEz;22;4d!N@jhAmMY)EsC=h%vCbQCS3{ zK8B@a5tboQ_fC>;lRF>+jO<8lqlkLMAR}TH>9f&wryL!MA!tBG(58O__+v*p0#Uxy z6{6OEqpt?N1gLIyN{x}t%NPdGA-!bZfo`Y6ZByhwW4~>lBeEcZLj3O~V12sZiq+L* zw@r5GeU;z=9g;IB*om0U;fmHyZQuw{>rL~7V4>}P*BcY<69$XXo2F9aBOeyAk7 z5b~u_#?xI&uaE|lA$}GCZ}wz(1B|K3r6Yq#7Eu0D|Fdoeb8V!8QZQannS#+77*I_H z#tTZp!1D@*^SFWuJa#Zq&^7US1{a^e|3ds7!t|I4Pbr%ja$Z=+ImcT00000NkvXXu0mjfq#%-2 diff --git a/graphics/pokemon/tapu_fini/icon.png b/graphics/pokemon/tapu_fini/icon.png index fcd74bbd199c3d5e61ad0d935bb241a4d2513ed8..623e1d428781d2c189ac9ab4b768a8581ad0a7ef 100644 GIT binary patch delta 419 zcmV;U0bKs@0P zDfVJglzYv^q|Lo4oMK{HK|w+3M6_Q3009t5L_t(YiS3lZj(@{22t-pXPL`Pe|J!A- zH%V)-wCbU%w45T%GX`SjI6e^o_ImGqN4Rdb0jTR6x&x*g04y-AAUX?~u@b!bl+zr5 z^((B&dW$1w^Srfm5G2fHY1Wc5qC*ou-I{}GtH1+7#HwLKAb!>pNl}Cvfd{Y3YEX58 zqE@ z_LM1$d;ele&F*uY|Foo}#s6xooMK{HK|w)TsgPs<008?*L_t(Ijm?rlj>8}fMSBB_ zIe;Ve02y_<=l%;ToB_H;Kd`UDKr|&L+mWiW^OyfK;D5RNK_pF+;; zQ0eP`wrjxm?UT5?XS;Wl)WB0JFX|3{@3wyd)3@3_yXHZCf1 z7RceAiMyjzi@L88JZC?W=M;EKrCIEj= z4jO5h+rj6t&TS_M6S&Cj=yR3ZQNmZbopJrn?La_%1=et#R=z(E!DG7P5!o}YbZ;4d aINfi@bQ*j+!2m7!|9(MPQirkUciR18z>+6g3f=C-$3_v^p&-F<}oVi6!sv0H&8MpDl~D+*|vNGb_+!jPynpBf~pBFfe2xQ#YUJQ;rg zQ&i58=KMHyCk2o|=6a+Xemopc0|1;I#N<3>;xmGE0q4KzhR32oUi7QWw6qmz*I|@5 ztIKe-FGVVlm#coBb`bn)k5T!^XF-dUu||Q&=GlcYyWM``@gkrky1_S*%@uB`LsLio z#l{2H7~H3pV{k(2rZu?>b1(ct{5yR8GyloBXX)VhgQV3WIQ|MMl`Iy^|JibdVi7EV zOf2fF!}9;`^FF!uu>5tB=GEHh$fVdWz=PyG}C0000srKE0llN? zA#~p$sv^57M;z`}bc{oQXZ9VS5KUfDR`r}wT+|>N*E>uCk2ag(Yl*KAIvnmA2qG#( z-R>lmBF@`(=rmOEgm-hT!FwZ&fBPQ$V2S0?&{mGy+Vv1`E-{OFK2mn{t9*P sJ37_9i*QVJZ!^rR;C??8lk%}W0R;3In4+}uk^lez07*qoM6N<$f{9S8(EtDd delta 322 zcmV-I0log%1B?TZ7zqRe0001qplF?uO+SAZNklIpJZ=7X+SYp|M>$nTF$24Mj zNPw76L)_!6Y=$Tz%4u!~m;gF7KpkCTU#Ge@eITo;&M1{9f*$ktH|}Wk;IaWI?(csc zz0d_~1W>vbJXOkgFl))x6NgKSDrb7WcWkp4B~qXdO4CCC>y%627=ZYw0p@62YEB%3 zY=uHJ{uZg3b@GOe$z@5o-T7bDH%sTXrQ06R1yPITY7u_T*3!&O<5dOORx%B%2g3HV zCKzu&vz-OipFxb^OG74>O#rDF;6N@fGO-WY{)+v??#+IjxY@_<(_yy{;^+JE1yT#r UbRs1Yr2qf`07*qoM6N<$f;Tmj{{R30 diff --git a/graphics/pokemon/togedemaru/icon.png b/graphics/pokemon/togedemaru/icon.png index 2ccf7d60d5f093d17cdfaba4404ac90687291f27..8aab8878818484ea3636cabe2d551c62bf11cb85 100644 GIT binary patch delta 281 zcmV+!0p|X|0^|aa7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPe^NklBy)J;L_oJuK; zAiiiKS;9;ycYHJetn;;Lfd8Vk6;NTe%rmT}0LI-=JDEK1tX-Ke`3P`lX&$OQjyz96 zpu0z2jEKe_WH@48A_{OrBy7tFM1ue}0rY6WTc|ZyAY8>G9|O#FekNH8u)@d^(VJqB zSwEGlmvqN}#9I`on}_Uj7gQIr$?c&i+XK@aB&cc>2RF_rvsu^uzSW f!Vg0Zzv+h^JVpxYwcooM00000NkvXXu0mjfW{7mW delta 245 zcmVA>07zqRe0001qplF?uO+SCjNklylyK zkWdEYk4mX!po(cUDO9uR%%}BVp9<Kl*3`$!ju8bN< zTsS?`7kZB4w+@fbHlFz4dO@7P7U7&2m6huSEhzw~B6UExWC%_Pm5@&$IY7b{C!mDO zfGTI!sAeL007)QcHnD`6+xsm?+ZfR^AYXA)VrF2N0u2DT6zN6tt$=@IAnmSD17t+l z5#;1dnt-&Bn{muRta0rnyfx-A24I&k5wxJ(Nu@AF(OChlWV;+)6kUeCZ1*rrP%m#5 zx%AK{*lCg5bAPhkD2OL8>##=ro zce!i2cd<8TsbZ9tHn1Dj(y=73PoE##W0K?%5hIWf)+A&H+yET7y zuTSI?7;3BE_S))`v_}1AwQG#6a<};Y!p9zSGsM?;w*WADXPPc|tX`e@qILm393JL( zTuNFDs$K%m%~8%(?REL9bUs2E6yO=+eqpjPNtkR*5+)mygn=ltOTvJBn+OBxh*=n! vLl#Dq`cq+wVc!yF{2@%~2MhC$etZ=Jbr8xXViba&00000NkvXXu0mjf+uw!2 diff --git a/graphics/pokemon/toucannon/icon.png b/graphics/pokemon/toucannon/icon.png index 349c723761ca372b00fad39121227ac0c616277a..ba9740d2983b0386ca69a1fa7c7b47478170087e 100644 GIT binary patch delta 346 zcmV-g0j2(&1Ed3x7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPcuNklU|1Dpep7zqRe0001qplF?uO+SApNkl*AO%K1QxzE5W%^Q;QlDyP?mv2u2E72$_j>H*@%K+KFog2iOhR<;~?q-hFv`5 zC$~|y>`PPp)5VsvTDj3A?E%$*uGnAS=F zGz8zPCjl&&UM&T1zKsU5$w3Y{0&+e-lYzJwi|7XFk8@cOW%e(bYzCOvw*t(2J{ZeV k0XxoJ7yXfU?HB&|03N%##^G1}0000007*qoM6N<$f*q@yvj6}9 diff --git a/graphics/pokemon/toxapex/icon.png b/graphics/pokemon/toxapex/icon.png index 5de471d4f382f23288ba0c772d406bdf48fb078d..eed4abe4f4d529250a591d6d9b6c3f17c01f0d95 100644 GIT binary patch delta 419 zcmV;U0bKsR1MLHl7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPdiNklE}O9glM#8X!6GT02zFq=q)NhT@VpN{Uk`s{PUO7R zD5n>OQW%7G7_A1w)0x2D5o{kGj;9etk!yGl_{a@_R~z~N?bq1wRgZ>Y1aKDL2+k@2 zeH=&L8r5X_5F&o7c8g;Lr1@S1ghv01fY=S@vI@xM?zn(RyY-uZ-1MO(@C=RU^`Rbq zOV#VcUcvKs`XF*ti1dL;8boo3^Z_1XP(i2<_I-t-zoP^4iTa^Fd;>M79lLAj#RdQX N002ovPDHLkV1jOmw#EPe delta 372 zcmV-)0gL|a1HJ>07zqRe0001qplF?uO+SB0Nklk%2Zc2SKU5c^{d!j0$_neqIQXSpc3zF6LXOEs09x3+I1v zAU0(s7YuhKYIfm6+t!lNsOmkA9j!_l6egQMnAX-6KMTtk|U-o>jx}NlQd-g0O}%g$K|td)sJ5-82w`L SAkO6g0000UBF$%lO|A=T798M7iJQsicOtWz|7RQ z>SP48W`K@^RjXL9{37#0a!%kAdkWJoZ$ageEaw%a`xT zqb!I2SE}#6ryIH2*yr4P9)SE7Kqi8G0c0k~CqO7cE`V^tTma!wUlndVX2}0000*>~v8! zCFR&>WsofbSbTk#_Kl*^8TFbqX2;>b}J_x}IijxSIRBOG@# zi>j&xEXcu+D4fUR1A`IeI)RQPCNm$ z2E#H1FouY<4Mq!F8}6<~(@EG`^LSudIx68oaKL7sfd=0Ts6;|A-lBg17=<+i7DRkM z;X{BnBIrATwnYJtt)kN13AQapgeKVwCT#>Dh)2n6GgW2dnK0W4*PP{v3!*%;k@y90 z9L;b1Lwp5ttiKQlN`VlyK%|FKAhcQ_^2aHV+z*lD}%hFc63D4elX2WGq;F zyr_!?WvN#CAvy>;IAb#TDFlTMeJLp@WH6>t31o=k)I|U0Qra5?`uLqr93Q}MmiPG` z_uZI-x7QSm;4^?NJ{#Ib@Fgz0Mu;&1LNvp!&46C=2vCS&OUzU3@x#ML8k)>Gk~M!h zun5qSx@SoOxs=AxRRE6K450eh_Z_F9$1%I@U(A86!V{IWx;`^?kNAoVq(&70e3FWc z;Nlq6i^u6qKGMlGWOcInN&!y=0EGWie?*w36h`O5pe}@Qr7*4#2I)M{O7>pi+XJH^&#9Z3*T zfxWL8^s(-6hHa;bRKLfJFh&UV|Lq!7U%my8pTzN|`0vi&Cx|~0D%46!afFc~T1s5^2&% z$)xQ|0$xFYtAYg-q~A2qf(M*$N+kybyvCXu5D?E`ah!soNqg*F&gYZwBE(;g6J5MQ zH@Ip6RG95!U?h|)7ZK=;8Rn6SYtM+c_{>0OidDOjiDpIz)$99qCP39|lRQm;>wteg zsKzV)Tw>F^GP&jefJ{_^bm8F3t_>p+1zR9BdZY-9vC&HMu6zy}Y+6~)fN+S7G&#>k zN23_2PJ`&t81JMEfK5kTC#Z{{;k|29G^gmn4x8rW;#aq6zX(Ct4i>w3SpRe2!JC6> zShyeVxQYR2&zamu$UulIjQRk+Q>cF;1^`hWWhVy5E$ILZ?#N$n69JqUF1gO?ZHUtO ztcm$$YOa;0HaV5I2>@9tgE>_}({6l}xC=o6A5EQ@;yN*G!s>G!0dPlk@L|vW07mx3 z40RB_R^G`aFub#teW#kB;k}b@Vbl-NOI<9+}_JbWraDO?#)*#N^I}W-G>ZWIH6S99DyKNRojd}In zPFAp~t_`@pU4f8@_?UMBXbrM4KoaRXz^jgn3?L2=NWT!^I8DT|pm2c)zI0s11k4u20{Kz-~a?Xz;K;HRr7a;HacnT06^f^HMivd#S!y!QK@*(Oc^Wg;p W2OsiS4*@U$0000XR?uGhISQ(ER;Zt04Xz?xE#x}IgrmkU(0D-ZVWLt-=Cn> z;e$EquEEDfMe5%)J`OHd!Kt?fmLh1cy*0n90R7or%uz=)!R74gp;nhZxtCIP|6g|h z+buNB*o~W)YdlDZWbut-B4(+Uh2ga(MZ0*o=nWD^A#AQhG^Fbab73e3o|14iBhMmK!i ffqCIW|CEm_YX218T+hZQ00000NkvXXu0mjfCy1#? diff --git a/graphics/pokemon/vikavolt/icon.png b/graphics/pokemon/vikavolt/icon.png index 7a8f2cff4d463c8196e0e69c5c8d578431abb683..eff23d50aad95e19a8cc82e70f405ac95f7a8e26 100644 GIT binary patch delta 370 zcmV-&0ge8s1H1!}7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPc`Nkl-7;|o|DH1gUD?oloq(#l39k&#@lN=oVJ*k&!r>p;JyI{W?P?j{`mg?g_c^`7 zyR}Yln8Czb3Ywu^;jP3m-W>S;z9t>Yuk1bOop=XuE_g>J2HyUSwkx5@Cf=G8 zYXzrMcyE*M4Y+Gr?Z^!?S6Xj9R&R5%QxTq7eN2ZR#7zqRe0001qplF?uO+SA#Nkl@S!n_{RpLW z4TU~I9wTp1Z-s8o(vYR(7U^NSiu4syvP2M05(&kEV$~^?WP2~9+WwC_aol%V_Rk)e z5oksLHZ9QrEKf5@y*~Y-Eh}9DxvN*qVFEyhrA85=_bu|JLb3Y=78Rl*{0ac33VDA) zdUhXrET>yV`nZkYwW<{AJXScdAjX)X_=joNrT1|PD*#KAa&|WE!N5%#a}MjWzY%Ae za|%PBkrV>sqfg3XUvOK@xG~T8Er#nn`-W& zT$pyY4;+(i+Xc>*kO4q}_(61f3${vOO8WwdWCXaVo)Gmu04qKpFZx>w9VQ#-hxufv w|7@~Of7$?u$&dbc58WYL^!M&z^5^=$0eZ`})5!X-RR91007*qoM6N<$g1wud+5i9m diff --git a/graphics/pokemon/vivillon/archipelago/icon.png b/graphics/pokemon/vivillon/archipelago/icon.png index 5dfb32bb60205ae00a3eda6e4e1b63b6acc52768..82d27575895b4d636ab3622e5f0f96dc1af4e86a 100644 GIT binary patch delta 430 zcmV;f0a5;|1os1w7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^wR!KxbR7i>Kl-rKOAPhufEb)Tk`TxJ&u_2o#82Y|i zSE^d(#Fqeb9Dgc+uK<=@Xi%468G#T(LA7OyV*_030jYw=QxC!csTgv#XR-%CxxN9H z9SB`(mACFS(E+scJZIg6A0vQPtBT00K#>U7o5+*`h1rb>43t~bcaMK?&D6ieGkClJ zE-2Ire-KHAv{G22Sc{kePD!MAAqzd(RbaG0X0c^p74LvU~bF zpGO=#BqNL_I~3cN_BgWaE&u=k delta 482 zcmV<80UiGL1FHm(7-Iwj0001qplF={000McNliruOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0003`Nkl_5h(k zO2?+aq9c0vL9~czB7gqpx8@OmKMVN*ETCOZC@@;! zpu*AmYd0hbDF6h-``sn`5*G2r19W5;peldXGe8e4jGAU6e-u#`pWbExaGo1G>CKXH zlVvMZ^!9#DIez4nPo&D`3b>_BONwYVbTE&JbhY=l*aWbjCL04%r-$7#1@5Wq%S!0V#!V~-sh6K{tI7N$&o5a|jX13qxesRApE!FfNvwGDoY YFUBe3O~c!G@c;k-07*qoM6N<$g4_DR$p8QV diff --git a/graphics/pokemon/vivillon/continental/icon.png b/graphics/pokemon/vivillon/continental/icon.png index 482c27febab09c9c2b93df33109cee4cc7bc414c..725b181c8a464b1646ff91a10cebeb80697a05a7 100644 GIT binary patch delta 435 zcmV;k0Zjh!1N;M!7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrTS-JgR7i>KR6&k}Fbsntm4-w7|KF~Y!otv`b6;&o z8VPJ1H)*{re`*0=2}pU4p%?^>7;w-LR81w83E@H)v|91;)d%BA0JT2FPC|16;rb>R zY=rK_;I|vtasou^KH|Farz8+RC{bSp%IeE;)nk8IV5?SsPYp#$%BMj5c{+o!j zVH0$)>V{2=QlSk3#wdj)45vas;4Voi+Q@P|m@05u(6LFsdtoE2#GVY*jnL#?lVee= z2=+a&*uRG#JS4cEIV1VlLXW4)e0{_J*KGBC$a}~cS4;;4yQ@86GDb1RWKJ$2g8O-N z0ba@L{g7nlk|o-4z8`af$_W%`Xvhe5AFi!JhC}ZXJwZHRf^=c49tkpD8{m;3ahN_5 zuwHtCNUU(qoaw@RNwUGZWC>D(UEUlslEsTv=?Ri0)Y6M!ngJb~ do~;~9)(_x<8oSZW2B`o5002ovPDHLkV1lZ19BslN& zIs&l7#Y4#H1!QR`HU2T5?#Q!(H;q-#Ib7@=7DVqSWLzTAbhWnS~7TJt1 zUIJ!X6RPUTd!Y=VKA$NDsJ{x2^A@Klu?euAPhtkA|+Tz%>8fMv7Mv|82Z0j zSE|&`!^VJTS^iW2KLHFm(~wj`jR=@%3UVE$SSG-wE|4sEt$Gm(NX99b`cC!&D3=yc zSpn1KDAMX$6An<%x!3E;PZdkE?;_F^NUMeGhqNhpR4dmr2X*eWs{w!2>ZadvMFTLw zhOH(Cf+lN9EOF`qz%GeUCuMqYt3;@4@!BoFd#PR`mzc1Pm>vT>4EBkf+aB-ru!o1B zg>#b**|mjxJhRN>m;N8KaDNz|A@8_gdO^@xb%z-diN-Kd%tU7*klbPSfa zEvAqjq>#HLeKG-A^ImEK@?5&ab_aVL)0;m_7SjJ)h(8PW1CRh(PT+(g!66F_`RjkP zP6|>WKmas{YxOk2IM6;MrP=0m@6`X;Fd4y6?4^f`3MnWf|E;7I0ODy^gF4n4d7;1mODoeqBBV zz+B*n{58QK_0TpO*;}81%>n`yHJ312WERB-~ QRR91007*qoM6N<$f;=*|>i_@% diff --git a/graphics/pokemon/vivillon/fancy/icon.png b/graphics/pokemon/vivillon/fancy/icon.png index 2e75d4c340b77daca405b960d15da3486ec0b71d..1fa55125e6b2a38432aaf503a37b28090af007b9 100644 GIT binary patch delta 452 zcmV;#0XzPN1dIfb7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrYe_^wR7i>KRNJn@APnm$2vmvq|NnMQfOX}z_oG9l zYO9SC65`|dQw#V>z>;SeoI;Qp0|pv`AWMm3Lue@R;PKe?U?{-{R5-{}>_H$LdV<0S zDjs6+J+3iP2uSgYBQ7sKLIP3>aS(ue*)lxF+^4`&y||wmkQh_Ga!-FyOiq2rM2XCw z9f1NTPH_~V#Ce^44&od)ITK)(=j4>65GRXxm~|DXDToZ)KWAYfq6#dUYKf%i*^&9R za2kXS^J62*e%Qss*vOV-Az9m|IaZbZ`i1|m-75aDt|5Euv2Bo!oG%WuVmKYjO`mLP zQ^Ng!%mN(A_I+?N%`$%k4t@O&KTMT)Pk{@ucx8X5p_7twJ1Wv}=~W^X2hozv+=ZpO z9poCv2KaIiDom&5;~;r9cldIUNd&7+bC8t#GSmpSgUkrE=R!R8?sOjn<{*BWL*tl( utOyKH9AxECM+t(h2NZ03x7OHVy#W9Z8W=m_Lx=zX002ovPDBK*LSTZ*y}`Kv delta 446 zcmV;v0YUzZ1cn5V7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu_GnM5Jm;e9)X-PyuR5;7clf6y?K@i9H4JP*jOXLBL-r{Vag+ho{$4g+K zvLjrBJO#1xX_N=Jda24B%%CINWw3(>GG)olw*=t+2R=+5N+R!YC5}2njA%p@hr=(Z53U#E8NXf*Re)E zdqBTGg*VwKbwgs*-c5!cfDX2XU37ndq>^>&56vLZ(jPp@vrPc||7JEEUJ#W!Y)k8| z3IM46IBZq#Z&$%Bk~pr61VpnY?2Q-33w;Z^+38>|HMIbjpM{Th3skQ1T(EeRto*xc~qF07*qoM6N<$f*|O><^TWy diff --git a/graphics/pokemon/vivillon/garden/icon.png b/graphics/pokemon/vivillon/garden/icon.png index bcf56d0ef4f9150bb9e4d9a5de2c85571187ca05..e487901f95815cc4a0ca38a5100fdf96e4d2f187 100644 GIT binary patch delta 425 zcmV;a0apI#1M&lq7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrQAtEWR7i>KRNJn@APj3MRO&9N2?u8VkSUZR6g;0OZoolgaw`iMiu7_Vd zba20OBKfg}HGWmb@eBWtQB;5E_fQuJ!vm@#w+$o+k})_Zmna3-|F#NnB#-Znlc`Fk zII}cHB?5;9dU^zD99wDSe7EKy+#SRXCU6(F>gFKr*iid&kl0Lb4iXL~ZVs}C1iKt0 zR!}e9L5fTwt|3IFbv222D-dJdgKAZ8^#xANtR$#lX79Ep2}pl| z0tJB0CHi7~0bq$^02UVj9{4m!X07ayp<4w?@?7)OAubU&S+;@heqVowoZoZGCwyCh z^tA1D_lUTF?D#Q^ScR%XNoCtbRoqZ$>e@PV?5M7Y;{MKr-9sIQq@);e9|1Vf<~ii_ z0-o8{@z6X1$MN8WuQmbd|C`@%dO?4pUD}pk+6)^ZF8zY0(57DP9FZ`2g-N1wASip7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^wPf0{UR7i>Kl);X}FbG70qxfQl`TxJ&0ViE22KT;N zDphIc83?v#+x}DlUjd|?YbYi`BLXhE0?{fR$O`pjg0Oj@uOg6xE z%JSB&COUvt=k=U`@S_BLz0~?DP{hM^5$1TN;HZS_nFC#Z*MMod+qZvM1}pIbm|(}Q zg%3o6m()^NqG-eVs$11u%FywIFoC;pRD*-eW(f=q5}WDZAVC7Z*&hd~A)teU z#DHE7(p0k^YIl%!B;H_CatApR_i)A<$?V0dbO*^CYU@R?^nk7{&sMG_@dHPf8IDq+ RatiOV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);0003$Nklx8-kSuR36Z3un>i9k}Q+ajjxu;zLAXDeq4W@J~Y@Fe`zrg(PawtQB)V=Yx0=VYY zI?niD{&K zi>3gI(bs_KWc+Y6H@mpe+8JW;j|)mEUjWKlv7IaHBI_e-Q-D}~zv*`cq}1``r~-59 zdgJOE&&j!`szVX%-D~qfWa_syNK>+@Rp1(HaPh~tvB7Wg35}}W*J^y%8UO$Q07*qo IM6N<$g4|HV3jhEB diff --git a/graphics/pokemon/vivillon/icon.png b/graphics/pokemon/vivillon/icon.png index b9d27d02eefa6b517b5c8b307f72b36bb9c8262f..1c5015e07ab5083ad84794559b8639665e01f698 100644 GIT binary patch delta 412 zcmV;N0b~A@1my#e7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^wL`g(JR7i>KRZEV=APj?KkMDomu>vQ$`fRfj9@9UJFwaWOE$;h>M4$g;8WD#j&L| zjwpBghX32mx;~s|$TN0a4~XUlyM!ROV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiZir3doG0003vNklv#vbyWq8*bM{4~Mj;?E0ov z#L}fWd}uVL|8G^{ae~S!V_72eJ^L%V!0cHK1VEo z=_(Xq6YTInB$%lO<-Pdv2?@V(4<7UJt!?z1eF6+D-unW`+HL><002ovPDHLkV1hIj Byv_gs diff --git a/graphics/pokemon/vivillon/jungle/icon.png b/graphics/pokemon/vivillon/jungle/icon.png index e759b4f789eb5b485f88fff9b5b9c88e6ccb0222..9b2923d543d8e80ad5d1932c2d51359da8a3ca3d 100644 GIT binary patch delta 411 zcmV;M0c8H#1LOmc7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrLrFwIR7i>Kl-aJsAPhvw@(7;)|J&=alN$myeXr_D zmD)LYVVP3CDu9mwQqDB&lpqlS6HP&rG(}kex2pOBU?>I$q~VgAypz2EmD>nV)*)PP zRpqf8FbtqRt=Gkyeh7H_sldKj_#`s5pj)-+dd&fsCxDt9_U#?Y2xxzT1BdJ;88h@C zJGEUZ(}zt+`ZiEej}kR4mt z!u=uNL+}DE4~S1r++i|;H)Z8wmZDWWzvnLK2>1V!ld;Pxs5dbg73{H8 zUFZU80Cc1FPSz9dAh25m5zsk^%w`F64icMb?;vB3p5o;o0U-YlLU)M(c^o7vLE?ms z8zv~%i!}$y+`|u*4w3;{z#SxWsNzMi^Z?hEcPrPD_ybsP9lZvX;Vl3F002ovPDHLk FV1k2iuDAdI delta 401 zcmV;C0dD@}1KIOWJxN4CR5;7clQB{QF$_h01I=E*8TJ618-#{BoP42489R8> zuD^w$WMw>rc`Q+z zkv-+}06|>%u?UoC?KvlujJvMeoD7WpPKmD?dVwiG9Ci*zi)&Ho z&TkX&GL{GNQ!w z;)QQsg4F+y{KBn+1gRY>CBz0$l+b;Sn#4ahUX-w$vV^WW!W_nYOSS-il)Nx{Dga-N z7hCLt;9O82tA7x?u45?*O4|-DRMsWvGxWTIKl)-MqAPhu<*@L-w{{L?~HVJ8hVeeI4 zsnTW!V~lyn@uvd#YQWML8a^(;G6zBo1hRY4}TNL|#Md1R+3jHh7nUAZd}8rxRoaAhS-86`^7_gCH9Q fbZt9ZYi$ufenn6%0fLn>G*wd085=3r@Tzt5opQS>RQIB) zXTTlqx_(=quplS_l3csZeqtCoAUwF{%)wNTE!s=E(U!{0PJzC zB}TwB(p9BH3kW==gJ*i$1c?7{VZ(p9g4p=HE${W10T^AIx9Z*bm}!yibPOS2=QW{j zb?`zHLFHUfs#*Z*ufo%^1vYKhSusWZn41jZndUpf+g~JhHjyr%x}d5f@SS?!m755d z3+#ut1XwQ0gGujb*$f9tCjh0Xvk&6?G6Vd<9p@3S2P>ZRLBD_9#XbT1`r{Fu?7Lat P00000NkvXXu0mjfYR$b1 diff --git a/graphics/pokemon/vivillon/modern/icon.png b/graphics/pokemon/vivillon/modern/icon.png index dedc1aa19f9705f6920d31b3fb634435e6902f82..a28216c157f83eebf3fc3849e34f10291776d40a 100644 GIT binary patch delta 435 zcmV;k0Zjh$1N;M!7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrTS-JgR7i>KRLhRUAPg%hLMjLR|9`tSwA)TenEPro z(n!U|c>vzFKNY}N0zzKLV1m#*20GXgSPLb#1>r(B6ifKn^}!G!8LqVLQ|u&^Q7g>e z1i>P7Jej38uACSI)I9I!1QLIZ1k@wvl+r7Kr5?g-IVK5?DsewGP)mQw4nbJk^t-=-(1g)%GOcK0`xWDHr zz$baFPfn&PnWE-%eKK>ZL8v%T5E1m8u2$(}vw1Y8=nkTh6~|pTs)vKj&qjUzI*4zk z4+n7{CLRuQxP*2)h_9eoUJeq~V8cOZAig(fO5H)6E^m$siR@)$k%L4IwT&cLdceSz dcPqw%_yO&w89e*Cri}mq002ovPDHLkV1g83yw(5! delta 427 zcmV;c0aX6{1M>rr7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu`Hmc5T&;S4dR!KxbR5;7clRa+3Fbsut140*2P#-|PL5dh%dW?23P!Gvn zik=_{GI&VOWCifxfnro3Ks``(kXk<}(6J~teR>qZM@oo43;zR<017AY!ja&p0!M$- zwX<154g?5*=fySq8U*lEUXqalsLSbG%m5}p;#4RbD*KvX7X*Tp>S=si$vNXr$_2D9 zmHtj~CxvRP9|PbHmtEiPS8@jO_+f^+iB*k8y>HuC#haqXVXI@u9@otQ)BYUR?M_FN z1Q$bHB>+lXJV=ay$&u5kX%hlZsqueIHKR6&x%FbIor56K1n|F@NJk~X$+?>pr)8Tfrmh!4RPsPPqCr*@Hm1_5{Hj zPMmP*an(d42p{5k1BHK10=!nUL8Fy8(&42HDPSm!XAUymcdOPBgn56}XEF1Gsn8La zpt5)6FJ<>*Xwn%-jr`)75ZI+K6%zHBO%=E#_z-^g!f-NnJLZfK!VAd=d^aqjk&lCD z@rZ{9v$=+NnT|HLsm3$Q`uxKG&+0UP$nTIdu2>ET+STST8RI3!Vos654WIu<6?*m8 z?}L*`B}>qKPIsxpR(W((-~uBdPz0az*($6jCht3uNVev7 zkm=gs+d*byVI#ML?6b{1?^4Sh9ZfYHlE(^(;m0jC2g&?JoDh=Oi>fpSS!HMrvhaY0 eE#Fp-CFczX^%()URyIEX0000RLNj!(Z3dLYD~8UFw%0LuwjY$&LzV8iTAu?y&d00E$fTl9a; z5MZ40c@5YCSnUn~;DBPaDwfQAK(Iw1NGXqGHSZCllmi%P=X*%Hs-Tkkd^UGLF3is9 zMe+{hW%W)zEhVcr!D#(bfMBm(@a9}A=AaHHwDqMh>eq8^k|6D63*Zz6Ekgx_8z$2> zEhAuT8&CK!2@wC^@`U>hq6_zBG24Hw1F)^fzEoc4soO=0G-V0IeN4d~$Lxi<0-vtf zfXMDUahl7zEYZ0r5?7F7W)GB4c7)GrL0*10000KRLhRUAPj36o|pLl|8||w*>)f>_tmCS zrPd}15c@d(Q~+NISn>=*R0!fRV4xw0vP^Mo2yc}5O~6nLogfhxoaHmw2Z3-d13_VK zqT_`z;#w1(Ks==xmy?eYkWyl^V}Wp55YIWrl!hJ=aB@9!z~HF|C?7(tOu9=_f;6&7sot%^8fgS&TK>BiE^no#R(ysvQk%5a z{IQ5y1Zh=+<7R`0()=E5G6ntG+#ati`}l_c$1b`*tj~~loUy$is8$g-DF~Llb1|k+ zJ>&kKy8tEo{y#Yxaf*M9_H+HGxy%GA9+{7Qk3$cg;#l5WMV?flCsDeCn87&iBK6@Q zF-@b(+_!`HX8LfD$>ItaDzRX8rinuAo|96CoE wDJufhh}A(>4rQ}x4zlrpj%{aajV+f~Cx87X>Eb$n!cd z3Zn6M$o5^LEQ848-~@X~HtGl10B`k?X2GdR3aO9&U=}}`Dmv|MFrO{jjy1}s1={^> zaej9>X@?}Zn=hZ2*3?4m3=mtuR8W7lw1-wB&}0vu>0lEe{=d~5b``{H?Y5=$sBi!j z)vepAuHvbqMOM43+67dzChUhneG6j)qJCM{N}U*hXJ3U&vld=YlSGNC)la_lJdcVY znYSN%m?%rSfO3WMq6IpUCq4hV1xa%+8>>Mw=*$l~^0QmXb`5-Ae_3v%K n87J&|KnO}4=!1U$y2d^Mh_&KW*oV|`00000NkvXXu0mjfK_0_& diff --git a/graphics/pokemon/vivillon/poke_ball/icon.png b/graphics/pokemon/vivillon/poke_ball/icon.png index 1ca199b96b8a2a195cad7ad858fb8b0b0a2f1e4b..7be708eb953092abc2f6fdb7c7a21926ea9bf8e6 100644 GIT binary patch delta 439 zcmV;o0Z9Jv1AqjO7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrUr9tkR7i>Kl--VmAPj|tCXjH^^ZswUr>%~w6y|=j zOvXgdu|HV8kx_-eq?=Nh_6(98iBT|v`jh+|{8RO+_@uVe^=Hk@+PXRwEXa(f$0 zW)q>0F(%z|0$LFIm~}1uX+^x>rW$MUMZHrVqd!BSqVRpjfNJv)FN1$+Dt6^1QoIZd zAP}uuM3|yaO=_)7L7jiiyQIZ*uSK)33NNHo^&Oey=q0KYsrg6sLKsA9Zs6Q70z|Bg zY_JqQc(8u*xeC*_-zO%O&%PtAuQ zJ)xPGa!3NtUBZ!m*J=|l3Ea(yY=>*B?5D|hP h8wP~7ovpRDSU(Zj8j~lh#z+7F002ovPDHLkV1kbt#pD10 delta 424 zcmV;Z0ayNj1n>ip7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu{6lS#@bpQYXQ%OWYR5;7clfi1kFbszM2Eu&+m*oLmSnt`}c+f+7>tToW zZCc1>&*TJB*g@7ZNWceqDP3Z_gB{0o^Jo1Q`XvkTXAyn?5%o6z zf*c4C0LI`ON${k3 zOaL5ly_FaN(@4EeO`8w|N{wf_n*@J|{~yzY^9|xI8I)JnWyRTc{RbjQ5lRG}pquTGr*Vx7GT^=H!f< SxwKl);X|FbqU#%^{X5&;S4J&NyWYjT7#x zH3*5$)OHf*Jsy85fUgEjeW~Fo2~jzaVk+>Mrg$t2FO~Xbz^xd%AsnaN;xpNY0q}M= zNaiBCp7OmLDAE9H%|<;oeq=yn_)uWqGE#RRTELEt?=uIQR2vM^!t{UZRGGr>1|~3A z?9mGht3>QOOGvj?=vpN$doXjb1+PvO=q+fECPxNVVFSluRy(qh!`&tZ&JByeOj}Y7 z79VQ1=%{2e2^47_yGaP%s;&op#X^!`b^HlU6U^G*(EtDeTuDShR5;7clfQ1mAP~lRgA?jbR6l?_Wbx!YLLMp$ma1g% zVix;hy7wLIbTCqN(8PniK&evmCzU!@y^SB=0eAO7$e)G%0W<;aS76Dci3uv0wA+7P zRFaSa0t7&)TlOt9K-;*IkVza5ZK&8HYmOM#cR}&|QidiG zlf8>=1YnPwEyVzgp7gbho8}N$9XEg8=(|Y(`TyZ2oI1!zo0es*m=XZf(xs)^r9LHI zG-^IM38;0{D0a2mh1P?nT4v|e(gUo&E}mO&mvh(mip;@3@Kz55SlVhp~=;GFjfr_>9iT@m0qifP8#NK8PLiZ4Att=}oGDJt!S==MVk+ b*Y)uUH09^1r298{00000NkvXXu0mjf)91pi diff --git a/graphics/pokemon/vivillon/river/icon.png b/graphics/pokemon/vivillon/river/icon.png index 5cb09d29bd5bd5f45a9677955860ff082aad8837..475ae4e9d91b0fd43f97ca8c3e904833ffaa7a4f 100644 GIT binary patch delta 426 zcmV;b0agCv1M>rr7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrQb|NXR7i>Kl*y6H5Q>89~*Q^)u1X#Ac&0YZIIsz&yU^-

m0^wM~EJs33m>K!Xii%S|95+#(~O-qnP26SzCw_+_AU(yR1 U($196>Hq)$07*qoM6N<$g2@=QK>z>% delta 411 zcmV;M0c8I31LFgb7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu{Caz*k^#A|?MoC0LR5;7cld*2YAP|OmgA*@6R6l_G2B{)t@6tIV-r@~5 z`&n^Ryd9TRG8>dCwSiRXSoJnO{^N9aKaBlZ#2oe60VF`o>$BS`M@gVI0SiJ{@>+2VSBX<&aaKd_IHKrISoU{A^>!3_NGvq({7?WGad+gHK_E|8 zQ4TF3h*Sg>?bN1%=Ka8u7Ak3lKts$w38hp=k$O zzVRCDe4=s!(9VbIgT$$=K$wFGwE{+P?7<)O``6v#6QIc6c3WNN!TKl-rKOAPhtk(icm}^Z$RlW4oIau<841 zsZ=SN!x(d!kp_zIxpT!WYd%?P;Y3c8jS#|HRSsdvFJYak4ejA~z3hKqqJYQ*(BQ(Q zO)2%PNo|cKns)ckx-f(~DPyuzC8DA}d6|CqLc}Y)a>5s4ZN74V_lA9Pqo`*9ubW>y z6uRFzgZ$XiHNIW;YNW delta 411 zcmV;M0c8H}1LFgb7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu{FW0{GQ2+n|MoC0LR5;7clS^vEFbsx$1Ca}4XbzCxV7lqL_X~u{Wo8o) z$r+qk1&pjtyD=EKZl{UuDRfz?oj<*h^joPvv+x730^VN`lw&0+3LHnbw?#q;6excH z9B$b+V}NmvZ%>>9@VEg0=wlf?*}Ze<8OA+8NnIQE*mYaRLscCByK(wXxxUs^`)hiX%9j2~JOD*;ZsIWAK%s8cq1D$Z9e7-Bi5-({H>zr_oe3KD-4%CSN~R{(H+E=LU>=R%8Oze2!nXCj<2dSOZc zz2_WI|Jm4|cDa~YYpZ_6cv;KD@{AC zd5uBVb>e&j(3*4cLBi4&KvvOGM!*18-RXmW|GK+<0F2r94(+y+o&W#<07(Z$PDHLk FV1lv>ti=ET diff --git a/graphics/pokemon/vivillon/savanna/icon.png b/graphics/pokemon/vivillon/savanna/icon.png index cc12705dd82ac1b928ddf35aef23588e19a92323..7c58f606e6d33f609f30c8cf7eb710e98af765ad 100644 GIT binary patch delta 429 zcmV;e0aE_+1NH-u7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrRY^oaR7i>KR9lV%F$kMxl#fUR-~YBXWFDOc(*M;` zsZwiWoR_!lPZjW!fRyJLib2qb0S6sH(^O(x5KeSMZ4HmE2ji0fYCXjcLU#h;_DwK& zL$8k4I^#AIgFsvYTwnZXh2wo5P+ne+_dbo_R=wCy4G7`c0}RvMzPo>z1o1Bd1$OLO zw6i2wq?W>_qC$aWm87trEHQ!LRDr{S>ePO%MYUJ)2_eIcNF5_W0UH8|ERKHo#Y2Mo zoimajTj=pnS=TT8zg9K!A>Tuual`U}U~hFKOvWf^b(LZ!!JCNt_v`|^Y3Kh_l9@}6 zxENDVIf2O_7*iqw--B(OOJz{a;h{}Nf_T6L>B6nL6GY}`1AHV1di-jx1eqx1M>rr7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu{I8<$MmH+?&R!KxbR5;7clTB*FKn#WF2ErGZ&>XKRM8T`APn0Wg}3Ja|JJk&-A2K8PrUO^ zlcoVmw(X}D@Rfim&oLx}pb-NOI)bcIiETmX=myCdx2hZCN&u?f#cl+`^+_<878))A zZavWmkWvC%cYZX(@tlVSY4>F~jSLbzs-5-J0IOx}0mJmL?_5lREgpXa3LH2zDZ#OW zF;ZetQmR{nXqTk0o-7fm(XGOb)FP@w`Fk&F7Q{M)3^!tXm=JgvY=Y2YtA`IBCb-X> zk^I_1kEhCdeZ&82wOT&R&yaUqvAiJITWtw5Vy42|b)$T7t|HYHLlf%z%b1XKRj4)(fay V8K2?La6|wA002ovPDHLkV1f=Ww4VR~ delta 421 zcmV;W0b2g_1MLHl7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu|2EHLb{r~_0P)S5VR5;7clfQDpFbu~120Fihx#j`F8_>lqV;5kg6J#qJ z*}}6Xgv%zYE+L!T^tkv>d)Kj7ZTb0=9O;vV__J_700|)f1x{EJ98_RwJieMFAq9T| z1iwSCdYiU+xy=TuE|=wtgFzmLv`F@+@D4LR8(O|g0stN83CB% zEUGyQ$kI^7LmLq|iU-g1%?S|yKSqCt(+%RzrENJ^+5~_dPHC%dIKC#k$mVt!C156- zusrGU6siDr*Pdd4`s?D}yTIL{u8p{c{pqZfl5SoBZZ5GlL$C! P00000NkvXXu0mjf^+UV! diff --git a/graphics/pokemon/vivillon/tundra/icon.png b/graphics/pokemon/vivillon/tundra/icon.png index fa937ff7ca466c6c533604228702e70f058a0491..6347455e81ef53496093e27318a031b54d4db1c9 100644 GIT binary patch delta 434 zcmV;j0Zsn*1N#Gz7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwGWrT1iAfR7i>KluM4pFbG7G&L*kF?`p3D?D&8~}bLk;4ipZy}p1qLEUZnT!mqqDqA4loHWMVULmn+#42&gGy^~ z-D2?|;~>r^8x&(pdpxtO%L|O8@`>07*qoM6N<$f^n6ylK=n! delta 431 zcmV;g0Z{(?1NQ@v7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uu|56At7S^xk6T1iAfR5;7clfi1kFbszM2Es4kvOGZc0wH~bKGZH9lg#fN*1OTuhG5B`s>^1~hF(wFBs-fQO^;mHy$}z|ru)oHK)5<-uq{eIu|u_7V>sU#^>UT_ zB?(R%T?7CYI5QeOVCv|Shf5m}I0}Ck&-CpQApXA%7mgLgt&7KU&U6ugu0O=1y57tq zEwcSg0Xv=vi=7#wP)@*@OFt+zp8!65H15kuF72VJtmwUd+Ow3Bd}mdsd=8RJYY_+K0OD(a+0pw@Qpb)O-bPfAZ?21gSa}40Kag>aRw~Fifi+lfKO3m(bod2|>q{aVgtej$ET0ucUS*eg@00033NklZ$vzYXleaak})XCaL<;pBp=p5u7y-+xlo`#vJ-05ehr8=(%u zj`+`3(yuha7J#`UI4TfI+zAoM2(^D2(Yr#15(U5qdzVN?*g_~F$><9+c}AGwZNofe zMr<<_6{O#+TGRrx+b4n!_<6+uY7G!*7xe=V=io!Z$_4+Ac05(628r=KzKLEA`ngt zvIvASgDe8!#2`^1(IA^ZqCs|n#7}4n1e-uIKQw{#e5m~}1ycG!a)DhId8Qvetilr| Tog7t@00000NkvXXu0mjfRJooC delta 473 zcmV;~0Ve*01Lp&f7=Hu<0001qplF={000McNliru;|mWJHzl%J_aguR02g#cSaefw zW^{L9a%BKVOhiylM<8}(av(DOV1ZP1_ zK>z@;j|==^1poj5Fi=cXMPi(TdwYAmy|n-T|8sNAq^$O|gMV7?#f!zPDfad$_F__$ zd(Fk9&Alm{Vq#iBK|$$6v|j)K00Cl4M??UK1szBL009e0L_t(|oZXT^io+ljhP{Dz zNcIi%XI4Tzgt!W{cWlTiFmsnkR)sWFx(dW9`Vt#vJ22FpAJ1QX?_=y=FE_pKIi!bf z0}C)Y9Nks`+^5iU_6xsS`CbWq!MfNdBmwjM*xjMchd?#5zJzQ_#Wz(LimUo z=H!zIK+1!^*>;jL#MJ}I>6RHd_CUqxsa&Bb&{x@Km%hZK$iB=&g3iIggLB@Lr`aMS z7%sb>J$HcdT~|M7{VEL4Xb^^5RI49B7z;G3A0!M-Zc-D5W*dd6l}LU>VFq6(;+ZJS zO?N7VBw=d3f+UO+&6F~tFwCY~R$*vbL6{PK=7(GSs~&HDlzTrG{HY%=vzC`F?Loaq P00000NkvXXu0mjfbg94C diff --git a/graphics/pokemon/wimpod/icon.png b/graphics/pokemon/wimpod/icon.png index 77a80488950d84026f27f577af4daf02cff39a61..732b7b9ac0788ada2f80d6bdbb7382da09c70065 100644 GIT binary patch delta 292 zcmV+<0o(rK0`CHl7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPf4NklcWLj;7vTVIv$$hK`*TQrS;fYomPJ2@yw62-1qY%3vTm6?QQd8JpMC3G9LE% qv7F^oek`YT=10A)BR>lEx3~c|<3wVmS1U#Vo$| zA-B1b%PgXJ=I|UbCAui|9@;%6X>@znG{E4r9pl?%9tXUf?d>$iy*wRE-d=Cf9oK&t zh)6!AS28B_3A?DkjJSykAksbMzkXEPFO&=zIt{zb8%Gi8`wC{DkFUXY5g5>QFW{vu zuZXtkxLmL;5A;M84_fs-PVrC)+BH7zqdT3QHO;{k55wT*HA!W`W1?3S@K|+^wuEoI esQk;kd;&T}m6IY3UE%-$002ovPDBK*LSTXss(xz# diff --git a/graphics/pokemon/wishiwashi/icon.png b/graphics/pokemon/wishiwashi/icon.png index 0b9df6baf4c0215944dbf844580aed06232f3550..2e2778650f837a23490f59d9a59143dfe91c6f25 100644 GIT binary patch delta 264 zcmV+j0r&pE0@DJJ7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPezNkleP_VseFeF zz9+-U(0dXNZV9EqU0PYJg2AD9Z zYA@3P@wSmB(+2=%F(STh#R?qJ5D~OmQT%2g@u-QhM%VlbGj-qZ>^w*;Z-3;1nf#Fn z=IW0XxcZ|I%*P+A0>1oF2xjufdIf0hmp@uN{ZTu%4S(DSWUTR-0(k*3cnG-Kg4q55 O0000A>07zqRe0001qplF?uO+SCjNklVPo)JBu);LHqKWV?9b$)lisag+nm#$L&&cVbr&cJ(bDc=bwUaT zPz`xejt6rmZpY8;Kj|wH)ejucIbz}xi>5C%YGutTOZ2}8r3Za3QSr=0WBs`l6 vX0D89xGo3R#I_DsUiw%M$}bGc?-u3>^sP!*fn4A*00000NkvXXu0mjf+b?G7 diff --git a/graphics/pokemon/wishiwashi/school/icon.png b/graphics/pokemon/wishiwashi/school/icon.png index 2cf411fd1b84138444ae13e0d92b1186a10655f4..a756cc555116f73f857e4278f1a70e23500b9c53 100644 GIT binary patch delta 368 zcmV-$0gwK~1i1r{7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=dp>^w7)eAyR7i>Kl)(-HF$hGhy+A^k|NmQ|t!|;sZoC*1 z9dFC*KN*Tow4aaAq@`GOc9?;!PCPQCcbV$F%$0RSgaQ5hs>HS4Yma}(2WWL`Su3|O z_I0W1gQz8>4S5Im^f@)Z-|y%p+ooN}5+MNlbKj(rWDCX}*kUXn-csV113#NDj{Qw& zuKQKA{XFlH%(G02d9&-s^w-DrX@IN&*MOP$u>#~>eni8LA9BHu448!OV1ZP1_ zK>z@;j|==^1(8iYe*ghuOGiWihy@);00001bW%=J06^y0W&i*ITS-JgRCt`#lf7!g zFc8Q62BLeZhrU5FWy$lMA;?1(9~kLbLYHJ|pCNRyz??No5PX#_OK~!GDZRzIKXMtH>hucce=&JSFD3Ob{&4p1)u0000Kl+A9$APj^-y?|tU-v4boHf+QuCRw-OhipOrcQiGf{FCr zJWxrRGi#GdwKpe#W}fUx_p~9ClE(0h?nDXMxU=9z_bR=su#u3jdNhAO!nE{poex&TP@@oXFj2}GpFBbcvRE1p%4WCO5fHIUO~deZ2jbw=AM zKI&TI5ayi{NILMV9+RBQAB4m`xSj*NZSf|q^(SDcN}ym17{+X<$$O6!`T~%lAlC`# zJ>V(EV{P=C&>sWkmHs+s>*F6wmH*}+sevs1u``hAA2$Z#IX(vRUIW?v!w&=5uV47X YH_1XIbA7OoI{*Lx07*qoM6N<$f^qPq=>Px# delta 459 zcmV;+0W|)@1Cs=h7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uxWA8!G%#Q*>Sc1c7*R5;7klD}%hFc8M|21oX`d67P#48>k0aFb{07J*{X zvEU|T%b>_ty2PMZz4))*c}Iu!SzN8+9w$F6oT=cV4BkSJq3To zo`tL8wbMI=%%4m!Z3-z$AbeU^Vpp`3LS`Y|TGM~yg-qn8a2khyRU(Td*JgBbk)@?K zPS%Q})GLgRBf+ag^DOR0ab6({Q%(>Gbtu=96eL39++sNl00cJalXHCrtOKvk ztHohC6qUzK%F{(PmZ&BDb67-Hb4`BnuZOCXgaC zcG(rDzL|@Xi3n%A8~7kRgv?*u2+)j~}_JGCIgm5Jvz2002ovPDHLkV1iwm B&c6Tv diff --git a/graphics/pokemon/xurkitree/icon.png b/graphics/pokemon/xurkitree/icon.png index 26cce62f0a8aa7164331196dad290e451c610e18..4c044631de7c4db2f8383eff9eeaaff41f959c02 100644 GIT binary patch delta 358 zcmV-s0h#`S1F!>-7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPc)Nkl{Pe+-zHS`AlfeOB4mxKS++(ekE>Q-)eU(RLaEe>$lv7WOPZ=mPLR-Rp za-brXB}5Y{(Ou>k2-aqaz2`YF#l9w?Zi(>7CVJXzVitD>H=Z!{7JPpusyyN`@-?k{ z$j36q%oc}gLNPe4z)9JeuI%)C zdfh^)GTleer{(+$=L?X31CZuN0c6~~;zt2wCP?!mdnke=KMEj{AXT6MG82Rw8x4?| zAi4R`0GSDrD}MoG-q9wCb@AbjAQvChlE3+&^xxpa3se*q`3h|XjQ{`u07*qoM6N<$ Eg0QTXNdN!< delta 312 zcmV-80muHZ1A+sP7zqRe0001qplF?uO+SAPNklz(l=Z*4?>dtw?Cdaoji}iy>6O#88l_ae!fhI+51R zpqN1p{2>PH_S(w5ITMQLy`T<8^gAd80aJucjBr>|iYYQ1t?k(xY&lM~oHJW{zvbqs zFVjKJf5|q?9}F+o($YWlbApIJj|nmjkhftTAUl4+0GZ@N50IJHz>UVirVI5fJwQeiCcUNoeQmCP@+HZylvo4jc_mIP)RF!Ljx%EKbk9wWLBK;@HveNpRg6gmB0};xAx-&IS!JQ6fdz400000NkvXXu0mjfw5w;c diff --git a/graphics/pokemon/zeraora/icon.png b/graphics/pokemon/zeraora/icon.png index b8dadd7ba330426de58a3668d454cf87e77fcb4d..7df134703fc45b59d942a36efd1a7685d4b6e260 100644 GIT binary patch delta 358 zcmV-s0h#`V1F!>-7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPc)Nkl}|K?H?( ztTh%2>6ZbQ||I!rUw)XedL#9I+bwlN#k?J}p-kTcpk<5;JhyeLnka->1~C2Ii?#y_+qU zASVe-PeUyL7gW&5xVt5<)g zT`s_lK9b>bBA?rh&R`-z{_fTgZLxJM98C*$b2UJv?q1ydNhzuf_O-9}nfi4}U0@e#rRQk1zORpJH~8{+Iv& N002ovPDHLkV1jy{ktzTH diff --git a/graphics/pokemon/zygarde/10_percent/icon.png b/graphics/pokemon/zygarde/10_percent/icon.png index c1fd251535eecb9a7bcd25a88961b025bd9112c2..ab6354c98570835ad15ecccd6579bbd3f651bc5f 100644 GIT binary patch delta 323 zcmV-J0lfbH0*wQZ7&Qn30000?P=%ZT001CkNK#Dz0D2?<0Dyx40Qvp^0D$QL0Cg__ z0P0@=06Lcd02gnLEp)+=AwPfYNklW>rBi; zuCJip1#t0o^{huK&^A>j5FWCm@pJ_w-Aq^qOc}m!7SmNWz}=Ymx#xc@DW#?4=JQB^ z<|YI_An_uREXo}MEW{=E^gMo4Ei7Ce0NbPj93xoFBb;v|=?PEmk|;rBv=nI-Bm=Xx zBC(Hq40s`i9{3Sd>h2C4Fu2WU5scmerq{sj@A-Xu4#;yrI^fq1$m~8;-+y->-jAdj VUxsq%U;qFB07*qoM6LruV1jEvg%$t+ delta 308 zcmV-40n7f41O5V#7zqRe0001qplF?uO+SALa7bBm001r{001r{0eGc9b^rhX2XskI zMF-~w2M`M`_69rm0002tNklbq+FXX>Fu{M= zwsS%sC)4I8#9_Q=#rHMfFrmW75jnm-ghhv3$7Pj=u>V z&rO9R;C>}SxdR@iMdVhia5R|1(F(+zjSPql=$Vhj05Dn-V6g~XBT3NCqcqCJ+7(D# z015*foc(?~?8Q)RCe%Pw^)kKqdi)>{=4S_!s)PCEeY^p9d*D8Myb^2x0000Kl);X}APhv~5OJu4=l}nKyDRFWQC^P$#RS5#3)j}dmfR9B6 za3^4a>=8c!Dn)d+CKd$jG4oQ^fEPHlRvArP2y3y2z0nz94*xqbbkk$sU*+x>Wu@>3^bz*EF+bjz2zXM#nC=t0efxfe}sNX`` zxt^$<5Wdj@>j{|l7Dj&w0vy?oK;Gazw^B!q`Cm=|qM1ZKoS_e}jq`XTkOp4lzj*x% zWcxD$K^DkmkjS$@V$zd9sD~twZjdAp0+T@c!kz*#e++@dmN?t6^XL9Zeh7mkfw(`C zAG$%3K*Ap%KMX-+fy{mgU=qmehcL)2kjW2WkXazJAFQo!ez+k4_fk)1DEVP6kO|)2 Xa-b*TBi;5800000NkvXXu0mjfkNL_| delta 456 zcmV;(0XP1s1ds%f7zqRe0001qplF?uO+J4B32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Ri1_uxf3-UvGcK`qZb4f%&R5;7!lCe(1Fc60Q1}94>8y6vVq$(Rjx@GJ;M2a$& zC*xuI01zEP-FiM3DWi>Jr>TpWSn-xm{xA0LPpRJ)`~*&v+)yWAl$8t^Fp>cvhpbRR%!wu18ID$p9ANGmO0eYmO}!EwL__ zgxFU18ga?k5;nSM^`J?cxWP>0M(bB`7&9R;?Z)cagyAt`wSQ`uIZR4pT?vm&eT!n7 z6CGqOXY^EPEW2)hc$utbXLeBtLRt(vokHO-i8cV-o`a0000 Date: Sun, 17 Nov 2024 09:59:04 +0100 Subject: [PATCH 10/56] Refactors Absorb to use Moveend (#5670) --- data/battle_scripts_1.s | 22 ++------ include/battle_scripts.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 38 ++++++++++++-- src/data/battle_move_effects.h | 2 +- src/data/moves_info.h | 9 ++++ test/battle/move_effect/absorb.c | 58 +++++++++++++++++++++- 7 files changed, 109 insertions(+), 22 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index de8bcb92fc7..bed58e3d1e9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3012,30 +3012,18 @@ BattleScript_CantMakeAsleep:: orhalfword gMoveResultFlags, MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_EffectAbsorb:: - call BattleScript_EffectHit_Ret - jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_AbsorbHealBlock - setdrainedhp - manipulatedamage DMG_BIG_ROOT - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE - jumpifability BS_TARGET, ABILITY_LIQUID_OOZE, BattleScript_AbsorbLiquidOoze - setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB - goto BattleScript_AbsorbUpdateHp -BattleScript_AbsorbLiquidOoze:: +BattleScript_EffectAbsorbLiquidOoze:: call BattleScript_AbilityPopUpTarget - manipulatedamage DMG_CHANGE_SIGN - setbyte cMULTISTRING_CHOOSER, B_MSG_ABSORB_OOZE -BattleScript_AbsorbUpdateHp:: + goto BattleScript_EffectAbsorb + +BattleScript_EffectAbsorb:: healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER - jumpifmovehadnoeffect BattleScript_AbsorbTryFainting printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG -BattleScript_AbsorbTryFainting:: tryfaintmon BS_ATTACKER -BattleScript_AbsorbHealBlock:: tryfaintmon BS_TARGET - goto BattleScript_MoveEnd + return BattleScript_EffectExplosion:: attackcanceler diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 27a4402aa29..a1722a511de 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -561,6 +561,7 @@ extern const u8 BattleScript_MoveBlockedByDynamax[]; // Battle move scripts extern const u8 BattleScript_EffectSleep[]; 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[]; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6b162dc4871..bfdfceb6207 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -263,6 +263,7 @@ enum MoveEndEffects { MOVEEND_SUM_DAMAGE, MOVEEND_PROTECT_LIKE_EFFECT, + MOVEEND_ABSORB, MOVEEND_RAGE, MOVEEND_SYNCHRONIZE_TARGET, MOVEEND_ABILITIES, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0293e00f348..e9da9d62e8f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5712,6 +5712,38 @@ static void Cmd_moveend(void) } gBattleScripting.moveendState++; break; + case MOVEEND_ABSORB: + if (gMovesInfo[gCurrentMove].effect == EFFECT_ABSORB) + { + if (gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && gMovesInfo[gCurrentMove].healingMove) + { + gBattleScripting.moveendState++; + break; + } + else if (IsBattlerAlive(gBattlerAttacker) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) + { + gBattleMoveDamage = (gHpDealt * gMovesInfo[gCurrentMove].argument / 100); + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; + gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); + gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; + if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) + { + gBattleMoveDamage *= -1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_EffectAbsorbLiquidOoze; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_EffectAbsorb; + } + } + } + gBattleScripting.moveendState++; + break; case MOVEEND_RAGE: // rage check if (gBattleMons[gBattlerTarget].status2 & STATUS2_RAGE && IsBattlerAlive(gBattlerTarget) @@ -11344,12 +11376,12 @@ static void Cmd_manipulatedamage(void) case DMG_FULL_ATTACKER_HP: gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker); break; - case DMG_CURR_ATTACKER_HP: - gBattleMoveDamage = GetNonDynamaxHP(gBattlerAttacker); - break; case DMG_BIG_ROOT: gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); break; + case DMG_CURR_ATTACKER_HP: + gBattleMoveDamage = GetNonDynamaxHP(gBattlerAttacker); + break; case DMG_RECOIL_FROM_IMMUNE: gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerTarget) / 2; break; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 956a2d0f230..b5b3e539c87 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -24,7 +24,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_ABSORB] = { - .battleScript = BattleScript_EffectAbsorb, + .battleScript = BattleScript_EffectHit, .battleTvScore = 4, }, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index db5f2eaf752..1bde816281d 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -1874,6 +1874,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = 50, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, @@ -1895,6 +1896,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = 50, .zMove = { .powerOverride = 120 }, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, @@ -3620,6 +3622,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = 50, .makesContact = TRUE, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, @@ -5152,6 +5155,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = 50, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, @@ -10264,6 +10268,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = 50, .makesContact = TRUE, .punchingMove = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, @@ -13244,6 +13249,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = 50, .makesContact = TRUE, .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, @@ -14200,6 +14206,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = 50, .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -20021,6 +20028,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = 50, .makesContact = TRUE, .slicingMove = TRUE, .healingMove = TRUE, @@ -20322,6 +20330,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = 50, .thawsUser = TRUE, .metronomeBanned = TRUE, .healingMove = B_EXTRAPOLATED_MOVE_FLAGS, diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 698ea41091c..70c1b621afc 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -24,6 +24,25 @@ SINGLE_BATTLE_TEST("Absorb recovers 50% of the damage dealt") } } +SINGLE_BATTLE_TEST("Absorb deals 50% of the damage dealt to user agains Liquid Ooze") +{ + s16 damage; + s16 healed; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } + } WHEN { + TURN { MOVE(player, MOVE_ABSORB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); + HP_BAR(opponent, captureDamage: &damage); + HP_BAR(player, captureDamage: &healed); + MESSAGE("Wobbuffet sucked up the liquid ooze!"); + } THEN { + EXPECT_MUL_EQ(damage, Q_4_12(0.5), healed); + } +} + SINGLE_BATTLE_TEST("Absorb fails if Heal Block applies") { GIVEN { @@ -69,5 +88,42 @@ DOUBLE_BATTLE_TEST("Matcha Gatcha recovers 50% of the damage dealt from both tar } } +DOUBLE_BATTLE_TEST("Matcha Gatcha will faint the pokemon if Liquid Ooze drain deals enough damage") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_MATCHA_GOTCHA].effect == EFFECT_ABSORB); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerLeft); + MESSAGE("Wobbuffet sucked up the liquid ooze!"); + MESSAGE("Wobbuffet fainted!"); + } +} + + +SINGLE_BATTLE_TEST("Draining Kiss recovers 75% of the damage dealt") +{ + s16 damage; + s16 healed; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DRAINING_KISS); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAINING_KISS, player); + HP_BAR(opponent, captureDamage: &damage); + HP_BAR(player, captureDamage: &healed); + } THEN { + EXPECT_MUL_EQ(damage, Q_4_12(-0.75), healed); + } +} + TO_DO_BATTLE_TEST("Absorb recovers 50% of the damage dealt to a Substitute"); -TO_DO_BATTLE_TEST("Draining Kiss recovers 75% of the damage dealt"); // Tests .argument 's implementation From 8f137b33e444387c02ec6560315741d099f7dd88 Mon Sep 17 00:00:00 2001 From: Cafe <46283144+Cafeei@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:20:47 +0400 Subject: [PATCH 11/56] Followers sprite fixes (#5669) --- graphics/pokemon/audino/overworld.png | Bin 710 -> 675 bytes graphics/pokemon/boldore/overworld.png | Bin 754 -> 843 bytes graphics/pokemon/cottonee/overworld.png | Bin 555 -> 552 bytes .../pokemon/cottonee/overworld_normal.pal | 12 +++++------ graphics/pokemon/cottonee/overworld_shiny.pal | 6 +++--- graphics/pokemon/drilbur/overworld.png | Bin 607 -> 595 bytes graphics/pokemon/drilbur/overworld_normal.pal | 2 +- graphics/pokemon/emboar/overworld.png | Bin 1121 -> 1151 bytes graphics/pokemon/emboar/overworld_normal.pal | 14 ++++++------ graphics/pokemon/emboar/overworld_shiny.pal | 16 +++++++------- graphics/pokemon/gigalith/overworld.png | Bin 808 -> 844 bytes graphics/pokemon/herdier/overworld.png | Bin 831 -> 832 bytes graphics/pokemon/herdier/overworld_shiny.pal | 2 +- graphics/pokemon/liepard/overworld.png | Bin 904 -> 842 bytes graphics/pokemon/munna/overworld.png | Bin 479 -> 458 bytes graphics/pokemon/munna/overworld_shiny.pal | 2 +- graphics/pokemon/musharna/overworld.png | Bin 1081 -> 1077 bytes .../pokemon/musharna/overworld_normal.pal | 18 ++++++++-------- graphics/pokemon/musharna/overworld_shiny.pal | 10 ++++----- graphics/pokemon/palpitoad/overworld.png | Bin 613 -> 608 bytes .../pokemon/palpitoad/overworld_normal.pal | 2 +- .../pokemon/palpitoad/overworld_shiny.pal | 8 +++---- graphics/pokemon/panpour/overworld.png | Bin 712 -> 653 bytes graphics/pokemon/panpour/overworld_normal.pal | 2 +- graphics/pokemon/pansage/overworld.png | Bin 762 -> 701 bytes graphics/pokemon/pansear/overworld.png | Bin 700 -> 653 bytes graphics/pokemon/pidove/overworld.png | Bin 691 -> 741 bytes graphics/pokemon/pidove/overworld_normal.pal | 2 +- graphics/pokemon/pignite/overworld.png | Bin 717 -> 731 bytes graphics/pokemon/pignite/overworld_normal.pal | 20 +++++++++--------- graphics/pokemon/pignite/overworld_shiny.pal | 14 ++++++------ graphics/pokemon/purrloin/overworld.png | Bin 540 -> 585 bytes graphics/pokemon/purrloin/overworld_shiny.pal | 6 +++--- graphics/pokemon/tepig/overworld.png | Bin 610 -> 570 bytes graphics/pokemon/tympole/overworld.png | Bin 479 -> 528 bytes graphics/pokemon/watchog/overworld.png | Bin 832 -> 735 bytes graphics/pokemon/watchog/overworld_normal.pal | 6 +++--- graphics/pokemon/watchog/overworld_shiny.pal | 12 +++++------ graphics/pokemon/whimsicott/overworld.png | Bin 834 -> 784 bytes .../pokemon/whimsicott/overworld_normal.pal | 16 +++++++------- .../pokemon/whimsicott/overworld_shiny.pal | 18 ++++++++-------- 41 files changed, 94 insertions(+), 94 deletions(-) diff --git a/graphics/pokemon/audino/overworld.png b/graphics/pokemon/audino/overworld.png index 27fdc5f6b7643dbbf40b0600c7d144e0f505692a..082abdd270602cd4a6bdade3b36b8bbfa70f125e 100644 GIT binary patch delta 663 zcmV;I0%-ll1)~L!7=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!hTKR?G` zXxf2_0001AS3mXRq{pmz3kwSpSES|T_x0nXo12^3fr@pjr)cUb9`Jxi94zrX zBc1#w8*mj4@`t}?e!mZSHYn0Lni^ohLkO#ltwR3l7%v)pkf*Xx=1Gb69yhcO0QQzl zvqiX?xBUU%{Av7F^F}{8WK45JlPMC9a#`cz&dXAno`1Ip=ckf41`|icw96;~3f$@^ zgVuVPXoNWymo~wWCw=Tuq~0JK+Wy$GJU7!c;g z2#y==6td>Q6$6P!$VQDP{U}`5-vf9a2Vma|U})>Ge%>p&)`vGj$GgDS`Ayhsf^MzmC4yc<;3Pg1^$=NA(0=Q;P>Z xHn0xqix2rL{e9Gkk7*uqoV>@6jQThA4K{Qg+z<-2nAZRR002ovPDHLkV1g~3HVgm& delta 698 zcmV;r0!96!1;z!C7=Hu<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000gP)t-sn9!hTKR=jIprClL0001AS3mgJu-LGO3kwSpSES|T_x0nXo12^3frVGd00JdRL_t(Y$L-ZIZ-3K36bJBgRZ9#Ev0aq4 zi7mRY*bk*0GE|mR5K~bdGK0lAuqA+a&VLR$<}o2PHXu92<^%rBxM0S|!UafHX(wNhPEVUSi^Mcrya3TJ!byHY zJ9^#3`AyU5Sxda>g4N+HKVdOEZDKrfn5C6Bz2f;|=6nYDVlHOm8m|ZDzN{DrMsKec z!!sTrdmer|xQ@c>>C00U$B8kHO4xj z;ZZcU$~~xBv1k}k_d((3xm(<9Ah(jc>?gZX49g3v)(RX_`VM-Z;Wv8zKpx-^JW}s!f7at|B0HxR gclho@|DXu@1*{77)^;Hj*Z=?k07*qoM6N<$g8l(Ong9R* diff --git a/graphics/pokemon/boldore/overworld.png b/graphics/pokemon/boldore/overworld.png index 013a09dcf3d478b248d85bf99b45b5d02b3df064..e4c4cb5b11e26b34e0d3a7dca38039fbd543513c 100644 GIT binary patch delta 792 zcmV+z1Lyqm1(R9J=WmfLo$APj~H1RNRP|9N*34uya?UQBzjWvyz*FNQw{0b`!= zjAuOK8P8}2{4K|e*RQw%yPo0894-W2@xKm$=sLa&P8Js?U*_O!jH}nLIJvirDZb9F z^L8O{$vq-*nSic{{+D@w*0*iv1zK{y1pw!$MviX~Hh-4~Z!@<(+~rkYIQ>Z097&(8 z0;$RYZ}NZ*=byJY3v|wh=ubcMCHLNozSN?uke=M-Y`~oGU2Y`7;JhaTJ6$W6oD0kb zFC>mH$`f=&{)AJ5I47L$s!6VRN-$Vz5e{@(f;IP161?vSxbKpG;@FzOg!_(1)<+5f z#7$2##llo@-1|QE!vY z4*LtzP_IMB`Gt5Z0En?VlV`-OKb9XLQ+PFn)gs#9vm7WiDt;4XwLi?BxG5Q zK-Z)IpadmjtN`hMq(85|r^9Tp#Th9#z0`62d=2Ad>y0)IHK zTvnc?$fO;i@sFvya)#-|hA!Q!fwkF2o@>lSp$8CXa!-FjXE;}=a^_75hv zpwSg%aY!n~d45Eae*_W}o5~e7xP^GI-4FHxO%!>l(oi-7Ru4`xc=|%& zMd0AD#67PdiJKg+hXAf^8tZumPt7wg0?!Sn6{O#vX!^jWooV&+)O34T%!X300003^ delta 703 zcmV;w0zm!C2J!`v7%Bt<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000dkuocPXp{Iz00009a7bBm000id000id0mpBsWB>pHR7pfZR7l6|lQC}-F%*Dp zDYtYw+fhYBhdy7spe}c2WN40*BBp?Pij*xVEfQjdfsK*93t~f5mGUcEL>c&1_}S<4 zYpzGBA~EF+k-q2W@4a`qW9wMQI%1?N@?EDKR^s%3@6{_exU1TRfOG|37Ro$r`QgTm zd-AeS<}ex)J|1QOSlMlkEOf|VSpJbNzPCK|Iv|NaJKegIhulV4#XCRWGw#O3~!ntc{ea=;D^J2fGTI{p`lG>_I7?hg_RaGE>T@X76@x z30bdy|3wvp_`gr3**YV+LBoEi!8cap76&9naQPNc{1v(G9jsPK2S@H!L;8hW7pwJt8>{8hJk$aAGGk zZUU}sE3Gx%AQrnQ;Sp&lmDvVOa#|0N_mz=|*1i*d`6R9{v)8n8S^bH?KyAWRr_AixYbO{pKJr3Ik)kZ2~MhdW(Z_=;Fn9MjKAf?dMrB7AL%PoLsnX2iXa0 zcJ)Wr7ahrB91dMf&lzo))JJ4OpQz%7C=87CWW&0$ihiuP(J-XRgfx&ROZ8;Kj;OkG l$}*w|!VduRSWuRuoEEmVb$fiHV7ciHUy#CHT`0 z_w-5|V{ErUe}GbU(BY=OD?ik+!G{CR2F(s*edOEvUc#^GD4~xGrX5-ZJ%c0tAYt`V z8(OO?7!4q8o(UUWYw(8tL`^?R7~6BMp|SuHqy`09#j4aZVWrlBjrwncRec;TZ-st& zBVlz^SkP|u`F{fN-Nhiz(W%klrZ?9AFziSH1m0Z zU)RjwdRb&N=qNluKZ3Zq8a(u=!CViJCMUpWJpD<+vVgGT9z|C6x1>E~2Cp@d_8fL* z-UItuflCa!f_Biucsw-pE;rFnSPJwmUC3Hn`o{?G>3?OAa8}Tsjokxsu!eoL;M-tJ zPYy>_eJw)FU=VGd00D|gL_t(Y$L*9qOMk;a7{+s3#$M}UMzZz?niXMol#bo`KqV+(Dfj&J+gYXji#l z%{P=2f8=Z-@P856rew?N)xDJ)mL;u_%{V{v2O2cV12%sv1e=u<+w8dFtqci^EGuMe z#yLU-OO26}>y;P`)_g=*7BC4cDaxlR3cw6Jjnd1hXgDZ+}=k-bjodUmj+6B63D#=<}4} z$PmK77}w&Q4FhJBCxuikEPpcE-P00Po8PmKZTVH`ViK?rN$xoPRPJ+mlz>% diff --git a/graphics/pokemon/cottonee/overworld_normal.pal b/graphics/pokemon/cottonee/overworld_normal.pal index 76222db0ce6..2af87bcf9fe 100644 --- a/graphics/pokemon/cottonee/overworld_normal.pal +++ b/graphics/pokemon/cottonee/overworld_normal.pal @@ -3,17 +3,17 @@ JASC-PAL 16 152 208 160 110 110 110 -204 227 209 -208 241 229 -164 207 173 +198 212 159 +222 230 197 +165 173 132 64 128 16 92 224 48 74 176 49 47 46 47 -198 196 235 -137 162 175 +165 173 132 +123 132 107 238 238 247 137 117 107 -230 77 40 +230 132 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/cottonee/overworld_shiny.pal b/graphics/pokemon/cottonee/overworld_shiny.pal index bb3d8c85c8f..d530eb08946 100644 --- a/graphics/pokemon/cottonee/overworld_shiny.pal +++ b/graphics/pokemon/cottonee/overworld_shiny.pal @@ -11,9 +11,9 @@ JASC-PAL 192 96 40 47 46 47 192 176 136 -137 162 175 +112 96 40 248 248 248 -137 117 107 -230 77 40 +138 106 91 +112 184 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/drilbur/overworld.png b/graphics/pokemon/drilbur/overworld.png index 9d1c7ddcf8dcdf41524d1755cbb6469e12f62b15..981e575fc1a30cb2527cc73d1ab7c5c7095b8bb2 100644 GIT binary patch delta 582 zcmV-M0=fO)1k(hN7=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!goC@3f> zC<_YAW$0005eNklX--yrCDk!`odZ?>jsQ zXmP5+dyKbR#NtC87%=&6u&~q5xubhzWx3;kBZG79V-6HN-tSl{)g1k292#%-YUA)3 z7l*8zQ8ezMDfc~IwcKL;@Q!+&GN6lmP!2j@l@1W1wmF~6sn z&H)S#%mH=|%+CP~z8ehUFVV2cJC}kH_ld~+Hoy0U=rzEc19O1J0ffHv?iLPY9lgIn|OC6fbaCqQbCA4U4`%OgLVWl~_eU;1zT0D0lP^=K~zY`?SIrUOT$1I2HGas-r4Vq6?zp$)ZUZ-Sdh(~g3eI#!B9aCdSMak|OHpW&T@y*ut& zx+(PCo^tnoA1NGIW|?J{`8z3?romdXZEF$F%{D@H*0luMe&1$DKzsDI0913)GsOYNGEkYAtSISbH*xkAzH_~9qfNTN0}kFmVbDp4@a3LHvnPy0O8K>!lDaV z3zb~#C5GHu)op&9;m!E(==V^jv0dP z7_u(9c}s4xkC{pCv$h43^EUU`LEA11uCOjb$iJQtviC)c=V@ck6?VsA0QiJTNGv%F>7=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!ggARq+= z1u!r$ZzuuaSQ)rbAa@fC@bK{FF)8S{2(XACds+yfI50p!KmY&$DK#^l000C1Nkl53`UzU8c^Z=A9ue5s}OLeyXS0wm7dd4FUk!B(0{M5zw%f9%30{)__z3b z@R<`mo%{~}06ueS7)=HKUw#9AbbQaLfWBTY)GE^y_{77-!++tm3jXtB1aCQ)Quwtj z%gc`bJr5zAT#q~!$7QBqH}YcuA2__$Maw$#6UV)P=;K){ta{+NB}rzEZgKGAIW20o4-8r0Ob9@1p@0x6}A1DW)dF0rZXdv=cU;`gT7RCw))1zC19uO{;>0Gv(F_Yk zwmRQ}_%)@TYtnZCY$9tdBHJv0j=KOjOTg6Nxqr_$KYWB$MK5zqBqEd|>+|`0xyJ95 zmuovZ4Pd*toph@qp1Y(NIgF#{`QQ)1QU!RGoH1Bj1-=C}KpXUy z7v?)#{On3@S06VWMc8>+C#DX1V zT{}VBgdN|<0O}yxb~||$sQz;-Fhr6qXC5pIrft3jNnd^_G+cM|(sTp#Ryy__?`stH z{h(gZ0_-_La1t+FWA(vdz8mW{@`UyEEJ870csC?0{6lF3DIo_aT%0)eFLVsCW8Zet zf`8w`32J~H$B$QpoM^M9O#L11D{zSDV(lBubL}T5D7Z@lyf|@*T_cR!kArH_12@W_ zxK@cs407ogpQ`8gRAMVfl5P)90cp5m8tVA7Jlw3b9CO8|`J!Dvk z_y|W3yf~#fN?1s_+0i=~twQ zf92DU=K9=+&#|9Wc>b3DS>1Xq;O||j{Hd*{uK#(3zw+zlA0R|Fx|vQs>;M1&07*qo IM6N<$g3Qkz)Bpeg delta 1112 zcmV-e1gHD|2;m5j7=Hu<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000dP)t-sn9!ggARq+=1u!r$ZzuuSRV2JpA9oWB*Tcl-F)8h=2(*hJds+yXRyIoj z000SaNLh0L01m?d01m?e$8V@)000BSNkl+wIy4T@49OqW zCsIGp=jEmrClon zUefDm;@jV7=6}+{jG#{%Av2`c9Chw|>wV3gML8SL8wQlONPSCm+w=B$>n46oou1d_ z_TUEA+l0`%9_bR|)OcWJf~+-|&qhq!z_b(3XS5Db+Yiz`u&>2y#F+KGhioOD&!IT# zd9Wsm2Xk5Jbt(g8ScI#=0wuUs3Y08AXG6r9U|$pg%ztp`?SnxyC<7jPKILw)Kh1h7 zu<82;cr8ZoZRsFTux4d5zDq>V^ZY1@@1r?v^!)?Q-NFu`An-XDiri6SPm|}T+ddm7 zQc$yul22JSp`Tm?zVC-=+?5%r_@OjtA5&84A#~Jt99kJ_d?oq$*-E%JPGgH@hMkg4 zX%HpT*nju?A{B>n!3?8t_+speX_cbzhdUJZR~l?2({|to8>yh|IwS2(n2G>0auNQ9 z<}lLN?c>a}{E^A`h70zEquB}57f0R4us|8qI6JHwAEjyF!{eB#h?<-wEf#6D1BBX9 zl%%C0Z^PU;OkkB1G;6$tl;ddVjY8>voe_$JNPp9d`=!1i1gtI%xf_O~=`;<)kV}Ia zX9mc$zv%C8KlsU}>h_ss6s54+;g6L;lC3UTn~?Pf5P`QzC(>ZDshH3+6@h*4E$6#` zc6e^!Dz@bYq22Cblk=@AMMJMXV6avCEE#d<<0S}QUQKd?=Q-yR zI)CZFch4*RWpXG7^2T8z%LTQ9^Xuo1$tRrQmhR+&A5Ab|m=yP& zZ3)O2-}pTj#N$6G@Yn+pmL1!arfT zpl$7D9K0?joV*MU4*ZjsgZWH$aF?`y8I*!#=d)$fCQey%?(Mm7^xqdXLU-r~;Jv*v zr|&*+(|vdK*9}a_@!w?Z@IufaolW3c0pqPBGO%}w5$FNavSd))I>dG68Czzlpi$F3 zhg3BZDk!c%>s$RNw;ZwQmM3d{jSH^5PyC7^JyaQZ{E}UoPrPZHg|sZ zuK#P3Pq3fy3O$X@MG)TReij-h-&v#~$Coj@0&1Fbd0>&J>s|tA3 zoa1W&*Lji1>VHt2y9JCm%8L{T0r6MSoZv151Y6!N^H)G-y7yOL#HB+_B_MI9g9fhx zUgx+(LHI#*_xjz+;LiE@VDiorKjKkyf|r1<1ia2mK=x0x$Loi^!QshI&(4X8-9dAP zlO#h^?&p8FmKu&55 zNl`RBA5Bt9F=B;c#HRy?f6di^*rk#$u!aquvA06t83AYcpaf_*?b}dzLW3eDg)jaa zR~q0L%ZpP6My&O?=Dh;2%y_wO0E;7{OY(M^PjWC}b#u;w?@E0&Kl~W}%LI5{9R}Dq z<$5CvCx6LzlZ4drmw)==Nn1gjG9_Ks3uySh0MwQdVOFhJWp#z;*&%fa`j@Ip+H~ zz&cda^)+a4%fEIwRKK4<6|^IF0_YD}XSn5Gm#DzD1FGON{%ZUKruZ=QJ=(Yk00000 LNkvXXu0mjfj@*fZ delta 797 zcmV+&1LFM52B-#*7=Hu<0002CwraKj001peOjJdf(4ZhdNU-?$D0rAaC}#&BAvQft%uL_?0008ENkl)s`O`=K%a-OZX}Q{$9+;J@4Q3bQ%UD`0 zf6NkG|FFQH1$8r(i-aHYMtRB3Y=RT(-es4_4OWBGQKA3C_ohJ&BA%YMnYeHD|! zCo@g4Ng?mY)PG=Rbr}zxqL8<7Eh*HRV#fnQgBb^-*X#giWP)2L6hHc9rL6+`^hx?+Xny{TAA4 zF$0{T{$W$u`UGX6O$h5eBvxmJgj4Ec~Pg8EvC-* zq{gGL+jedun--wN;Zp@nF`p;?VPWL|GSe5155&&*NC1yfu;#M`vF#0!`8*!~^n-h6 zI2(u$_<^180p%3Cq3gS)0^)EZJ;9sLC+=Fdg@02g2f7yBBVQcYJwwQ13o>id%;#f= z2#qb=?-e&L_JGvuxaUFOl?p~d5Dq&%FvWa6^S-5OGQIKnKHURSOS=~TMX?33&oreq z)qFm6ZP?4coRR}Ix(7gGlKhi@=L%|*NSU;+^of{)6ZQk%eE!0dEYiJy b{TBHR1zx8T(x`FG00000NkvXXu0mjfu&IE4 diff --git a/graphics/pokemon/herdier/overworld.png b/graphics/pokemon/herdier/overworld.png index 51e2a2207bb9a8c5b05173b8141ff1ad3bd1b671..de47a0ba7f4c1c1daafa3dab43e13da9c29d6f46 100644 GIT binary patch delta 821 zcmV-51Iqlr2EYc87=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!g$HckKl z05&#GU`QBXV2qGhKuAbv*pOK0$dHg&Kv-Bwffk6zY=7G~zVVH3{If_D^St06 z1~0l@@gq{&!x(i1zwAvI^DYOs+9luP>euk&&G3qkM(8&8Aa4_fyif5A zbC`hh@Cy=%`4p^b*I?<@aLD@C(qD>fa2+AlC@e**k&aW1T zH^D1D`UgjKv=(f_kjq`X$B+7`4=nNbP^oo6Pk&&=MG7KHz~qDyKb=(%Q*_h2 z9@r~>{15ELQVHt(Rba(oSa416I~1J~ayX$=x{Q_C^^l;)8-K-bf^7&kFM*Kb71jM< zn39!%%V|stBF_f&aO1D|Rj}*z#&!ZRPo+?r0~8~JfcMJm^Ls>oxbau~@RMn%OW|fu zj0x(z1YB#ZH|d&W2(Gw3Sz9}u)X==K7aU@O41X}o$=d^Ia7h+N3z*@M9EOJ9f^Qiw z4(t?^37f~@io*;Uz+dcdA~jbo4)0%GtZS9Cb(65Zg~;by7RKLG##e`(05}d`_Bb9J z`pkxg_ay6t*?rN>*CyLn`Ry(0G@$XlpwvmA3y}L+L493)!I9u>W(3c7Dw)q&zI(;m zEiPuyuHXS&froD10nZKWcK3fC_Vl^HH$I48Q|cpQY^ZhF00000NkvXXu0mjf^`eC5 delta 820 zcmV-41Izrt2EPW77=Hu<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000jP)t-sn9!g$HckKl06;)MU`QC4n3$MwKxk-a__%QR*szdTKv-BD0-H%hK~zY`?SIw3Yui8+2k@8k(YZ1t zUS&D*kD*Ycrdd^EOgbh-c#c~RiB47swK|6ua`fjzx&OGE^3JGZWIn5}v&7}O6*%9~VDFMP=wS0Q zff>&dhq>_i6n~Ai-PHam?RxYMnJb@vW-4)*i{;4`X+YgnnEGyWwVaC~Za_S*mI?>j zZfbP)h?%;|%CYhtep`u8IMBGH4fvGBv45Dj%(7Cctn_!A>s)6j&~|;R9K>;i7m*sq z$`l$y%qv}y2A1nvDvsANo?~hl)`3gdZEo_=vk%+^zJHG@vWV0$6iNx)0Q;HNnL@9G zZKxORdZ@`FS{6+?oNJ-VO*hY{j{WU`t4fb?fNdeAaG2eG{8nbyO@94uBgfl!y)zM7 zi}lNGfNdDcG?jRYkeOcp6e5hf{$}@Y9r^8P(3wDEPnL3a~dbW~*%YQH$Ns~D$T!y*+a;rap%S@h!g@@O` z3yXu+zP*S2_sv8*sWWy8Q$6(e9sj&8^m4%pi!{jdG%<#PE8W3=Yq+ zBaY2(5-#w0CK7&vj~jD(a&%Z_H|8>Lw?2$Bp9|bTBn*EuSO6r@G=zYD@_@D93*MZx y=q*MaKmtue5>OX53*h08f&Fao7Xklm0sI0Tq%rD@v*#oL0000AUT6#lyG1msDw|)0008WNklWoJ}JY7`SytFNX6|^6(25 zT}^f;NM^!B;ENz$rVqV=+X5UMtx4<2K1|{+;V4j?P1*IosSS3>!WT|Yf@!9}!9g!# z$a(W0b`oY*BQ}@S=7MR1!NHfMr17|s$^>?|DfJ=SaT)j*LoZy2XJ9kjZr23AtSF6zD6tlJ{OUuwP zA*Prf3CAMbY9CQ(o%Zkv{vdc{_<#d-_uiTSuBq47^kj3d0QRdjUI}rPU@%O0S^Um$ zAsCgRA%B2`BOe9S+qG314G0?##6L=S5xioLMXe>k$90F5VV<5~7WjAqwY6KTDQC{Z zr1G}EPZJ&mQoG)&sx@rz1P@>c?!s`6i^9z4h^;`ToO423tBK=A8F%Zi6S5q@K4C;D zO$oMQ*r1P(&BuVv@71WUcnE*;ZUKgaLs=ARseh!2MfL>65eJDQ3#Zg-6R}ePCwNIg zez9Sb%=>`iG0zf+#W_=?Qc~jk=;-(uU|54< zlyG1m9Q(a|00009a7bBm000id000id0mpBsWB>pH;Ymb6RDVdv?Ug@k+dvqH?>GuB zU96L^+bluvi3n}_W8%=Mwneg*woAvxM#)+^M5U9V#SPt>p%9Y}O`wpFq0q74Am5;n zy|X_-dx|XUJts#OLzkQf`|;`CM|bx-iQKijwyZ{tIz~gqB{U8;DoFwCWeY^u!Gg$H z@)Wqwut1R3vVR3a5rD43BX)zjaiZ0WnF-$AX?8$4{c3j>{r^Ve1rOOTFB} z$hrbRKu^cz7!lf9A&ZsSQAI$WIRFkk)$&Z>Gg~L5TqwC|fG`k-khi*yjZ!cxNb5I* z4RBMu%iEHXkmdD+j_-AfU6%!mF)!+oA}k8JXnOLbEq}5iP}%Afktny3#%50u5*9)# zKUEAv7ci6cyx^LDJJYz=^@|_HKUUllSeVDI9mic9!%$&TdnF$pyX1DZAUyQt;mi`?>OQuE%fo)hbrXakNzyR=>aXo@VI1z>+mvDZV*vmY2-gBa1LYj7< zoYE$TPJb!bKAMR2El7n`M7`l1owNqqE(BF<9v`|cOulP5FX*7$Qd>rR76R^Fo(M=? z*XbC=jE>KtR; zAsnCTS>7>(%_>E09?oYl`Fgf9Ol7L}ivIiOD}SG}wqzIW;rhid@9LYcV zA$JRA&8%;wknL^G`h#pg*n%u|`jw#e@sYQ3pl7)tX|Pu(*vmoyBSvZ-u79Tc9>@`Kcus%xK2^<2&>&G)J%d?{Y m& z000SaNLh0L01m?d01m?e$8V@)0003&NklXUf75S4GU69H8BJ zghZ}96V)%k6Qq(QOC9?NeS|(kACNO3a=vh0Ixvvy^trzOY!6XOEw$8A|EaXT)lJy| z`bNJtxjX904**TUPw%ZS835Wh*=n5vA7!snU{`Po+&7{zFrUbMkMn3CGhPT2rz>&e zi{J{GIP-4E1An-2yC0?#aeoEUhM56MUZn@wO>fGr>a-u)QS|V+Ao@G-SuzHm0A5G{ zcaP@?r%t{>`K%fE155%4IYvMyPeE}P6U`n=u45(vpbYP9!V`i-*{WL_a z>HgsI{@`4UbOBqMNExgAW0?IpU#iD?%$!d5OV3h&P)dCO89aV;h>cxc00000NkvXX Hu0mjflqtuYj0XU;qFBP_Mw?000BCNkl-CUIk6a>`Q((-PeJ$+TZ|?u^2j+C!D<0)(fI+81!M<1jh@F| zVSB#x4%_%BGk(^*NiLky85$rF%@g>brj0kO<%lhp;a6Hhh($ zCO+#^g>%0xI4%v1tpMj_We86<1_!6jQS^^)Iz#$vlQCIHKMMl$Rw;2c|$0KmuP z-QCk`B!75Ju~ncKZ~gk*b?hN(f4O+ocXE#qNQ8W^0T}p!djL+TP68ACbKRYh z4xBq^!`A>v13AbfkTp)`mF(iWC3k^$rJU8HFn@Y}9J~oULuV`k4SZU~T_9Obn%%*? zl3iTlZvuk~j(f%|BTMQgVrR4FT{e#lzV~ zOd)0HE%Gey;vI+SEWzZI$u!yR`nq}PM-OksR)LUN+mK+nC-^uEj49=k?E*OXR)UgK zOn=uq&ho-vc)g_XeX!amFT^=%-{^$)PV#W(l$3KW_l;ONd~q31LmM7o4FE`BepFy$ zCnFrb@oEe(SA7{mOtGH$$^^T(3<79Ssu7Fa9*)DnYdaQxbxx;a)FO+*l+MXM=;77H z<*G&p9(IC|QjBNmxZWe_bztLag#}h$Xn)?^Km*W=-BKa>8bDE&D}+T~YXS@|&K6^2 zAH)GDlRUX7(=P|t92brN<0fy!LzKJ8a<${gNI`iD{iXt^$pL`ef;?PK%vh*K`Prql zuMHmlO5|;;`Z8}%6?f43RD&uc(a2AqXX12VrQN<<3oG)J0;Kj mWbvm@W*;8}e#h_l591$^tU4$r@gm6p0000kt#1r zjES#?V7UCe+xO45&z5fh005w`fN3g+>Hq)(%1J~)RCt{2mOF3UMi9q$7jY^TPg4AzZnzju+Pk0^YfBp~6zmaax-Pxwb_ZX_QW-6MrZN+*OxC21FN^&JR`o zM45e%H!Hw~KY+LU&CLF1cJ@Is_HBH{;1OeK657&hF(P$wp9wJT&`*cdjDrqR2#BbH zNHd67rq=Qtf{HTO5B!X6(*y~Z0HBG9LrN7gbgM{o0s`H%Tmg`&-rAogq9A@AN!XTw zB8!0_>Zu;6b$<&`Fs2K@01dkH3m9ZU0W3|K$g(6bN!>L`Xq}jt&X=iR3$THZkQQf< z>7W2_RRK#4t%?lV$5IHojRg;NkT6SCP%L9*S>h5@z`W?XBsGo4{^U`hrw56f(*-EX zj2%{0HNuUJ0^TWn0_(U@miOEF`5)OfYsKZb5h)2#Z4bnyf*=*tj+ixhEv8fGpefD@$9lq z(D7N;Cg5+#k_A3pgz+Uaf(vVSabP+Zdt(Wa8kcQ!~8-x!H(Mmklb2~pMO?uJSLzlaN};7_;K~1MuWLEl&#<| z#_$jC5;#6{7sCjiS9r8)7mwG1GQRXi@NX0x)%D7*i1J$Sb=#tr|8(~Nt-qa5NdibH zOBk>%6g;n|6Po~^Fv>XL-tDCkT>7ir@u_>`u;M4@FY9VryLfzwDdPf-;OmRJp45NX zV}G4cMuFkc+e;LT{A1Me4}K5Oym4`_Hsi(0wT!YT@R(lC-(J+CvVLe!T|ya0|4H-V zuieEe_OG4i_fq-<@kVnK<&Nr+YnciePt}i$kIVc~S*}bto;t#2d~BM{!QQ9t)kl_k z?-PD#-BSQRZ7nDDQCZr8HZhK}1l1cf&40f)AN_n~ct_z?A#7@Fnz+zu_r*b$=Bwvd zgxj{)yn{nu5cVLwLpg(dziFEP`c6+koGHR)Ts6yH0qf5wat^TXKYJYVVZT4zEPr<# zZvs%pFWTN#({CqZ0dR+~Q(UpQAm6F06+vDoOm#Kv3gX7MW|8;U#=2S-y*L-Wf{+GtD8@`P%jsF4VHscka!xfONcSZ>^rzdNSkAs!UQ#r{w&xU_%R8eR(OZ=3_lpo ze4U$L5ISy2et;@Z5EHR8M))uDl&iD9G_d5Hv%r%U!}I56>eKI=Bg@ioXqj z>8HHE7O0^HetrCZH+_6jJxo^~;89Q-fR4{fc(=}0%rBl502f(TkxuT&PFFyY_j$pD zl)1Ckuq^MOeG-92etkU8>q}jMYk%W~{y1hSX@7mOC`>?A{;Iq7_dnb>S{twQAv<5b uu*38?eI@>hv|6`#{To;7``XAC@&hJU8g02c_?!R$002n`MNUMnLSTZ@Sp~TO delta 560 zcmV-00?+;61my&f7%Bt<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000dkuocPs-iem00009a7bBm000id000id0mpBsWB>pG$4Nv%R7l6|)xS@|Koke? zR|x|fM}q`d;55;si}f@lj&h3|jlrLb4*pn?)avRW=LQJ|S!EI?o49!X2l_|Z>d@=O zS4^Bt_@+ZY$>qJ5zO;o|W|?J{--nRD*_dWZvwtyvm@L`3#m#D>8B4Umn4RDh%W+<1 zE4a;O)5aYXtTS63S@UYu6HHvpe=4&YvHj0XPz0000v?u00000e@O&G0006DNklw7+FS z`&ay^b1GD$>QMEo{HSwEi1}4t^sD@+^I#SvYK#)`D|~$|zlUxD6K)!J=UoQg%(+F+l>31G%mv|SYVaT92WPI@k_GSULPnq0TIBY?z2 zFP3t$i{iP@a0f>QoNr8u$Bjr>|9-t_y5MSJpH;3*^M5+#!4c3by)D`D@|OH2O?f?J z9FhU&2sBa0-sxOxfKu=LhZcR~o?wkI<($(Xz9}z;doJ@3kJh6L85%3j;*=6HYnKB8 ze01`Sdjd#uhHsc=XM-we{FYsTCESk)P-NJ_m8&Nx2$2r(B$yC=oRB|!Ab`TG-c?ox z2^715-+9azFt=1cgS+~UyMlrkRTwCysGo3hB_9f~MZqC0qY2o>(*a&`Lif_3ehq^U z1)&uwjWPBgmG^6X*>GRj_c1;_=E7=Hu<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000gP)t-sn9!gYXml8`s2JF|0002U==kX9_|2qRAc&Y!Qd0lTdvj7CU{F99i>#3? z_=W%g010qNS#tmY4#NNd4#NS*Z>VGd00JjTL_t(Y$L*6bkAKrJ6vrJY15y~`xJ*ob z_HnH7YY}781Uhsgs2_k*6~We1)CjsD@d;ok`>E1N$8tJViqwdWZvY<%-ziO;id0aT zQ2$Hx^LzdO?Pr%9b<|Nu{k|x5|AH+__jc7d-xdJ{;BF)jV?83+84)x_WMkLTOZwB!9?(|Sj{UH4=N;L& zbo+#R3KTt&Ei8NwQBiDRJ#>KBFw_T)YGcV#GWL6R9WFDZA%mnFKX!ZO)70`io(x`RnCX#RJ}1QS(GI&8JnOlb_MR zVeDbaMaDbCV7(Fxl!Xzn{*FI}bwC`aX==Q5`F4B&VbfplX~&TKQGJl^>^BR@ iKb5`f7nA=)g!}~Ax1l*lgrDvJ0000CTKIY9a1n;w zdgn06eJ)HngW)S)>me5vINJq*a&&r!ZxPBDxO!wW2fe|CSXziJz?iQ5jI;7Kg6d=b z8COdp_yqDt9DhCP2#H8jp#5@r&RvcGb-4uXRbPJr23%;NmZO%%_;p-?9nVWXaLp~< zBZ3jMUbq~)KrD+-+%gPZ6K3cuY&=IC0vBrfw4245z@DE3YJO>8h1;{oMKQC(r)O}4 z7e(hR-*e9a0(mnCJbDbdF0YM{rR{TvV;$NA9Nv0PCVw!UOYM$No&zoEE5d0xRmubR z1g6}!kUjalZ6TlYx@ymhW=T5L`W>Gf2jqC7bw!QA4bMmX4!0U@6NtD@AiMlSimYS; zlZN}~u;ZQsOv)-VuC)Y-KH|1ZI7~x%QlHmS3UbtvD><(^+9Skn z0r=)t06GVD#D+S52rz!{uww0de_2xM9(M4$q$-Yl?I5fWuNtnxKWIPh{|yDV{Zsn{ XE=v_G*^dIP00000NkvXXu0mjfs}nm; delta 750 zcmVD0#->xK~zY`?SIujYui8+0Pwp-Qw=&v zsIx6_X6s$$uHqio($&opD9Dw#hCmBV4W84c!JnW*w?b+{y7wb=?ve}!t=Zbo&~u2T zccwNioeI9i{PfQ6-Cv3A+OF-|uKjuA;-4&h;YPW?Rv<{-CxLVwZMA>_kP1A6aNzbA z33Pqexns4>9DkIQ&^nZ$)PUyaNis^hTdWkQe51Vws8AJ+%cm$YBl!(aMx#;JD>iyL z!hEBdK}6H$^D0DL5GO^Drm0`{HyDb@X7J1G_qH=Kv7svxj}6Ih|B&&ZC+rU~x{kE# zn8fXtyCdfAgqXM24FFQH*Qb`^k-oDUL{J$4t>dbcjeqSX16I0C7(%L%F45kb1OSq0 z-?5sm5~5UKGL)@#RzhQ&5V9c_ep?U9iDvDwx_|ueZ8}S*KCzt1#t|wgwO#ebTG;}P z!^fwCA&yrEm&=(7Cz`hhIe2~c@$$pTvG01)B+L=2Do0|wM8sbXVTvML6?pRX-Eflg zuqnXDXMaZr=48CtsB8i1s>Igc=7(yU^VLpA%ur$^$h%UZ&} gjGOJ<|KG;gFa9sTvu$p!426U7GL($H|Ksl1BwDrj(q_|s;i^)i?*P7F!hf<%n>KCQv}x0({h^ie z3tlK09PwYR{H?07Eas)g5k$OjvU0+QsFWJ%5?*Shx3^$8xR*yTj&hvwA!26yU0K4h zMrHC#6!OA=QF0PaG&BfPRP?jdPjjlbIA#?OgWScO7`qc0lKeu2Rp>Qdg#*Hr*Vp*z zAYUSTl9S{{B!5L#(YG7C=pHLKxCAHuxgKVmc*V?8V(k^Y{j5O7HMWyiqk z$5qZH$?%?}%N-6X`8W6nHQK;d%?}2UFrPz7d;F89e#|Drk7hpG+x>~xQ**k=$sIbKHPD0vJg|K~zY`?SIw5YTGav2XNW+xPWDe zU3PI~cZ9(X_9t@LWs*J$yX_UmOdeqD1!j5(9lPueHhSt_pip+%6O6J$plHuByEO5q zv@-NKh;Bbi`TkO@d|`)i7>98fj~Gcd>3nZ_KKWt(K!C_5EebYa87@xD{rX&(DJO9J zHuOBBGC_jS_kWI%puudy0&LBqPMi+5BLTxBss53cSz1iE(Q!)&G$1if2LY)oM2#{l zZNyMW!+SRmdk8=k23Y!zQfLHl%%O>zOXN{A=`@mx2?EkUmYx_1p!tc7*wwd&i2I6& zl^qL8M2iItc<;0Zx3UqVb^r?XXj=m8%!C8G94jUobbr~BK=!l+UJJd-B9`c&X%I)- zrVrRzaHwfOEkFbT@?HM%^aF3Rm<>YNj2BlL3#BH0GlvysN3XZv*jKS^4coeZGXK7~ zRNv-tqpK=IU6nZcSNFoL40Cq{pDfh*vfrKC1+et&$IV5@;_hz+eT!*N96dWbw{39* z+k%@5e1C4)=zfLzeAUsLJNP9d^H!^1zG^I)_iK}r4m8`G@*?O+H<#XTev*QNuYT{m z_;THNdZNK=lIS;|IO%vZzvk4;4?FfG;CeX07@$;VJMz;>Z(YzG{izJ)UyDI|N}s*T zCoOT(GjC{nWgc_B*YB#ZJ);W$0MtC_zzGlMQz<+SmM8Q|+%4HF_{e!Rz5M?jjQs;W WQl1?2^h7=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!gA001{P zH#avoSXfxBtgL{5fG{vH_?VdZ`1ts^D7au?fPjFOmX-hj00000Cl>pq0007GNklZ}V_A501k)%#c z??s{U)kHtA9e=`(4*5E6!W~xdzDz;4Jdy_?p^To3G;ET(BVx0DdNJA`K5foa|vS= zkK-r+?p+BWq&6G*dkPf-;1E#dZvt(nmIQ?Q=@X#uXH2&rI~`<3sFuc<@D(a0P>K}C z5|9i&@GgV31jV^N#}X_}mLBG;1tr46{u)tNq0)qR4Vz8aOp#8*Is_`i(Z>^?4D;M+ z_83)#(0^1YjX|LE#q?fh@{L`QgarQ;oNuFnmN#mj{{q*|9S;i}^twDlfAs&rAKSktxNY0EZM}U1NwpO!cm^|#00000 LNkvXXu0mjf>|#z8 delta 679 zcmV;Y0$Ba!1+xW^7=Hu<0002CwraKj001gbOjJdf(4YVS05>-`ATVG+PHS8XzOEosoQa4E%z9qvO$QE5eVKTi%yse;HdOk3P343Y#y6Q{M;gLsL_cB2Tw zexAa;y1WJOOMeo>^_-Ds>}E767_)O0vNGI5K??L^S1c5zp}@WaP^E;Xb15y)BGbCy zIs>+%fXFJS4WGa%c=_gQHy{qaz)}$}5uniPk2pIawQSR|1e$#6_yDylFe!2cIDC6h z3cDd91&AU6_+4x6VLZ<}c7x?;E{Ep>VkhxzOY#N{mw(;|asQwirFz%$N|8zMe31Zc z0&HCa1DKy{K>x4lazt;eL|vfqu2?Hd;B{VVQMnrdZ`z6H4yO?|3c?6?!^EQ-iPj*Y ze&unc$Q^&~-rEqWiTxp_P%AwI zZ)0wmUVo*sqvcpqQbjuMUi`du1&z<|c6gh6pYuf9=2C~7WSJz;&Oa062Yqbx<;3=T z6|TCzsT2E~s{fb6A*1Ux(*^~MSVywSc*SN;Nj9+awv!JNTg}ML$ N002ovPDHLkV1g^-JwyNi diff --git a/graphics/pokemon/pidove/overworld_normal.pal b/graphics/pokemon/pidove/overworld_normal.pal index 704bb5f9463..820bcb20cd5 100644 --- a/graphics/pokemon/pidove/overworld_normal.pal +++ b/graphics/pokemon/pidove/overworld_normal.pal @@ -14,6 +14,6 @@ JASC-PAL 248 184 40 184 96 96 128 128 128 -172 172 172 +150 150 150 0 0 0 0 0 0 diff --git a/graphics/pokemon/pignite/overworld.png b/graphics/pokemon/pignite/overworld.png index 9ea0862b2d49e5ac16a0c4ad24c4fb4b8f023c29..b6b97736b9d7652d5bf51f969a68a47b302c7b50 100644 GIT binary patch delta 719 zcmV;=0xdpr|Ezyx%5cRaa!ke;zsytg_6F;5HNp|y zOYigz9&t95@nZ1*G{Rgp2~P6at;IbEt8jvB3t6 zj+ju)+kYNch2j%3{Z>1%&X_Zvy~Uz4CP=XP6lGC?3zVEe9i+}pP*fMQfcnvw9ohEa z$jbx81?nNI7j1AZa4T@<85YyeLr{GxaDf$affx{yLyen2lI@_>EY*|Ple?*J`AwoP z4iYT225%|!J!o>VPfguEx;U1p5Fl2WIW+jY3P`o)S?5HG=A5_+tTcF!f5A;+Y@V~m zb@w-upVNGq?A+G3Z18T^yuCVo`p>M{;1BsPvp?yHFy3wkw~qh-002ovPDHLkV1j$Z BO#A=< delta 705 zcmV;y0zUoQ1D0yRlQK~zY`?bR`l(=ZeVa3`Ej>VI~j9T;;?+OkqNv~1VJ zU2dzBmz0g`sjw57u)?VvBSO02Mpiy0cH%U#xq!GsLPCAb@=MddpPe{GhdR`u{-3hS z z(eA2gWc5W$&VMgF@FKt47MYOtnwS<31(9{q>E)DC8k}`mT&}H{X@s_%kbuAH^fIS3 z;%6PUNLCcUS`*MMRy3Q%B%84=A3-stGoEzV3i7Ogv>Cv#2rRB*5?{aV@)3xZ3P?J< zg?YhSfu?209{^U@tX`9ia{c`!h(v(6_9JC={RKSX(0>XvjnH`bK26trs9Lsp<*~X? z$N3UuMRfz0%I{RiS+NrhA&Ty{SP_Rt~;+R*?)POyhLKH8PKm{Ii<(KOBr>}to z44tdHZaKQq)15aHYf45?4KPeA4?kD#Jx`)!8q-t-_R@rweo;3FY!ox64it_@@oI0m z?{|65uYc-i*EIS{=~R3|71*1IT_F8M1?KA!Pr}9bZ+ky`!y1b~e@)0d!D@Tkxbl7g zo6^OAp4WkLz|!>+2OsBKKcoYv_OAblH5P#z*^<-jTxTF0Zuak!(e`4|%viiE>7s2M z5|+5m{@sD87x*p9Qy90mo(&9Rx9!!UnX$b7R5~-hy=iY;gjbKvzcg{u?Luj%nQ>W$ nu^xzj&i`#`Grq(BrV#o8{t&*mOIZG;00000NkvXXu0mjf6%$5c diff --git a/graphics/pokemon/pignite/overworld_normal.pal b/graphics/pokemon/pignite/overworld_normal.pal index 5cf1ee3ef0e..1454fac04dc 100644 --- a/graphics/pokemon/pignite/overworld_normal.pal +++ b/graphics/pokemon/pignite/overworld_normal.pal @@ -4,16 +4,16 @@ JASC-PAL 152 208 160 16 16 16 0 0 0 -82 49 41 +80 48 40 57 37 37 -189 90 49 +209 95 46 123 57 41 -232 106 43 -210 182 96 -24 32 40 -83 79 60 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +232 112 40 +232 192 56 +56 32 32 +80 48 40 +232 232 248 +200 64 56 +72 72 72 +41 41 41 0 0 0 diff --git a/graphics/pokemon/pignite/overworld_shiny.pal b/graphics/pokemon/pignite/overworld_shiny.pal index 21a32129146..8d967d10b73 100644 --- a/graphics/pokemon/pignite/overworld_shiny.pal +++ b/graphics/pokemon/pignite/overworld_shiny.pal @@ -6,14 +6,14 @@ JASC-PAL 0 0 0 48 56 72 42 48 55 -120 104 240 -101 69 51 +184 136 24 +120 88 40 232 160 32 -204 156 214 +160 144 232 42 48 55 48 56 72 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +232 232 248 +212 121 189 +88 48 40 +56 32 32 0 0 0 diff --git a/graphics/pokemon/purrloin/overworld.png b/graphics/pokemon/purrloin/overworld.png index dd0d58266ef6f2cd22d825453281bae43efd1542..b751a7f8ece89edc9b5a47fb08cfd1736795b4fa 100644 GIT binary patch delta 541 zcmV+&0^tUrBfY9{)Kw zPiz)(%@AQEGU6lYT~6tLS{d`KP9om)5hZ_ufcK=J%K)z45=%X2F%;{AxFg>M1G`I^DmrGQ&|)3H;x`R_W5___u97K2^F zoTN(5Vu)r-jQFwz`XOtHSeDad0Pp&;8gwXpnj+#RP#$M2a|>X9ZuMdJbQ*Q?8dsXX za(8I!b^N>l%$veI6iS|3AmXMk(U{{!&PDjV^i7&|#Jj*OH6=SLX91XNZ&H1=xK|D2 zTx%`XARK)WZ$Ia38>~7V4`Xf$ZIk_*26F8V+9O2Qr!&pET)>CRRG(RG?qSG}W)dOC zKsPv-(o8bfcY{lKIki&xES`rkZ)?=AxOX`fp?QUm87hfeLU%ZoYEJWBbIhHC=T@li+#Dn#P$PvZi(Zm)C6Ju=LQ$RjtNyM9i8s8Ovb1L0e5eg4D0Wc_H-ds!KL fPOt6Yj(6f4Px}k^%vNXV00000NkvXXu0mjfDo*zV delta 496 zcmVpGheiAELB~0683H#sdVXhxBw#DfCE&m1UKLSEKqKX(@i~Y?FhjFp^mzFmOtZh?2235 z;uilXpv?Q{3t*A;FD%ex{qv}ryz^1&yr(9UHk`VD%OYg~q}i0QrzV#%G`_do6e$bk z$~K%Z_LOj$F`zX@osa#(gcwd3+iw|&im(LS60vU)b;=5neG{?$mOCOBmVjIKengN{ z>NC7Kk$2wfwAZ&u

z0CQGNP&_qIJT=f@0P%)6_`m@1hB(PXLg?uDb5>2sLqf>N$Y4MqA7X|@0005FNklh#vEaEBWoZjQ05BK^j;6MIshap#gP6Ch1-cXqh7V#?V2CbAK&rR>}J~?~1 z!(kKg_WYjGaDNc;)D5QV9Oh=QFApp$UgF(gA(Fyk1_*fSEn)^RIm|N^^_NrD$%XZ| z!HD+(3eYT-Pz(bRPoj+I1VGGMbP_;zR^gUUTNIBA;PKrcvKVAE0|cB>B3c(THi`Vc ztfWQ90IU31dWY3b2A6mrAeFprTQ24d`W#qK&#A5hlFETam0W zZ!9Zp7>KyoXM|IOI|n1cgtY;=wuqD+j+uzJl#hoL$;B`ba&G?Z0F9sDFVp&}CZ+1E z$0J@Hh&%CUzlcJv_Wr}uD{->EHY%_FO@YLGIxnK97MOR-Dl7N?4+ypnDg9ECW6C_l vdVz!YDkkT1IJh_Be|o<65VV?S=wtc@^)3&EFdxcA00000NkvXXu0mjf2ig4j delta 597 zcmV-b0;>JG1mXmc7=Hu<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000mP)t-sn9!g(B_;p>0B|@kKo}TMJTb5>2sLqf>N z$Y4MqoA#wP00009a7bBm000id000id0mpBsWB>pGyGcYrRDVdv?bJU{!ax)N@M}Lo zYg?l@SW3acsa#PLCrSgZm_Uph6t06#{^17V#KISFaU^kZ6F-EDqpPc*z&Lv~3ipoo z78Xr-+pq85d(EYqk2vMuxzj8so4FJr?7^A?O$-z-aAv7~t;?;)8H zGEGft%aY~`E`OM}V1!)XmbzGxUnni&%v?bo5lxCZ~&Yt%D?WUW36jyBK1YHuWgzqgZH$CA%@Ur!00000NkvXXu0mjf;B5+G diff --git a/graphics/pokemon/tympole/overworld.png b/graphics/pokemon/tympole/overworld.png index 9f9778553c0d3ad7d6ef6b09818ea5cfbd7aad70..320809dc24bd98e7aef363883c932f5ac26fdfa8 100644 GIT binary patch delta 481 zcmcc5Jb`6`gcJue0|P^`Tl;n(#aJBV?!>U}oXkrg$6%t9YCVuf2J(~Ne*`M)^K@|x ziD-R0?RL>&1s<2hr;|SXuPm z>aaU5>seFB%=L^5d}3J>-S~beRWMJu;I!@7GkdiYjG?;A4F422OjC9eJh00xpx*T* zpFRXprW2&S0CAqx6)@?#Rnz^N;{mMPs641Bnj@y$`jX}t%SuUvZ;dFCd|_Z~Th znN>@<*>>Jg%9i~u)xh;8oa-m=i|Gu43Q^AWTkl2ndVVRd=Wl5IAKWZ9UpJ$asp09Y zvW6ENmrgxrS|sJ5xT$`!Me!eLg(l-U(pxlx*Phwbx1ZVR?*8~%PmR@gSgu69>Cg_@ zqkoanVAu2KZ0`$qgr7LJ{;S&T;)rkRw-(rP2tJ==$ME-JXl-um-Ew_PjBxApPSrtebwE){`E)ecKlxm1l+%vd}i^z US^e~IA1JasUHx3vIVCg!00QaP_W%F@ delta 431 zcmV;g0Z{&s1m6RY7%Bt<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000XkuoKJ?fsAY00009a7bBm000id000id0mpBsWB>pGM@d9MR7l6|)W1){Koke? zBcXdsBhFkCoe_!a3D+Q74Yb1O53cI0-t0p72hdzs7xAz3;lkZBuaFQI)9?0ad+&ba zU0IbXRsL6kE#5b^$S<*!!g-6mLmJ$tooW4&FxoqRO%Nrdy^LHA}qC=HG%1ZMpcIJ8kN^^f&TT5k5`>+MpDz$#K|n>tXMmnqTfJRsJxH ZeFJ0SgVUT7HjV%Q002ovPDHLkV1j5D$*BMU diff --git a/graphics/pokemon/watchog/overworld.png b/graphics/pokemon/watchog/overworld.png index f2e9ff47338fc559ce5ded92ff50e2aaf4f9ec2f..e9184c7375ade42094e37621ea6fbd982f5f6194 100644 GIT binary patch delta 706 zcmV;z0zLh}2Hypc7$*n=0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!hDC^&F1 zK#@-sf6%y)0000000000000000002HdIszO00Lb}L_t(oh3%KolEWYfMFXf&|Nny* z)HaO)Y_~J}uoI@6&g9U`g(Sw^wma^)BS-DP;Z2^%)L!wgiXS=8E*OAZH!dy^mMx%{cb#An=#*Ru0EMSH0- ze_@~JYX@o302ifXaiU6XG~>J!cr7vU8TXvZLH+m!SNv^>SIH6Aby8-MlfhGMar8Bn zn7QVFpRihUu9cs!1?LN7_}fMYIAh@=YH${8lX*5am6*BafN!)IQ;HFmoRa2W{6Q(= zuaxW0$>oV3Q(ooE(Exc|aje>iAKg4SVYItyUf52Fh z%tka;T;B|d!7*ZezeK^|(6xJmq+TKMKe(pehhzNw%vJwlu!NQdS#O|_!)5R&dwx>u zZ}dpeaa%_~w6l?LaKnG|KpBw}jsLiqqsb#>$KH|Pl$S6K3Ta^qJT%y#%~=HW{_N84 oCX5oFlMfPq%RX~(#~;QI*en_z5SD^plmGw#07*qoM6N<$f}qw+BLDyZ delta 803 zcmV+;1Kj-I1;7T77&in10002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000XP)t-sn9!hFDLHd7L6JWde-IE5V{6md00009a7bBm000id000id0mpBsWB>pH zs7XXYR7l6|l}&HcFc`;OEakkcokVY4(!V1V!f9 zHmI0yz_;XaSHFejiiEUBeaX*${QvtUw$XDu$8-Fn7);=MX7QQJ5dP`gf0Ge)6g!M_ z-%m(CLnM(u%zHD2zAM;eJWcW?>1T*IXGz$X;j^VP-Y%mNgIM%42+9&>JQIm(L<7dC zo!#Y5`V$NW(sN-9Vwn-@{^a?>>95NO-K-f~z59zx%K%E)${5^81Jz4K3QD)w>l7v4y{w7~a9J5x@*)jp+JErh8N0kZB=Wvw7xJW@v-Y zVkVO_;xM)Z*m%oGe?}ap*3mO38LXUX5K}-sMQHqMc729S1IZHEmnfqlI0WtYuihjSQFt52)3 z_#Fg6NL;2?2fv;NL2U%nAh^7;W(fM!!dClc4E8x=ueAXVVS-^mO?$j_^QbFc}0K#$tfhauv0007xNklyq0b426TR5E(-I{%>1J_zD8z?es@ytewP;KUtguf`5Izo_OMkC!ToX35~$< z0=aZ~!2{kwcLmsG#ykY{-UkHl(MnLR*ygX`y$il;Z*Gta@CY9Ca+|CCJ+Mib@lxLL zpYP4z#9-KJ`;NjPzv^oh&Nyc{Uo4E~Z({J!*Ei7N!B{D1Wg!fvm8qlX(D4q@93G;d#URsJMU%Tw#X4Y`gW2Z#&-?En+L507z^ z7%YBZtH)eX=PZE}u9704a)ekbobq*w@g3hq;I^u+J>FhJik(eFvVJ+~Ox(&Eb;aHy2(Fv@4+elu)k#dRg7f zIsB1Z?zrzcFU&4+yW0H7!^!}_FBlmR4qXE>1gnx9sl$C%)gN=|EIdqj{Y5pu;?@AD zz^I967=PFk3=Rm|-2e$dI~@>i@YMnK^ihKwg#lfbZEn+zZwc-H0eR?r;sKI(DPeU; zFi&ac>fpi&@DlYNopCuQho33iPDR8P^2 zb1dF3B9LnvRC$(!4rfg%Q{q!bKCV5d_z|rDoB9)8&dEiSEV`bfnqYHP zR$?I|g`X`e7a!&n$U4fGJ-~!Zb1 z#awYR6HsSBPgLp_R3()%xK1q(*%Bo&>fDO1Svy7*L$Y@3AJwz*{jg)AW~kI5Z~MTz z@8{kDRs`RQcjQ0^8!y7q(;j2v#v~KlJ7u=( z22yaudW<$LC0JZj)?8djL5`Cr_2T$SymG?FaXeM8ZbpvR*;a271*eDcTs_(8{_;G; zAYNu2MGnLS4iVg6er1wL6(C+-u%-wcfWz7KmEili6Tw0Wa%?6G>tD*XrTlKHt#RT*`f=2ZOdGhu-f z0W4ya$OY{M-_cA6+HE}R-gQH4TcsT0Iuf%JA+F;E^TgfGB}(MNNy6%XfHQi_ZeRYK z2);YH|9yXi8Jq1i5hs2*ld5;vLLAG$1B4Nx+<$o@up4~}p%etKKm0mzq+kZf3qrq~ z`ITEOtdAsCq176{kOT3V-#e>l70H>x8K+fOa)fC`WCQaz8R^KEFvOX!1m;-)0B>c7 z8S%BjnK}_p5Zn5V3S5P-fm+}YKB4w?a;MKj&>Be48b*wf2OYJ}H#m zKrqb0*MU>`zzm$+VKd5ynGf Date: Sun, 17 Nov 2024 09:21:01 +0000 Subject: [PATCH 12/56] Mimicry updates typing with RemoveAllTerrains() (#5666) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle_util.h | 1 + src/battle_script_commands.c | 1 + src/battle_util.c | 2 +- .../move_effect/hit_set_remove_terrain.c | 32 +++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/battle_util.h b/include/battle_util.h index ec8c03a6bdf..71d81ce3bb1 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -267,6 +267,7 @@ bool32 CanGetFrostbite(u32 battler); bool32 CanBeConfused(u32 battler); bool32 IsBattlerTerrainAffected(u32 battler, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); +void TryToRevertMimicryAndFlags(void); u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc); bool32 ChangeTypeBasedOnTerrain(u32 battler); void RemoveConfusionStatus(u32 battler); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7212560ebda..11bf05fb0fa 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8655,6 +8655,7 @@ static void RemoveAllTerrains(void) break; } gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain + TryToRevertMimicryAndFlags(); } #define DEFOG_CLEAR(status, structField, battlescript, move)\ diff --git a/src/battle_util.c b/src/battle_util.c index 3ee127f3891..de0d3e7cc66 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1612,7 +1612,7 @@ u32 GetBattlerAffectionHearts(u32 battler) return GetMonAffectionHearts(&party[gBattlerPartyIndexes[battler]]); } -static void TryToRevertMimicryAndFlags(void) +void TryToRevertMimicryAndFlags(void) { u32 i; diff --git a/test/battle/move_effect/hit_set_remove_terrain.c b/test/battle/move_effect/hit_set_remove_terrain.c index 549b6bf04fb..1efb939c344 100644 --- a/test/battle/move_effect/hit_set_remove_terrain.c +++ b/test/battle/move_effect/hit_set_remove_terrain.c @@ -124,3 +124,35 @@ AI_SINGLE_BATTLE_TEST("Ice Spinner can be chosen by the AI regardless if there i } } } + +SINGLE_BATTLE_TEST("Steel Roller and Ice Spinner reverts typing on Mimicry users") +{ + u32 j; + static const u16 terrainMoves[] = + { + MOVE_ELECTRIC_TERRAIN, + MOVE_PSYCHIC_TERRAIN, + MOVE_GRASSY_TERRAIN, + MOVE_MISTY_TERRAIN, + }; + + u16 terrainMove = MOVE_NONE; + u16 removeTerrainMove = MOVE_NONE; + + for (j = 0; j < ARRAY_COUNT(terrainMoves); j++) + { + PARAMETRIZE { removeTerrainMove = MOVE_STEEL_ROLLER; terrainMove = terrainMoves[j]; } + PARAMETRIZE { removeTerrainMove = MOVE_ICE_SPINNER; terrainMove = terrainMoves[j]; } + } + + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALARIAN].types[1] == TYPE_STEEL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_STUNFISK_GALARIAN) { Ability(ABILITY_MIMICRY); } + } WHEN { + TURN { MOVE(opponent, terrainMove); MOVE(player, removeTerrainMove); } + TURN { MOVE(player, MOVE_TOXIC); } + } SCENE { + MESSAGE("It doesn't affect Foe Stunfisk…"); + } +} From 9f1b9008095e6900fe8e9a947a94074ee4bab860 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 17 Nov 2024 20:36:55 +0100 Subject: [PATCH 13/56] Fixes Ice Face regression (#5678) --- src/battle_script_commands.c | 1 - test/battle/ability/ice_face.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 11bf05fb0fa..c373778b68a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7372,7 +7372,6 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler) break; case ABILITY_FORECAST: case ABILITY_FLOWER_GIFT: - case ABILITY_ICE_FACE: case ABILITY_PROTOSYNTHESIS: if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, 0, 0, 0)) return TRUE; diff --git a/test/battle/ability/ice_face.c b/test/battle/ability/ice_face.c index 54a307754c9..22b67a7a536 100644 --- a/test/battle/ability/ice_face.c +++ b/test/battle/ability/ice_face.c @@ -135,3 +135,33 @@ SINGLE_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is MESSAGE("Eiscue fainted!"); } } + +SINGLE_BATTLE_TEST("Ice Face is not restored if hail or snow and Eiscue are already out") +{ + u32 move; + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + PARAMETRIZE { move = MOVE_HAIL; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE); + ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL); + PLAYER(SPECIES_EISCUE); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, move); } + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + NONE_OF { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + MESSAGE("Eiscue transformed!"); + } + } +} From 70ca5060f9c281e2916b3f45badce27d69d1b47f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 18 Nov 2024 23:18:26 +0100 Subject: [PATCH 14/56] Fixes wrong Id when AI chooses mon to switch in (#5684) --- src/battle_controller_opponent.c | 35 ++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index ef12589681a..b6ffd67b75a 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -648,6 +648,22 @@ static void OpponentHandleChooseItem(u32 battler) OpponentBufferExecCompleted(battler); } +static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) +{ + return AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_ACE_POKEMON + && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) + && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle; +} + +static inline bool32 IsDoubleAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) +{ + return AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON + && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) + && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 2) + && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle + && CountAIAliveNonEggMonsExcept(PARTY_SIZE-1) != pokemonInBattle; +} + static void OpponentHandleChoosePokemon(u32 battler) { s32 chosenMonId; @@ -680,20 +696,14 @@ static void OpponentHandleChoosePokemon(u32 battler) GetAIPartyIndexes(battler, &firstId, &lastId); for (chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) { - if (!IsValidForBattle(&gEnemyParty[chosenMonId])) - continue; - if (chosenMonId == gBattlerPartyIndexes[battler1] + if (!IsValidForBattle(&gEnemyParty[chosenMonId]) + || chosenMonId == gBattlerPartyIndexes[battler1] || chosenMonId == gBattlerPartyIndexes[battler2]) continue; - if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_ACE_POKEMON) - && ((chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) || CountAIAliveNonEggMonsExcept(PARTY_SIZE) == pokemonInBattle)) - continue; - if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON) - && (((chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) || (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 2)) - || (CountAIAliveNonEggMonsExcept(PARTY_SIZE) == pokemonInBattle || CountAIAliveNonEggMonsExcept(PARTY_SIZE-1) == pokemonInBattle))) - continue; - // mon is valid - break; + + if (!IsAcePokemon(chosenMonId, pokemonInBattle, battler) + && !IsDoubleAcePokemon(chosenMonId, pokemonInBattle, battler)) + break; } } gBattleStruct->monToSwitchIntoId[battler] = chosenMonId; @@ -709,7 +719,6 @@ static void OpponentHandleChoosePokemon(u32 battler) #endif // TESTING BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, chosenMonId, NULL); OpponentBufferExecCompleted(battler); - } static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore) From 5fe39f6019746449f11e43923c119ddff6e8c6d6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 19 Nov 2024 14:34:20 -0300 Subject: [PATCH 15/56] Fixed incoming master tests --- test/battle/move_effect/hit_set_remove_terrain.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/battle/move_effect/hit_set_remove_terrain.c b/test/battle/move_effect/hit_set_remove_terrain.c index fe40ec0151e..a48d316d3f6 100644 --- a/test/battle/move_effect/hit_set_remove_terrain.c +++ b/test/battle/move_effect/hit_set_remove_terrain.c @@ -146,13 +146,13 @@ SINGLE_BATTLE_TEST("Steel Roller and Ice Spinner reverts typing on Mimicry users } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALARIAN].types[1] == TYPE_STEEL); + ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[1] == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_STUNFISK_GALARIAN) { Ability(ABILITY_MIMICRY); } + OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { TURN { MOVE(opponent, terrainMove); MOVE(player, removeTerrainMove); } TURN { MOVE(player, MOVE_TOXIC); } } SCENE { - MESSAGE("It doesn't affect Foe Stunfisk…"); + MESSAGE("It doesn't affect the opposing Stunfisk…"); } } From 572ea141af83caf2f57d50c4e74cb493fb306c88 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 19 Nov 2024 20:56:34 +0100 Subject: [PATCH 16/56] Fixes Absorb regression caused by #5670 (#5688) --- data/battle_scripts_1.s | 1 - src/battle_script_commands.c | 1 + test/battle/move_effect/absorb.c | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 97dd650088b..8d24dc472d5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3022,7 +3022,6 @@ BattleScript_EffectAbsorb:: printfromtable gAbsorbDrainStringIds waitmessage B_WAIT_TIME_LONG tryfaintmon BS_ATTACKER - tryfaintmon BS_TARGET return BattleScript_EffectExplosion:: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 69e41c62d6a..2958d200abe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5727,6 +5727,7 @@ static void Cmd_moveend(void) gBattleMoveDamage = 1; gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; + effect = TRUE; if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIQUID_OOZE) { gBattleMoveDamage *= -1; diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 70c1b621afc..d046876b1b2 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -107,7 +107,6 @@ DOUBLE_BATTLE_TEST("Matcha Gatcha will faint the pokemon if Liquid Ooze drain de } } - SINGLE_BATTLE_TEST("Draining Kiss recovers 75% of the damage dealt") { s16 damage; From 2f7116531bd0be2d9cbddc95d177ba75210c6226 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:12:49 +0100 Subject: [PATCH 17/56] Wrong assumtion in dauntless_shield.c (#5692) --- test/battle/ability/dauntless_shield.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/battle/ability/dauntless_shield.c b/test/battle/ability/dauntless_shield.c index ff7cc723acb..0e6adedfd26 100644 --- a/test/battle/ability/dauntless_shield.c +++ b/test/battle/ability/dauntless_shield.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(B_PROTEAN_LIBERO == GEN_9); + ASSUME(B_DAUNTLESS_SHIELD == GEN_9); } SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage") From 81442e32e23818e30abad25cb68f40bdb4f04c3b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:46:50 +0100 Subject: [PATCH 18/56] Changes name of B_SCR_NAME_WITH_PREFIX (#5675) --- charmap.txt | 4 +- src/battle_message.c | 188 +++++++++++++++++++++---------------------- 2 files changed, 96 insertions(+), 96 deletions(-) diff --git a/charmap.txt b/charmap.txt index e8e43dc9965..63c2f6ebe10 100644 --- a/charmap.txt +++ b/charmap.txt @@ -370,7 +370,7 @@ B_ATK_NAME_WITH_PREFIX = FD 0F B_DEF_NAME_WITH_PREFIX = FD 10 B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler @ FD 12 - preiously gActiveBattler with prefix -B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13 +B_SCR_NAME_WITH_PREFIX = FD 13 B_CURRENT_MOVE = FD 14 B_LAST_MOVE = FD 15 B_LAST_ITEM = FD 16 @@ -416,7 +416,7 @@ B_DEF_TEAM2 = FD 3B B_ATK_NAME_WITH_PREFIX2 = FD 3E B_DEF_NAME_WITH_PREFIX2 = FD 3F B_EFF_NAME_WITH_PREFIX2 = FD 40 -B_SCR_ACTIVE_NAME_WITH_PREFIX2 = FD 41 +B_SCR_NAME_WITH_PREFIX2 = FD 41 B_TRAINER1_NAME_WITH_CLASS = FD 42 B_TRAINER2_NAME_WITH_CLASS = FD 43 B_PARTNER_NAME_WITH_CLASS = FD 44 diff --git a/src/battle_message.c b/src/battle_message.c index 6b045bae808..761770d4408 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -192,30 +192,30 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = #else [STRINGID_PLAYERWHITEOUT2] = COMPOUND_STRING("You were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), #endif - [STRINGID_PREVENTSESCAPE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents escape with {B_SCR_ACTIVE_ABILITY}!\p"), + [STRINGID_PREVENTSESCAPE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} prevents escape with {B_SCR_ACTIVE_ABILITY}!\p"), [STRINGID_HITXTIMES] = COMPOUND_STRING("The Pokémon was hit {B_BUFF1} time(s)!"), //SV has dynamic plural here [STRINGID_PKMNFELLASLEEP] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} fell asleep!"), - [STRINGID_PKMNMADESLEEP] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} made {B_EFF_NAME_WITH_PREFIX2} sleep!"), //not in gen 5+, ability popup + [STRINGID_PKMNMADESLEEP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} made {B_EFF_NAME_WITH_PREFIX2} sleep!"), //not in gen 5+, ability popup [STRINGID_PKMNALREADYASLEEP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already asleep!"), [STRINGID_PKMNALREADYASLEEP2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is already asleep!"), [STRINGID_PKMNWASNTAFFECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} wasn't affected!"), //not in gen 5+, ability popup [STRINGID_PKMNWASPOISONED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was poisoned!"), - [STRINGID_PKMNPOISONEDBY] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was poisoned by {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), //not in gen 5+, ability popup + [STRINGID_PKMNPOISONEDBY] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was poisoned by {B_SCR_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), //not in gen 5+, ability popup [STRINGID_PKMNHURTBYPOISON] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by its poisoning!"), [STRINGID_PKMNALREADYPOISONED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already poisoned!"), [STRINGID_PKMNBADLYPOISONED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was badly poisoned!"), [STRINGID_PKMNENERGYDRAINED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} had its energy drained!"), [STRINGID_PKMNWASBURNED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was burned!"), - [STRINGID_PKMNBURNEDBY] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} burned {B_EFF_NAME_WITH_PREFIX2}!"), //not in gen 5+, ability popup + [STRINGID_PKMNBURNEDBY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} burned {B_EFF_NAME_WITH_PREFIX2}!"), //not in gen 5+, ability popup [STRINGID_PKMNHURTBYBURN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by its burn!"), [STRINGID_PKMNWASFROZEN] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} was frozen solid!"), - [STRINGID_PKMNFROZENBY] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} froze {B_EFF_NAME_WITH_PREFIX2} solid!"), //not in gen 5+, ability popup + [STRINGID_PKMNFROZENBY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} froze {B_EFF_NAME_WITH_PREFIX2} solid!"), //not in gen 5+, ability popup [STRINGID_PKMNISFROZEN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is frozen solid!"), [STRINGID_PKMNWASDEFROSTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} thawed out!"), [STRINGID_PKMNWASDEFROSTED2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} thawed out!"), [STRINGID_PKMNWASDEFROSTEDBY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} melted the ice!"), [STRINGID_PKMNWASPARALYZED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} is paralyzed, so it may be unable to move!"), - [STRINGID_PKMNWASPARALYZEDBY] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} paralyzed {B_EFF_NAME_WITH_PREFIX2}, so it may be unable to move!"), //not in gen 5+, ability popup + [STRINGID_PKMNWASPARALYZEDBY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} paralyzed {B_EFF_NAME_WITH_PREFIX2}, so it may be unable to move!"), //not in gen 5+, ability popup [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!"), @@ -229,7 +229,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNWASCONFUSED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} became confused!"), [STRINGID_PKMNALREADYCONFUSED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already confused!"), [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_ACTIVE_NAME_WITH_PREFIX2}!"), + [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!"), @@ -239,7 +239,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNRAISEDSPDEF] = COMPOUND_STRING("Light Screen made {B_ATK_TEAM2} team stronger against special moves!"), [STRINGID_PKMNRAISEDDEF] = COMPOUND_STRING("Reflect made {B_ATK_TEAM2} team stronger against physical moves!"), [STRINGID_PKMNCOVEREDBYVEIL] = COMPOUND_STRING("{B_ATK_TEAM1} team cloaked itself in a mystical veil!"), - [STRINGID_PKMNUSEDSAFEGUARD] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected by Safeguard!"), + [STRINGID_PKMNUSEDSAFEGUARD] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is protected by Safeguard!"), [STRINGID_PKMNSAFEGUARDEXPIRED] = COMPOUND_STRING("{B_ATK_TEAM1} team is no longer protected by Safeguard!"), [STRINGID_PKMNWENTTOSLEEP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} went to sleep!"), //not in gen 5+ [STRINGID_PKMNSLEPTHEALTHY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} slept and restored its HP!"), @@ -257,7 +257,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNFREEDFROM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was freed from {B_BUFF1}!"), [STRINGID_PKMNCRASHED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} kept going and crashed!"), [STRINGID_PKMNSHROUDEDINMIST] = gText_PkmnShroudedInMist, - [STRINGID_PKMNPROTECTEDBYMIST] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected by the mist!"), + [STRINGID_PKMNPROTECTEDBYMIST] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is protected by the mist!"), [STRINGID_PKMNGETTINGPUMPED] = gText_PkmnGettingPumped, [STRINGID_PKMNHITWITHRECOIL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was damaged by the recoil!"), [STRINGID_PKMNPROTECTEDITSELF2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} protected itself!"), @@ -268,7 +268,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNSAPPEDBYLEECHSEED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s health is sapped by Leech Seed!"), [STRINGID_PKMNFASTASLEEP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is fast asleep."), [STRINGID_PKMNWOKEUP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} woke up!"), - [STRINGID_PKMNUPROARKEPTAWAKE] = COMPOUND_STRING("But the uproar kept {B_SCR_ACTIVE_NAME_WITH_PREFIX2} awake!"), + [STRINGID_PKMNUPROARKEPTAWAKE] = COMPOUND_STRING("But the uproar kept {B_SCR_NAME_WITH_PREFIX2} awake!"), [STRINGID_PKMNWOKEUPINUPROAR] = COMPOUND_STRING("The uproar woke {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNCAUSEDUPROAR] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} caused an uproar!"), [STRINGID_PKMNMAKINGUPROAR] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is making an uproar!"), @@ -308,7 +308,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNLAIDCURSE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} cut its own HP and put a curse on {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNAFFLICTEDBYCURSE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is afflicted by the curse!"), [STRINGID_SPIKESSCATTERED] = COMPOUND_STRING("Spikes were scattered on the ground all around {B_DEF_TEAM2} team!"), - [STRINGID_PKMNHURTBYSPIKES] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was hurt by the spikes!"), + [STRINGID_PKMNHURTBYSPIKES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was hurt by the spikes!"), [STRINGID_PKMNIDENTIFIED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was identified!"), [STRINGID_PKMNPERISHCOUNTFELL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s perish count fell to {B_BUFF1}!"), [STRINGID_PKMNBRACEDITSELF] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} braced itself!"), @@ -351,9 +351,9 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNSHROUDEDITSELF] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} shrouded itself with Magic Coat!"), [STRINGID_PKMNMOVEBOUNCED] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} bounced the {B_CURRENT_MOVE} back!"), [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_ACTIVE_NAME_WITH_PREFIX2}'s move!"), - [STRINGID_PKMNMADEITRAIN] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it rain!"), //not in gen 5+, ability popup - [STRINGID_PKMNRAISEDSPEED] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its Speed!"), //not in gen 5+, ability popup + [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_ACTIVE_ABILITY} made it rain!"), //not in gen 5+, ability popup + [STRINGID_PKMNRAISEDSPEED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_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 @@ -364,8 +364,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [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 - [STRINGID_PKMNCUTSATTACKWITH] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"), //not in gen 5+, ability popup - [STRINGID_PKMNPREVENTSSTATLOSSWITH] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents stat loss!"), //not in gen 5+, ability popup + [STRINGID_PKMNCUTSATTACKWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cuts {B_DEF_NAME_WITH_PREFIX2}'s Attack!"), //not in gen 5+, ability popup + [STRINGID_PKMNPREVENTSSTATLOSSWITH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents stat loss!"), //not in gen 5+, ability popup [STRINGID_PKMNHURTSWITH] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), [STRINGID_PKMNTRACED] = COMPOUND_STRING("It traced {B_BUFF1}'s {B_BUFF2}!"), [STRINGID_STATSHARPLY] = gText_StatSharply, @@ -450,30 +450,30 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNIGNOREDX] = COMPOUND_STRING("{B_OPPONENT_MON1_NAME} completely ignored the {B_BUFF1}!"), //safari [STRINGID_THREWPOKEBLOCKATPKMN] = COMPOUND_STRING("{B_PLAYER_NAME} threw a {POKEBLOCK} at the {B_OPPONENT_MON1_NAME}!"), //safari [STRINGID_OUTOFSAFARIBALLS] = COMPOUND_STRING("{PLAY_SE SE_DING_DONG}ANNOUNCER: You're out of Safari Balls! Game over!\p"), //safari - [STRINGID_PKMNSITEMCUREDPARALYSIS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its paralysis!"), - [STRINGID_PKMNSITEMCUREDPOISON] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its poison!"), - [STRINGID_PKMNSITEMHEALEDBURN] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its burn!"), - [STRINGID_PKMNSITEMDEFROSTEDIT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} defrosted it!"), - [STRINGID_PKMNSITEMWOKEIT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} woke it up!"), - [STRINGID_PKMNSITEMSNAPPEDOUT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} snapped it out of its confusion!"), - [STRINGID_PKMNSITEMCUREDPROBLEM] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its {B_BUFF1} problem!"), - [STRINGID_PKMNSITEMRESTOREDHEALTH] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored its health using its {B_LAST_ITEM}!"), - [STRINGID_PKMNSITEMRESTOREDPP] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored PP to its move {B_BUFF1} using its {B_LAST_ITEM}!"), - [STRINGID_PKMNSITEMRESTOREDSTATUS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} returned its stats to normal using its {B_LAST_ITEM}!"), - [STRINGID_PKMNSITEMRESTOREDHPALITTLE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored a little HP using its {B_LAST_ITEM}!"), + [STRINGID_PKMNSITEMCUREDPARALYSIS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its paralysis!"), + [STRINGID_PKMNSITEMCUREDPOISON] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its poison!"), + [STRINGID_PKMNSITEMHEALEDBURN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its burn!"), + [STRINGID_PKMNSITEMDEFROSTEDIT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} defrosted it!"), + [STRINGID_PKMNSITEMWOKEIT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} woke it up!"), + [STRINGID_PKMNSITEMSNAPPEDOUT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} snapped it out of its confusion!"), + [STRINGID_PKMNSITEMCUREDPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its {B_BUFF1} problem!"), + [STRINGID_PKMNSITEMRESTOREDHEALTH] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} restored its health using its {B_LAST_ITEM}!"), + [STRINGID_PKMNSITEMRESTOREDPP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} restored PP to its move {B_BUFF1} using its {B_LAST_ITEM}!"), + [STRINGID_PKMNSITEMRESTOREDSTATUS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} returned its stats to normal using its {B_LAST_ITEM}!"), + [STRINGID_PKMNSITEMRESTOREDHPALITTLE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} restored a little HP using its {B_LAST_ITEM}!"), [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_EFF_NAME_WITH_PREFIX}'s {B_EFF_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_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} whipped up a sandstorm!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXPREVENTSYLOSS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_BUFF1} loss!"), //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 + [STRINGID_PKMNSXPREVENTSYLOSS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_BUFF1} loss!"), //not in gen 5+, ability popup [STRINGID_PKMNSXINFATUATEDY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} infatuated {B_ATK_NAME_WITH_PREFIX2}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXMADEYINEFFECTIVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} made {B_CURRENT_MOVE} ineffective!"), //not in gen 5+, ability popup - [STRINGID_PKMNSXCUREDYPROBLEM] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXCUREDYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup [STRINGID_ITSUCKEDLIQUIDOOZE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} sucked up the liquid ooze!"), - [STRINGID_PKMNTRANSFORMED] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} transformed!"), + [STRINGID_PKMNTRANSFORMED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} transformed!"), [STRINGID_ELECTRICITYWEAKENED] = COMPOUND_STRING("Electricity's power was weakened!"), [STRINGID_FIREWEAKENED] = COMPOUND_STRING("Fire's power was weakened!"), [STRINGID_PKMNHIDUNDERWATER] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} hid underwater!"), @@ -483,14 +483,14 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_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_ACTIVE_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_ACTIVE_NAME_WITH_PREFIX2} {B_BUFF2}"), //todo: update this, will require code changes - [STRINGID_PKMNUSEDXTOGETPUMPED] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used the {B_LAST_ITEM} to get pumped!"), + [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 [STRINGID_PKMNTRAPPEDBYSANDTOMB] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} became trapped by the quicksand!"), [STRINGID_EMPTYSTRING4] = COMPOUND_STRING(""), [STRINGID_ABOOSTED] = COMPOUND_STRING(" a boosted"), - [STRINGID_PKMNSXINTENSIFIEDSUN] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} intensified the sun's rays!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXINTENSIFIEDSUN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} intensified the sun's rays!"), //not in gen 5+, ability popup [STRINGID_PKMNMAKESGROUNDMISS] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} makes Ground-type moves miss with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_YOUTHROWABALLNOWRIGHT] = COMPOUND_STRING("You throw a Ball now, right? I… I'll do my best!"), [STRINGID_PKMNSXTOOKATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} took the attack!"), //In gen 5+ but without naming the ability @@ -500,35 +500,35 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_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_ACTIVE_NAME_WITH_PREFIX2}'s {B_BUFF1} from working!"), //unused - [STRINGID_PKMNSITEMNORMALIZEDSTATUS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} normalized its status!"), + [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"), [STRINGID_PKMNAVOIDEDATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} avoided the attack!"), - [STRINGID_PKMNSXMADEITINEFFECTIVE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it ineffective!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXMADEITINEFFECTIVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} made it ineffective!"), //not in gen 5+, ability popup [STRINGID_PKMNSXPREVENTSFLINCHING] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} prevents flinching!"), //not in gen 5+, ability popup [STRINGID_PKMNALREADYHASBURN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already burned!"), [STRINGID_STATSWONTDECREASE2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s stats won't go any lower!"), - [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup + [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_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup + [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("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} had no effect on {B_EFF_NAME_WITH_PREFIX2}!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXHADNOEFFECTONY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} had no effect on {B_EFF_NAME_WITH_PREFIX2}!"), //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!"), - [STRINGID_GLINTAPPEARSINEYE] = COMPOUND_STRING("A glint appears in {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s eyes!"), - [STRINGID_PKMNGETTINGINTOPOSITION] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is getting into position!"), - [STRINGID_PKMNBEGANGROWLINGDEEPLY] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!"), - [STRINGID_PKMNEAGERFORMORE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!"), + [STRINGID_GLINTAPPEARSINEYE] = COMPOUND_STRING("A glint appears in {B_SCR_NAME_WITH_PREFIX2}'s eyes!"), + [STRINGID_PKMNGETTINGINTOPOSITION] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is getting into position!"), + [STRINGID_PKMNBEGANGROWLINGDEEPLY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} began growling deeply!"), + [STRINGID_PKMNEAGERFORMORE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is eager for more!"), [STRINGID_DEFEATEDOPPONENTBYREFEREE] = COMPOUND_STRING("{B_PLAYER_MON1_NAME} defeated the opponent {B_OPPONENT_MON1_NAME} in a REFEREE's decision!"), [STRINGID_LOSTTOOPPONENTBYREFEREE] = COMPOUND_STRING("{B_PLAYER_MON1_NAME} lost to the opponent {B_OPPONENT_MON1_NAME} in a REFEREE's decision!"), [STRINGID_TIEDOPPONENTBYREFEREE] = COMPOUND_STRING("{B_PLAYER_MON1_NAME} tied the opponent {B_OPPONENT_MON1_NAME} in a REFEREE's decision!"), @@ -584,7 +584,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [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_ACTIVE_NAME_WITH_PREFIX2} switched places!"), + [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!"), [STRINGID_FREEDFROMSKYDROP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} was freed from the Sky Drop!"), @@ -613,15 +613,15 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_ATTACKERABILITYSTATRAISE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} 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_ACTIVE_NAME_WITH_PREFIX} breaks the mold!"), - [STRINGID_TERAVOLTENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a bursting aura!"), - [STRINGID_TURBOBLAZEENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a blazing aura!"), - [STRINGID_SLOWSTARTENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is slow to get going!"), + [STRINGID_MOLDBREAKERENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} breaks the mold!"), + [STRINGID_TERAVOLTENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is radiating a bursting aura!"), + [STRINGID_TURBOBLAZEENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is radiating a blazing aura!"), + [STRINGID_SLOWSTARTENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is slow to get going!"), [STRINGID_SLOWSTARTEND] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} finally got its act together!"), [STRINGID_SOLARPOWERHPDROP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} takes its toll!"), //don't think this message is displayed anymore [STRINGID_AFTERMATHDMG] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt!"), - [STRINGID_ANTICIPATIONACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shuddered!"), - [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_ABILITY} alerted {B_SCR_ACTIVE_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), + [STRINGID_ANTICIPATIONACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} shuddered!"), + [STRINGID_FOREWARNACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_ABILITY} alerted {B_SCR_NAME_WITH_PREFIX2} to {B_DEF_NAME_WITH_PREFIX2}'s {B_BUFF1}!"), [STRINGID_ICEBODYHPGAIN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} healed it a little bit!"), //don't think this message is displayed anymore [STRINGID_SNOWWARNINGHAIL] = COMPOUND_STRING("It started to hail!"), [STRINGID_FRISKACTIVATES] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} frisked {B_DEF_NAME_WITH_PREFIX2} and found its {B_LAST_ITEM}!"), @@ -630,11 +630,11 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_LASTABILITYRAISEDSTAT] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_LAST_ABILITY} raised its {B_BUFF1}!"), [STRINGID_MAGICBOUNCEACTIVATES] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} bounced the {B_ATK_NAME_WITH_PREFIX2} back!"), [STRINGID_PROTEANTYPECHANGE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} transformed it into the {B_BUFF1} type!"), - [STRINGID_SYMBIOSISITEMPASS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} passed its {B_LAST_ITEM} to {B_ATK_NAME_WITH_PREFIX2} through {B_LAST_ABILITY}!"), - [STRINGID_STEALTHROCKDMG] = COMPOUND_STRING("Pointed stones dug into {B_SCR_ACTIVE_NAME_WITH_PREFIX2}!"), + [STRINGID_SYMBIOSISITEMPASS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} passed its {B_LAST_ITEM} to {B_ATK_NAME_WITH_PREFIX2} through {B_LAST_ABILITY}!"), + [STRINGID_STEALTHROCKDMG] = COMPOUND_STRING("Pointed stones dug into {B_SCR_NAME_WITH_PREFIX2}!"), [STRINGID_TOXICSPIKESABSORBED] = COMPOUND_STRING("The poison spikes disappeared from the ground around {B_ATK_TEAM2} team!"), - [STRINGID_TOXICSPIKESPOISONED] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was poisoned!"), - [STRINGID_STICKYWEBSWITCHIN] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was caught in a sticky web!"), + [STRINGID_TOXICSPIKESPOISONED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was poisoned!"), + [STRINGID_STICKYWEBSWITCHIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was caught in a sticky web!"), [STRINGID_HEALINGWISHCAMETRUE] = COMPOUND_STRING("The healing wish came true for {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_HEALINGWISHHEALED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} regained health!"), [STRINGID_LUNARDANCECAMETRUE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became cloaked in mystical moonlight!"), @@ -666,7 +666,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_SEVERELY] = gText_severely, [STRINGID_INFESTATION] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} has been afflicted with an infestation by {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_NOEFFECTONTARGET] = COMPOUND_STRING("It won't have any effect on {B_DEF_NAME_WITH_PREFIX2}!"), - [STRINGID_BURSTINGFLAMESHIT] = COMPOUND_STRING("The bursting flames hit {B_SCR_ACTIVE_NAME_WITH_PREFIX2}!"), + [STRINGID_BURSTINGFLAMESHIT] = COMPOUND_STRING("The bursting flames hit {B_SCR_NAME_WITH_PREFIX2}!"), [STRINGID_BESTOWITEMGIVING] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} received {B_LAST_ITEM} from {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_THIRDTYPEADDED] = COMPOUND_STRING("{B_BUFF1} type was added to {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_FELLFORFEINT] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} fell for the feint!"), @@ -692,46 +692,46 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_GEMACTIVATES] = COMPOUND_STRING("The {B_LAST_ITEM} strengthened {B_ATK_NAME_WITH_PREFIX2}'s power!"), [STRINGID_BERRYDMGREDUCES] = COMPOUND_STRING("The {B_LAST_ITEM} weakened the damage to {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_TARGETATEITEM] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} ate its {B_LAST_ITEM}!"), - [STRINGID_AIRBALLOONFLOAT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} floats in the air with its Air Balloon!"), + [STRINGID_AIRBALLOONFLOAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} floats in the air with its Air Balloon!"), [STRINGID_AIRBALLOONPOP] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s Air Balloon popped!"), [STRINGID_INCINERATEBURN] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_LAST_ITEM} was burnt up!"), [STRINGID_BUGBITE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} stole and ate its target's {B_LAST_ITEM}!"), [STRINGID_ILLUSIONWOREOFF] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s illusion wore off!"), [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_ACTIVE_NAME_WITH_PREFIX2}'s problem!"), - [STRINGID_SCRIPTINGABILITYSTATRAISE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!"), - [STRINGID_RECEIVERABILITYTAKEOVER] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} was taken over!"), + [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_ACTIVE_ABILITY} raised its {B_BUFF1}!"), + [STRINGID_RECEIVERABILITYTAKEOVER] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_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!"), - [STRINGID_DESTINYKNOTACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} fell in love because of the {B_LAST_ITEM}!"), + [STRINGID_DESTINYKNOTACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} fell in love because of the {B_LAST_ITEM}!"), [STRINGID_CLOAKEDINAFREEZINGLIGHT] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became cloaked in a freezing light!"), [STRINGID_CLEARAMULETWONTLOWERSTATS] = COMPOUND_STRING("The effects of the {B_LAST_ITEM} held by {B_DEF_NAME_WITH_PREFIX2} prevents its stats from being lowered!"), [STRINGID_FERVENTWISHREACHED] = COMPOUND_STRING("{B_ATK_TRAINER_NAME}'s fervent wish has reached {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_AIRLOCKACTIVATES] = COMPOUND_STRING("The effects of the weather disappeared."), - [STRINGID_PRESSUREENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is exerting its pressure!"), - [STRINGID_DARKAURAENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a dark aura!"), - [STRINGID_FAIRYAURAENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating a fairy aura!"), - [STRINGID_AURABREAKENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all other Pokémon's auras!"), - [STRINGID_COMATOSEENTERS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!"), + [STRINGID_PRESSUREENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is exerting its pressure!"), + [STRINGID_DARKAURAENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is radiating a dark aura!"), + [STRINGID_FAIRYAURAENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} is radiating a fairy aura!"), + [STRINGID_AURABREAKENTERS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} reversed all other Pokémon's auras!"), + [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_ACTIVE_NAME_WITH_PREFIX} found a {B_LAST_ITEM}!"), - [STRINGID_BATTLERABILITYRAISEDSTAT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} raised its {B_BUFF1}!"), + [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_ACTIVE_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_ACTIVE_NAME_WITH_PREFIX} has two Abilities!"), + [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!"), [STRINGID_CANACTFASTERTHANKSTO] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can act faster than normal, thanks to its {B_BUFF1}!"), - [STRINGID_MICLEBERRYACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted the accuracy of its next move using {B_LAST_ITEM}!"), - [STRINGID_PKMNSHOOKOFFTHETAUNT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} shook off the taunt!"), - [STRINGID_PKMNGOTOVERITSINFATUATION] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} got over its infatuation!"), + [STRINGID_MICLEBERRYACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} boosted the accuracy of its next move using {B_LAST_ITEM}!"), + [STRINGID_PKMNSHOOKOFFTHETAUNT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} shook off the taunt!"), + [STRINGID_PKMNGOTOVERITSINFATUATION] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} got over its infatuation!"), [STRINGID_ITEMCANNOTBEREMOVED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s item cannot be removed!"), [STRINGID_STICKYBARBTRANSFER] = COMPOUND_STRING("The {B_LAST_ITEM} attached itself to {B_ATK_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNBURNHEALED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s burn was cured!"), - [STRINGID_REDCARDACTIVATE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} held up its Red Card against {B_ATK_NAME_WITH_PREFIX2}!"), - [STRINGID_EJECTBUTTONACTIVATE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is switched out with the {B_LAST_ITEM}!"), + [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!"), @@ -750,7 +750,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_MYSTERIOUSAIRCURRENTBLOWSON] = COMPOUND_STRING("The mysterious strong winds blow on regardless!"), [STRINGID_ATTACKWEAKENEDBSTRONGWINDS] = COMPOUND_STRING("The mysterious strong winds weakened the attack!"), [STRINGID_STUFFCHEEKSCANTSELECT] = COMPOUND_STRING("It can't use the move because it doesn't have a Berry!\p"), - [STRINGID_PKMNREVERTEDTOPRIMAL] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s Primal Reversion! It reverted to its primal state!"), + [STRINGID_PKMNREVERTEDTOPRIMAL] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s Primal Reversion! It reverted to its primal state!"), [STRINGID_BUTPOKEMONCANTUSETHEMOVE] = COMPOUND_STRING("But {B_ATK_NAME_WITH_PREFIX2} can't use the move!"), [STRINGID_BUTHOOPACANTUSEIT] = COMPOUND_STRING("But {B_ATK_NAME_WITH_PREFIX2} can't use it the way it is now!"), [STRINGID_BROKETHROUGHPROTECTION] = COMPOUND_STRING("It broke through {B_DEF_NAME_WITH_PREFIX2}'s protection!"), @@ -758,7 +758,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [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_ACTIVE_NAME_WITH_PREFIX}'s type changed to {B_BUFF1}!"), + [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!"), [STRINGID_CANTESCAPEDUETOUSEDMOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can no longer escape because it used No Retreat!"), [STRINGID_PKMNBECAMEWEAKERTOFIRE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} became weaker to fire!"), @@ -776,12 +776,12 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PLAYERPAIDPRIZEMONEY] = COMPOUND_STRING("You gave ¥{B_BUFF1} to the winner…\pYou were overwhelmed by your defeat!{PAUSE_UNTIL_PRESS}"), [STRINGID_ZPOWERSURROUNDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} surrounded itself with its Z-Power!"), [STRINGID_ZMOVEUNLEASHED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} unleashes its full-force Z-Move!"), - [STRINGID_ZMOVERESETSSTATS] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} returned its decreased stats to normal using its Z-Power!"), - [STRINGID_ZMOVEALLSTATSUP] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted its stats using its Z-Power!"), - [STRINGID_ZMOVEZBOOSTCRIT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted its critical-hit ratio using its Z-Power!"), - [STRINGID_ZMOVERESTOREHP] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} restored its HP using its Z-Power!"), - [STRINGID_ZMOVESTATUP] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} boosted its stats using its Z-Power!"), - [STRINGID_ZMOVEHPTRAP] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s HP was restored by the Z-Power!"), + [STRINGID_ZMOVERESETSSTATS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} returned its decreased stats to normal using its Z-Power!"), + [STRINGID_ZMOVEALLSTATSUP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} boosted its stats using its Z-Power!"), + [STRINGID_ZMOVEZBOOSTCRIT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} boosted its critical-hit ratio using its Z-Power!"), + [STRINGID_ZMOVERESTOREHP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} restored its HP using its Z-Power!"), + [STRINGID_ZMOVESTATUP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} boosted its stats using its Z-Power!"), + [STRINGID_ZMOVEHPTRAP] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s HP was restored by the Z-Power!"), [STRINGID_ATTACKEREXPELLEDTHEPOISON] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} managed to expel the poison so you wouldn't worry!"), [STRINGID_ATTACKERSHOOKITSELFAWAKE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} shook itself awake so you wouldn't worry!"), [STRINGID_ATTACKERBROKETHROUGHPARALYSIS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} gathered all its energy to break through its paralysis so you wouldn't worry!"), @@ -791,12 +791,12 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_ATTACKERLOSTELECTRICTYPE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} used up all its electricity!"), [STRINGID_ATTACKERSWITCHEDSTATWITHTARGET] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} switched {B_BUFF1} with its target!"), [STRINGID_BEINGHITCHARGEDPKMNWITHPOWER] = COMPOUND_STRING("Being hit by {B_CURRENT_MOVE} charged {B_DEF_NAME_WITH_PREFIX2} with power!"), - [STRINGID_SUNLIGHTACTIVATEDABILITY] = COMPOUND_STRING("The harsh sunlight activated {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s Protosynthesis!"), - [STRINGID_STATWASHEIGHTENED] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!"), - [STRINGID_ELECTRICTERRAINACTIVATEDABILITY] = COMPOUND_STRING("The Electric Terrain activated {B_SCR_ACTIVE_NAME_WITH_PREFIX2}'s Quark Drive!"), - [STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} weakened the {B_BUFF1} of all surrounding Pokémon!\p"), - [STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} gained strength from the fallen!"), - [STRINGID_PKMNSABILITYPREVENTSABILITY] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), //not in gen 5+, ability popup + [STRINGID_SUNLIGHTACTIVATEDABILITY] = COMPOUND_STRING("The harsh sunlight activated {B_SCR_NAME_WITH_PREFIX2}'s Protosynthesis!"), + [STRINGID_STATWASHEIGHTENED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} was heightened!"), + [STRINGID_ELECTRICTERRAINACTIVATEDABILITY] = COMPOUND_STRING("The Electric Terrain activated {B_SCR_NAME_WITH_PREFIX2}'s Quark Drive!"), + [STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} weakened the {B_BUFF1} of all surrounding Pokémon!\p"), + [STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} gained strength from the fallen!"), + [STRINGID_PKMNSABILITYPREVENTSABILITY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ACTIVE_ABILITY} prevents {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY} from working!"), //not in gen 5+, ability popup [STRINGID_PREPARESHELLTRAP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} set a shell trap!"), [STRINGID_SHELLTRAPDIDNTWORK] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s shell trap didn't work!"), [STRINGID_SPIKESDISAPPEAREDFROMTEAM] = COMPOUND_STRING("The spikes disappeared from the ground around {B_ATK_TEAM2} team!"), @@ -812,12 +812,12 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_THUNDERCAGETRAPPED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} trapped {B_DEF_NAME_WITH_PREFIX2}!"), [STRINGID_PKMNHURTBYFROSTBITE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} was hurt by its frostbite!"), [STRINGID_PKMNGOTFROSTBITE] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX} got frostbite!"), - [STRINGID_PKMNSITEMHEALEDFROSTBITE] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its frostbite!"), + [STRINGID_PKMNSITEMHEALEDFROSTBITE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} cured its frostbite!"), [STRINGID_ATTACKERHEALEDITSFROSTBITE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} cured its frostbite through sheer determination so you wouldn't worry!"), [STRINGID_PKMNFROSTBITEHEALED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s frostbite was cured!"), [STRINGID_PKMNFROSTBITEHEALED2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s frostbite was cured!"), [STRINGID_PKMNFROSTBITEHEALEDBY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} cured its frostbite!"), - [STRINGID_MIRRORHERBCOPIED] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used its Mirror Herb to mirror its opponent's stat changes!"), + [STRINGID_MIRRORHERBCOPIED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used its Mirror Herb to mirror its opponent's stat changes!"), [STRINGID_STARTEDSNOW] = COMPOUND_STRING("It started to snow!"), [STRINGID_SNOWCONTINUES] = COMPOUND_STRING("Snow continues to fall."), //not in gen 5+ (lol) [STRINGID_SNOWSTOPPED] = COMPOUND_STRING("The snow stopped."), @@ -843,7 +843,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_TEAMSURROUNDEDBYROCKS] = COMPOUND_STRING("{B_DEF_TEAM1} Pokémon became surrounded by rocks!"), [STRINGID_PKMNHURTBYROCKSTHROWN] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is hurt by rocks thrown out by G-Max Volcalith!"), [STRINGID_MOVEBLOCKEDBYDYNAMAX] = COMPOUND_STRING("The move was blocked by the power of Dynamax!"), - [STRINGID_ZEROTOHEROTRANSFORMATION] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} underwent a heroic transformation!"), + [STRINGID_ZEROTOHEROTRANSFORMATION] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} underwent a heroic transformation!"), [STRINGID_THETWOMOVESBECOMEONE] = COMPOUND_STRING("The two moves have become one! It's a combined move!{PAUSE 16}"), [STRINGID_ARAINBOWAPPEAREDONSIDE] = COMPOUND_STRING("A rainbow appeared in the sky on {B_ATK_TEAM2} team's side!"), [STRINGID_THERAINBOWDISAPPEARED] = COMPOUND_STRING("The rainbow on {B_ATK_TEAM2} team's side disappeared!"), @@ -866,13 +866,13 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_BIZARREAREACREATED] = COMPOUND_STRING("A bizarre area was created in which Defense and Sp. Def stats are swapped!"), [STRINGID_TIDYINGUPCOMPLETE] = COMPOUND_STRING("Tidying up complete!"), [STRINGID_PKMNTERASTALLIZEDINTO] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} terastallized into the {B_BUFF1} type!"), - [STRINGID_BOOSTERENERGYACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ACTIVE_ABILITY}!"), + [STRINGID_BOOSTERENERGYACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} used its {B_LAST_ITEM} to activate {B_SCR_ACTIVE_ABILITY}!"), [STRINGID_FOGCREPTUP] = COMPOUND_STRING("Fog crept up as thick as soup!"), [STRINGID_FOGISDEEP] = COMPOUND_STRING("The fog is deep…"), [STRINGID_FOGLIFTED] = COMPOUND_STRING("The fog lifted."), [STRINGID_PKMNMADESHELLGLEAM] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} made its shell gleam! It's distorting type matchups!"), [STRINGID_FICKLEBEAMDOUBLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} is going all out for this attack!"), - [STRINGID_COMMANDERACTIVATES] = COMPOUND_STRING("{B_SCR_ACTIVE_NAME_WITH_PREFIX} was swallowed by Dondozo and became Dondozo's commander!"), + [STRINGID_COMMANDERACTIVATES] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was swallowed by Dondozo and became Dondozo's commander!"), [STRINGID_POKEFLUTECATCHY] = COMPOUND_STRING("{B_PLAYER_NAME} played the {B_LAST_ITEM}.\pNow, that's a catchy tune!"), [STRINGID_POKEFLUTE] = COMPOUND_STRING("{B_PLAYER_NAME} played the {B_LAST_ITEM}."), [STRINGID_MONHEARINGFLUTEAWOKE] = COMPOUND_STRING("The Pokémon hearing the flute awoke!"), From 3cc048cc01ba36f7e05b711c86baa908c7be5b3d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 21 Nov 2024 06:13:31 +0100 Subject: [PATCH 19/56] Removes redundant Decorate check (#5696) --- src/battle_util.c | 9 --------- test/battle/move_effect/protect.c | 32 ++++++++++++++++++++++--------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index f7fee897e75..e4c78132ede 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8571,15 +8571,6 @@ bool32 IsMoveMakingContact(u32 move, u32 battlerAtk) bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) { - // Decorate bypasses protect and detect, but not crafty shield - if (move == MOVE_DECORATE) - { - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_CRAFTY_SHIELD) - return TRUE; - else if (gProtectStructs[battlerDef].protected) - return FALSE; - } - // Z-Moves and Max Moves bypass protection (except Max Guard). if ((IsZMove(move) || IsMaxMove(move)) && (!gProtectStructs[battlerDef].maxGuarded diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index 207544de1f8..5b1b0a4e4e5 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -103,7 +103,7 @@ SINGLE_BATTLE_TEST("King's Shield, Silk Trap and Obstruct protect from damaging MESSAGE("Wobbuffet's Attack fell!"); #else MESSAGE("Wobbuffet's Attack harshly fell!"); - #endif + #endif } else if (statId == STAT_SPEED) { MESSAGE("Wobbuffet's Speed fell!"); } else if (statId == STAT_DEF) { @@ -487,36 +487,49 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from status moves") } } -SINGLE_BATTLE_TEST("Protect does not block Confide") +SINGLE_BATTLE_TEST("Protect does not block Confide or Decorate") { + u32 move; + PARAMETRIZE { move = MOVE_CONFIDE; } + PARAMETRIZE { move = MOVE_DECORATE; } + GIVEN { ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(gMovesInfo[MOVE_CONFIDE].ignoresProtect == TRUE); + ASSUME(gMovesInfo[MOVE_DECORATE].effect == EFFECT_DECORATE); + ASSUME(gMovesInfo[MOVE_DECORATE].ignoresProtect == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_CONFIDE); } + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, move); } } SCENE { - MESSAGE("Wobbuffet used Confide!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFIDE, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); NOT MESSAGE("The opposing Wobbuffet protected itself!"); } } -DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide") +DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide and Decorate") { + u32 move; + PARAMETRIZE { move = MOVE_CONFIDE; } + PARAMETRIZE { move = MOVE_DECORATE; } + GIVEN { ASSUME(gMovesInfo[MOVE_CONFIDE].effect == EFFECT_SPECIAL_ATTACK_DOWN); + ASSUME(gMovesInfo[MOVE_CONFIDE].ignoresProtect == TRUE); + ASSUME(gMovesInfo[MOVE_DECORATE].effect == EFFECT_DECORATE); + ASSUME(gMovesInfo[MOVE_DECORATE].ignoresProtect == TRUE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); } WHEN { - TURN { MOVE(opponentLeft, MOVE_CRAFTY_SHIELD); MOVE(playerLeft, MOVE_CONFIDE, target: opponentLeft); MOVE(playerRight, MOVE_CONFIDE, target: opponentRight); } + TURN { MOVE(opponentLeft, MOVE_CRAFTY_SHIELD); MOVE(playerLeft, move, target: opponentLeft); MOVE(playerRight, move, target: opponentRight); } } SCENE { - MESSAGE("Wobbuffet used Confide!"); + NOT ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); MESSAGE("The opposing Wobbuffet protected itself!"); - MESSAGE("Wynaut used Confide!"); + NOT ANIMATION(ANIM_TYPE_MOVE, move, playerRight); MESSAGE("The opposing Wynaut protected itself!"); } } @@ -570,3 +583,4 @@ SINGLE_BATTLE_TEST("Spiky Shield does not damage users on Counter or Mirror Coat } } } + From 596b8b20f4e0e922ccfa361f6a29e2f3e263a4af Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Thu, 21 Nov 2024 16:35:05 +0000 Subject: [PATCH 20/56] Fixes Neutralizing Gas crashes + adds missing interaction, Regenerator small fix (#5694) --- data/battle_scripts_1.s | 7 +-- src/battle_script_commands.c | 11 +++- test/battle/ability/intimidate.c | 90 +++++++++++++++++++++++++++++++- 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 027c344b2dc..a17c54c7e3a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2401,7 +2401,6 @@ BattleScript_EffectHealingWish:: storehealingwish BS_ATTACKER .if B_HEALING_WISH_SWITCH <= GEN_4 openpartyscreen BS_ATTACKER, BattleScript_EffectHealingWishEnd - switchoutabilities BS_ATTACKER waitstate switchhandleorder BS_ATTACKER, 2 returnatktoball @@ -5764,7 +5763,6 @@ BattleScript_PrintFullBox:: BattleScript_ActionSwitch:: hpthresholds2 BS_ATTACKER - saveattacker printstring STRINGID_RETURNMON jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_PursuitSwitchDmgSetMultihit setmultihit 1 @@ -5782,7 +5780,6 @@ BattleScript_DoSwitchOut:: switchoutabilities BS_ATTACKER updatedynamax waitstate - restoreattacker returnatktoball waitstate drawpartystatussummary BS_ATTACKER @@ -9602,7 +9599,9 @@ BattleScript_EjectButtonActivates:: removeitem BS_SCRIPTING makeinvisible BS_SCRIPTING openpartyscreen BS_SCRIPTING, BattleScript_EjectButtonEnd + copybyte sSAVED_BATTLER, sBATTLER switchoutabilities BS_SCRIPTING + copybyte sBATTLER, sSAVED_BATTLER waitstate switchhandleorder BS_SCRIPTING 0x2 returntoball BS_SCRIPTING, FALSE @@ -9699,6 +9698,7 @@ BattleScript_PastelVeilEnd: end3 BattleScript_NeutralizingGasExits:: + saveattacker savetarget pause B_WAIT_TIME_SHORT printstring STRINGID_NEUTRALIZINGGASOVER @@ -9708,6 +9708,7 @@ BattleScript_NeutralizingGasExitsLoop: switchinabilities BS_TARGET addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_NeutralizingGasExitsLoop + restoreattacker restoretarget return diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c373778b68a..b1dbcc61061 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3976,6 +3976,15 @@ static void Cmd_tryfaintmon(void) } else { + if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS + && !(gAbsentBattlerFlags & (1u << battler)) + && !IsBattlerAlive(battler)) + { + gBattleMons[battler].ability = ABILITY_NONE; + BattleScriptPush(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + return; + } if (cmd->battler == BS_ATTACKER) { destinyBondBattler = gBattlerTarget; @@ -14763,7 +14772,7 @@ static void Cmd_switchoutabilities(void) MarkBattlerForControllerExec(battler); break; case ABILITY_REGENERATOR: - gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 3; + gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 3; gBattleMoveDamage += gBattleMons[battler].hp; if (gBattleMoveDamage > gBattleMons[battler].maxHP) gBattleMoveDamage = gBattleMons[battler].maxHP; diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index d2d7bc4af70..a7776dabff6 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -246,7 +246,7 @@ DOUBLE_BATTLE_TEST("Intimidate is not going to trigger if a mon switches out thr } } -SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutralizing Gas") +SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutralizing Gas - switching out") { GIVEN { PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } @@ -263,3 +263,91 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutral SEND_IN_MESSAGE("Wobbuffet"); } } + +SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - switching moves") +{ + u32 move; + PARAMETRIZE { move = MOVE_U_TURN; } + PARAMETRIZE { move = MOVE_HEALING_WISH; } + PARAMETRIZE { move = MOVE_BATON_PASS; } + GIVEN { + ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); + ASSUME(gMovesInfo[MOVE_HEALING_WISH].effect == EFFECT_HEALING_WISH); + ASSUME(gMovesInfo[MOVE_BATON_PASS].effect == EFFECT_BATON_PASS); + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { MOVE(player, move); SEND_OUT(player, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing Gas filled the area!"); + ANIMATION(ANIM_TYPE_MOVE, move, player); + MESSAGE("The effects of Neutralizing Gas wore off!"); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + SEND_IN_MESSAGE("Wobbuffet"); + } THEN { + if (move == MOVE_HEALING_WISH) + EXPECT_EQ(player->hp, player->maxHP); + } +} + +SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - opponent caused switches") +{ + u32 move, item; + PARAMETRIZE { move = MOVE_TACKLE; item = ITEM_EJECT_BUTTON; } + PARAMETRIZE { move = MOVE_GROWL; item = ITEM_EJECT_PACK; } + PARAMETRIZE { move = MOVE_ROAR; item = ITEM_NONE; } + PARAMETRIZE { move = MOVE_DRAGON_TAIL; item = ITEM_NONE; } + GIVEN { + ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); + ASSUME(gItemsInfo[ITEM_EJECT_PACK].holdEffect == HOLD_EFFECT_EJECT_PACK); + ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + ASSUME(gMovesInfo[MOVE_ROAR].effect == EFFECT_ROAR); + ASSUME(gMovesInfo[MOVE_DRAGON_TAIL].effect == EFFECT_HIT_SWITCH_TARGET); + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Item(item); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + if (item != ITEM_NONE) { + TURN { MOVE(opponent, move); SEND_OUT(player, 1); } + } else { + TURN { MOVE(opponent, move); } + } + } SCENE { + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing Gas filled the area!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (item != ITEM_NONE) + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("The effects of Neutralizing Gas wore off!"); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + if (item != ITEM_NONE) { + SEND_IN_MESSAGE("Wobbuffet"); + } else { + MESSAGE("Wobbuffet was dragged out!"); + } + } +} + +SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - fainted") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FELL_STINGER].effect == EFFECT_FELL_STINGER); + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_FELL_STINGER); SEND_OUT(player, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing Gas filled the area!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FELL_STINGER, opponent); + MESSAGE("The effects of Neutralizing Gas wore off!"); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + MESSAGE("Weezing fainted!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + SEND_IN_MESSAGE("Wobbuffet"); + } +} + From 612c8d3ff644b7b3bfc423c7c665168047964c78 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 21 Nov 2024 18:18:44 +0100 Subject: [PATCH 21/56] Fixes heal blocked leeach seed in tests (#5700) --- data/battle_scripts_1.s | 39 ++++++++++--------- include/battle_scripts.h | 4 +- src/battle_script_commands.c | 4 +- src/battle_util.c | 21 ++++++++-- test/battle/move_effect/leech_seed.c | 58 +++++++++++++++++++++++++++- 5 files changed, 98 insertions(+), 28 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8d24dc472d5..76b75075ad1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6032,33 +6032,34 @@ BattleScript_SafeguardEnds:: waitmessage B_WAIT_TIME_LONG end2 -BattleScript_LeechSeedTurnDrain:: - playanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1 - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE - healthbarupdate BS_ATTACKER - datahpupdate BS_ATTACKER - copyword gBattleMoveDamage, gHpDealt - jumpifability BS_ATTACKER, ABILITY_LIQUID_OOZE, BattleScript_LeechSeedTurnPrintLiquidOoze - setbyte cMULTISTRING_CHOOSER, B_MSG_LEECH_SEED_DRAIN - jumpifstatus3 BS_TARGET, STATUS3_HEAL_BLOCK, BattleScript_LeechSeedHealBlock - manipulatedamage DMG_BIG_ROOT - goto BattleScript_LeechSeedTurnPrintAndUpdateHp -BattleScript_LeechSeedTurnPrintLiquidOoze:: +BattleScript_LeechSeedTurnDrainLiquidOoze:: + call BattleScript_LeechSeedTurnDrain + manipulatedamage DMG_CHANGE_SIGN copybyte gBattlerAbility, gBattlerAttacker call BattleScript_AbilityPopUp - setbyte cMULTISTRING_CHOOSER, B_MSG_LEECH_SEED_OOZE -BattleScript_LeechSeedTurnPrintAndUpdateHp:: - orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE + goto BattleScript_LeechSeedTurnDrainGainHp + +BattleScript_LeechSeedTurnDrainHealBlock:: + call BattleScript_LeechSeedTurnDrain + end2 + +BattleScript_LeechSeedTurnDrainRecovery:: + call BattleScript_LeechSeedTurnDrain +BattleScript_LeechSeedTurnDrainGainHp: + manipulatedamage DMG_BIG_ROOT healthbarupdate BS_TARGET datahpupdate BS_TARGET printfromtable gLeechSeedStringIds waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_ATTACKER tryfaintmon BS_TARGET end2 -BattleScript_LeechSeedHealBlock: - setword gBattleMoveDamage, 0 - goto BattleScript_LeechSeedTurnPrintAndUpdateHp + +BattleScript_LeechSeedTurnDrain: + playanimation BS_ATTACKER, B_ANIM_LEECH_SEED_DRAIN, sB_ANIM_ARG1 + healthbarupdate BS_ATTACKER + datahpupdate BS_ATTACKER + tryfaintmon BS_ATTACKER + return BattleScript_BideStoringEnergy:: printstring STRINGID_PKMNSTORINGENERGY diff --git a/include/battle_scripts.h b/include/battle_scripts.h index a1722a511de..1148c955e5f 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -65,7 +65,9 @@ extern const u8 BattleScript_OverworldTerrain[]; extern const u8 BattleScript_SideStatusWoreOff[]; extern const u8 BattleScript_SafeguardProtected[]; extern const u8 BattleScript_SafeguardEnds[]; -extern const u8 BattleScript_LeechSeedTurnDrain[]; +extern const u8 BattleScript_LeechSeedTurnDrainLiquidOoze[]; +extern const u8 BattleScript_LeechSeedTurnDrainHealBlock[]; +extern const u8 BattleScript_LeechSeedTurnDrainRecovery[]; extern const u8 BattleScript_BideStoringEnergy[]; extern const u8 BattleScript_BideAttack[]; extern const u8 BattleScript_BideNoEnergyToAttack[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2958d200abe..46d05033070 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5722,9 +5722,7 @@ static void Cmd_moveend(void) } else if (IsBattlerAlive(gBattlerAttacker) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - gBattleMoveDamage = (gHpDealt * gMovesInfo[gCurrentMove].argument / 100); - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattleMoveDamage = max(1, (gHpDealt * gMovesInfo[gCurrentMove].argument / 100)); gBattleMoveDamage = GetDrainedBigRootHp(gBattlerAttacker, gBattleMoveDamage); gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_IGNORE_DISGUISE; effect = TRUE; diff --git a/src/battle_util.c b/src/battle_util.c index e4c78132ede..33629793238 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2436,12 +2436,25 @@ u8 DoBattlerEndTurnEffects(void) && !IsBattlerProtectedByMagicGuard(battler, ability)) { gBattlerTarget = gStatuses3[battler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. - gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8; - if (gBattleMoveDamage == 0) - gBattleMoveDamage = 1; + gBattlerAttacker = battler; gBattleScripting.animArg1 = gBattlerTarget; gBattleScripting.animArg2 = gBattlerAttacker; - BattleScriptExecute(BattleScript_LeechSeedTurnDrain); + gBattleMoveDamage = max(1, GetNonDynamaxMaxHP(battler) / 8); + gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE; + if (GetBattlerAbility(battler) == ABILITY_LIQUID_OOZE) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_OOZE; + BattleScriptExecute(BattleScript_LeechSeedTurnDrainLiquidOoze); + } + else if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + { + BattleScriptExecute(BattleScript_LeechSeedTurnDrainHealBlock); + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_DRAIN; + BattleScriptExecute(BattleScript_LeechSeedTurnDrainRecovery); + } effect++; } gBattleStruct->turnEffectsTracker++; diff --git a/test/battle/move_effect/leech_seed.c b/test/battle/move_effect/leech_seed.c index fce80c661c5..67e829cf8ad 100644 --- a/test/battle/move_effect/leech_seed.c +++ b/test/battle/move_effect/leech_seed.c @@ -20,8 +20,64 @@ SINGLE_BATTLE_TEST("Leech Seed doesn't affect Grass-type Pokémon") MESSAGE("It doesn't affect the opposing Oddish…"); } } + +SINGLE_BATTLE_TEST("Leech Seeded targets lose 1/8 of its max HP every turn and give it to the user") +{ + s16 damage; + s16 healed; + + GIVEN { + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_SHELLDER); + } WHEN { + TURN { MOVE(player, MOVE_LEECH_SEED); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, player); + HP_BAR(opponent); + HP_BAR(player); + HP_BAR(opponent, captureDamage: &damage); + HP_BAR(player, captureDamage: &healed); + } THEN { + EXPECT_MUL_EQ(damage, Q_4_12(-1), healed); + } +} + +SINGLE_BATTLE_TEST("Leech Seed recovery is prevented by Heal Block") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_SHELLDER); + } WHEN { + TURN { MOVE(opponent, MOVE_HEAL_BLOCK); MOVE(player, MOVE_LEECH_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BLOCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, player); + HP_BAR(opponent); + NOT HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Leech Seed recovery will drain the hp of user if leech seeded mon has Liquid Ooze") +{ + s16 damage; + s16 healed; + + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_TENTACOOL) { Ability(ABILITY_LIQUID_OOZE); } + } WHEN { + TURN { MOVE(player, MOVE_LEECH_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, player); + HP_BAR(opponent, captureDamage: &damage); + HP_BAR(player, captureDamage: &healed); + } THEN { + EXPECT_EQ(damage, healed); + } +} + TO_DO_BATTLE_TEST("Leech Seed doesn't affect already seeded targets") -TO_DO_BATTLE_TEST("Leech Seeded targets lose 1/8 of its max HP every turn and give it to the user") TO_DO_BATTLE_TEST("Leech Seed's effect is paused until a new battler replaces the original user's position") // Faint, can't be replaced, then revived. TO_DO_BATTLE_TEST("Leech Seed's effect pause still prevents it from being seeded again") TO_DO_BATTLE_TEST("Baton Pass passes Leech Seed's effect"); From 194f7644b84971f5201bfde9b9f2209e4df54980 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 23 Nov 2024 18:02:40 +0100 Subject: [PATCH 22/56] Changes taget bit of Flower Shield (#5698) --- include/constants/battle.h | 2 +- src/data/moves_info.h | 4 +-- test/battle/move_effect/flower_shield.c | 37 +++++++++++++++++++++++++ test/battle/move_effect/protect.c | 1 - 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 test/battle/move_effect/flower_shield.c diff --git a/include/constants/battle.h b/include/constants/battle.h index d337559f1bf..ed19a72d9ce 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -507,7 +507,7 @@ #define MOVE_TARGET_FOES_AND_ALLY (1 << 5) #define MOVE_TARGET_OPPONENTS_FIELD (1 << 6) #define MOVE_TARGET_ALLY (1 << 7) -#define MOVE_TARGET_ALL_BATTLERS ((1 << 8) | MOVE_TARGET_USER) +#define MOVE_TARGET_ALL_BATTLERS ((1 << 8) | MOVE_TARGET_USER) // No functionality for status moves // For the second argument of GetMoveTarget, when no target override is needed #define NO_TARGET_OVERRIDE 0 diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 1bde816281d..05c8391522c 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -8492,7 +8492,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, + .target = MOVE_TARGET_USER, // Targeting is handled through the script .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -14421,7 +14421,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = MOVE_TARGET_USER, // The targeting of Flower Shield is handled through a script .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, diff --git a/test/battle/move_effect/flower_shield.c b/test/battle/move_effect/flower_shield.c new file mode 100644 index 00000000000..e31fc9e5cd1 --- /dev/null +++ b/test/battle/move_effect/flower_shield.c @@ -0,0 +1,37 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_FLOWER_SHIELD].effect == EFFECT_FLOWER_SHIELD); +} + +DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all grass type pokemon") +{ + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); + ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS); + ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS); + ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS); + PLAYER(SPECIES_TANGELA); + PLAYER(SPECIES_TANGROWTH); + OPPONENT(SPECIES_SUNKERN); + OPPONENT(SPECIES_SUNFLORA); + } WHEN { + TURN { MOVE(playerLeft, MOVE_FLOWER_SHIELD); MOVE(playerRight, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Tangela used Flower Shield!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Tangela's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Sunkern's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + MESSAGE("Tangrowth's Defense rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + MESSAGE("The opposing Sunflora's Defense rose!"); + } +} diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index 5b1b0a4e4e5..dff486cb001 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -537,7 +537,6 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide and Decora DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all battlers") { GIVEN { - ASSUME(gMovesInfo[MOVE_FLOWER_SHIELD].target == MOVE_TARGET_ALL_BATTLERS); ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS); ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS); From ea3cec339ce9d8d7c165f7b1f56118e07595be9f Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 23 Nov 2024 18:06:34 +0100 Subject: [PATCH 23/56] Follower fixes, Melmetal, Patrat, Woobat (#5685) Co-authored-by: Hedara --- graphics/pokemon/melmetal/overworld.png | Bin 2053 -> 1337 bytes .../pokemon/melmetal/overworld_normal.pal | 4 ++-- graphics/pokemon/melmetal/overworld_shiny.pal | 2 +- graphics/pokemon/patrat/overworld.png | Bin 691 -> 618 bytes graphics/pokemon/woobat/overworld.png | Bin 565 -> 563 bytes 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/graphics/pokemon/melmetal/overworld.png b/graphics/pokemon/melmetal/overworld.png index 4be020a5c6a803fd1e3412ef591fd026585126da..e8097644ad166decd45c160a6cd6556db3d8780e 100644 GIT binary patch delta 1265 zcmVvHod5OW=z zKm+Udf7>Hzv5oO1`R4pBGp#8SyAqeRI}CsAul=>PCAI&VuUkmhj*?@t}tlu&2@z3$SrIH@yHBHm&f$oX^D?*78@e(5s z#RfhT1~B?9qs6WC_&vJGd!$gtgau9kkE4StLiPmM+1FIYV(|BRc!K;Lqs0w`J${ew z^fAR#Q>l?2b`7{18ewFu=#t|2T4Fc0o=iri%M@D6W zi5VDwVgimX2JRX6_~-a)h82apq6UHZ({=_f30OZ|r(C9=6vB)aLi(9X#%5V`eUbem zgY!VR#5pPhmuTD^z}N(NQ4Ip|XJ_DwU;&W~_Zt}!a^Tkw)~fUdP8b*te|Cd625#an z`lghtJRZF?9SmF$OvlQY01eU6kYF&JG?nVCjtxD-bQq1e*0{&_J8+7&uL1~^JTnRG z^B6%O6(ae*6wh4RLk0?SeVC4u_U zjBkjC;;TMc2pmNRj}XXj8Kz14Amc5{WVCn)8nqP;yZE-kTf?1*2s@9~zvC7{5n=2I zTFFcYDKP;ak{x{11P57Z7)F2d;Ze1GVEqoWaYfQ5^ycJexZ_W(+O*gy*=A-{4g~IQSW#d_$b+r@>ON zYGAZ?2g|6+gpx7F5V!`jbaQOina71;b&Af|AT=#MJ7LXY9)51)w|JG0ea@0Go){n_ zLca^O;r)KE1~APRe;N6;hw~hdI}m3I6vM};zos(7nhJjt$J@#{w5<|aARgme@om`Q zlF#Tt`m@9>3Ks@8@u`z*B>evVI)T-sI`E6>4p`$@JdjwOr|a`(tNyKyRQ&zBDC}DG zC%DH=o2jb6&YUR@5;q5{LmnUzumF{?Z2=B37CiVK9}MV(e>lUs4Uh)n0RmaR=I(y# zCeJKpAOyy5&krW!^w41D7arWbA?~-?BRYJ#{!j^Z-#v6#4A@dW!>W6A5|(mmi-ER` zSPX=r&m)`|&}KdD!41&e?u5C+YO(b8StN8PZK--}Mc2?@MCud`SBBo^xhW$k z4^en^5JH#3f6>8r2lmy z5EWkxbPC;H-GCbZU_kogQQzi}l+w>$3~-HgK#IPvj|Ql*9-wIYMsnFnjPS#~j)M0}M)Y3{@nvhW)+8UjWvf(hffwIKjB00000NkvXXu0mjfbeL5} literal 2053 zcmeHH`BM@I7^Q_pP`pBoNKsogGF@*(^B}~tB(dB`$@`$(!mD)GlRU6U)Xcnf3vbP1 z^U9jQ6)MZsOxi3h1+6t*HO+%qgtdQTr#JI`@0T~y8Jsjc9)a0Du6WV<%nZa=C2r-qh5aMQ(U|`|q{6j=8xR z$&u*b;NU=S)SQtd8I zxpP9MW@~0?u}?bTb1a|gQPFD9x$2O;+c~lM=`7BNCO^qSac2B?E`IziP2U`QWM9}< zef!$Y?;pm*9N|*EZ4jbpI?7B5fgYCV%%bGl(*bQ?NI{<+IH>vRdCq>p4K*{XxJE7U zFoHYZdkxiVFWQxved%5JFryRAbfamR8V|X^T70?5c)Ln8p>8}Q|#DZWP6%a zQJ<6$<4J`^CWjkjJdk$0h97IA^+( z8#VWSp|F=m(q}&o6Exn5nd0|qzC$h(@Dt{*#jF5`U)EVYs-cq3+%PD~xyC~&xk6Jl3WQ`mK9X@HBGulyy%4FxUz!)mSK3nEw}AzXE8vlQ(AI2)T; za)NCS()tCHm}HFbUx%8V)#VIUq{Mup{ko9Cfv4s2?pfU;iZw4lMTu{=)*-I`{ADpR6)ZoG|%o z%!!$`Tx;r=e`f(HVR}?G3m-k7e2@?Udan_ynU}o*cZn5%FKSp445L;MyBV4h-3s*G zNKLiINE8?Cgb%$i*`I!31*IdYjLvB1i87T z1)PZSQjk(-)Y1>Axw=W7l{pEAO#K~)1IJ6c8&~*wY{_5(%yNc}H|%54WM#CdWeh`* t-nNWi_xqRUbV973c0Q}+Idc&BN!1MyPwAMwy7je=Jza@}Hhl2q{{V+zb*TUV diff --git a/graphics/pokemon/melmetal/overworld_normal.pal b/graphics/pokemon/melmetal/overworld_normal.pal index 28e45931926..d9b329362be 100644 --- a/graphics/pokemon/melmetal/overworld_normal.pal +++ b/graphics/pokemon/melmetal/overworld_normal.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -255 255 255 +120 255 255 254 235 185 220 220 218 235 192 100 @@ -16,4 +16,4 @@ JASC-PAL 64 64 64 45 43 43 8 8 8 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/melmetal/overworld_shiny.pal b/graphics/pokemon/melmetal/overworld_shiny.pal index 6d1c75c9bbf..4f5321a0622 100644 --- a/graphics/pokemon/melmetal/overworld_shiny.pal +++ b/graphics/pokemon/melmetal/overworld_shiny.pal @@ -16,4 +16,4 @@ JASC-PAL 64 64 64 45 43 43 8 8 8 -0 0 0 +255 255 255 diff --git a/graphics/pokemon/patrat/overworld.png b/graphics/pokemon/patrat/overworld.png index ea2df04dc1ae62d0fbbdd1068f564c15fa2084f4..8b6a34f19870bd4736d739af3c9e5acab7e74267 100644 GIT binary patch delta 605 zcmV-j0;2u11?mKl7=H)@0001UMu)cm0004VQb$4nuFf3k0000mP)t-sn9!g}Fephd zC;$Keqi-=UE-&UyDE7}z%EF<_!lAX8Ztm{)wU}-I0000000000Gq-fz0005#NklB7q|u|&VQC=#*7&=X3Ur|<0X;O z$LpgU;N$gC9T^M4jjC>2TMj{ReH&;2u zN9Q-huP|`S(B7titHJC!46sNLb$&$KK*)E4PjT$IIolIpoByO4%q;*h;YtM4aZX zQ373IByg?34wFK}A+|GUg{+ay((D?JINe~iKPw!bRbg?cwaEPHzrY9^8B(l(tzECJ zA*_~xh=V>QhEK6BFpC7pV%1(ne}0zSV=F_RKP8k%$$u_^kc0XImumtx=S`(H&8?mi zFa!sd1NovzG;fojm5fdmahaVB(zjV70Vjtw^WHGGI>mt(JHx~Vslc1vXt@>d-0s9` zuA%#P!A;-}FJP`gzh=2nQnK%XgFBs8m-aHyH$k5x)i{@-h=$nqFU^7u zcO4m6iB>y}cppDZfVn%KZp8!i%7y|#Ri00000NkvXXu0mjfw_z5i delta 679 zcmV;Y0$Ba(1hWN@7=Hu<0002CwraKj0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000dP)t-sn9!hDNJtP65C8xGh@DcSB~OEw6gEiw3$KvJ@7WG`s2f%mi2pgRQU4R&xT*vt_? zW{{$vErA?SZvrqHs%8cYK-hN#?hboy7!0@r=V}JC$!LlNY7Fqw|252IN5y6|onV9B z`&rH4VXhh(>{ZR6?5OzFayp4Ei{9R+uV2ji#D9Rj&gUoj_rPh%%fQ+${l!2G zz9VqD%I98ie6PvZdH(x~xN1cE-R-v@ogmOY|9brev9Y#x%Zx$H(|nmIzS=HYuNLJ? zi!Q4H*)!+*v1(>*!D2SXAZF1(3(3Qlolb;eY1Pr{oZa2sv=0NHuGd9iu7xo|t0rbq zA*?{<;eR}f6Uovr;OOk<=NnYqTBlbZi-W*kuv}93Cqhbr&Sbo{*dSUICXpP?Na8%t zkl;~#agpJd>t_qXlJIzuX%XsOlovAbA6k*q9V*c7I7RZB=C#K8=u!x>qeS>6;ESrg z1`$-8RP={=TJZ;75F2WNk7%pW1dqsf`&5rR$sqn|@VeuJ_5ZKI*e@Qqn(HW?Wpn@l N002ovPDHLkV1n^cL`DDr diff --git a/graphics/pokemon/woobat/overworld.png b/graphics/pokemon/woobat/overworld.png index 1d14a5c43d798ca82fd85c3103b4e524903b5407..18bff8d5c3b0302fea9b089865903cdc11e1ecf1 100644 GIT binary patch delta 476 zcmV<20VDpk1hWK?VSl|zL_t(oh3!_+a)clZ1On0e{~z3hC{ReiK6K_f!+H;Ti)(fR zsB;?|8yg!Np94?FKZf^#4w#Gpn6Yl1z@PFyhQPl`jgS)R3?e)U&?5lVVTHFUu=yAI zTz`h?zyqd~R2KRFCjoC5t-PUc^KbNhc%T~~`xp>a18fYTCV!Bx`$4csXu`kICwqJ_ zuRh?huQ|wi2}=TWKDG)QUYlSO{*}Hzj^L$!%|Mx8+B&BHND(D~$R;VTpW~=?Ek9U5 zzNggJ@uJ`IgT8a;7aUYOM#DgLudf2|G5TMWpSDj`M5yR!%^AUxf! zlyCx^R640#dVd2XKN?^-pt|A#5<|ZX`7Uhuegi`mQ=la>%317MvWz7!b%VSa}!> zKojx67yU^C?i^4rPbL`6K3YyR&S(K#kq%Jw^DPbEOI57+m3}n<#^*v#P9`Yt3YG#G z9~*Z;g;xzs_?7+*^F`~bedAMNg-*O*-|4`$`#>U3R$KV^toDLVo S3Pb1s0000}4#t-PYI^KbO6E07J4eRPPT0XBwE6Msm*`$e!wXu`kICwqJ_ zFJ7S7mmDO$fKLMSeQXsryfk1F{*}Hx4rg=yl7VNyr2CluBSp*scs5CS{a#0{Yx%(f z@;Og^9iR1Ee$Y22o^Vj@=oJIiy?hsd_1?OJW1ufX`jlD2ht2}#Omj#+=iONZ7RWrE zE|d@fB9%@mmw()VoF6Sv98g{UIM0(~=x;+l3md+lfW)Wl5>VPKtgjHafyni9qs0c? z1D0AT8!-0rkqV6d8uYn9Xm}6|FrP8;`Zv@Et*Q2vSBVvR*}wjNdl_xMGr4@1`v81HjT;*q8yg>kA53iy UQ&T@M2LJ#707*qoM6N<$f=&F>=>Px# From 6560bbab21ff171d7f0078d9f4966338f6466ef8 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 23 Nov 2024 14:17:40 -0500 Subject: [PATCH 24/56] Restore .map file creation --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index a5f0224331b..6252664bded 100644 --- a/Makefile +++ b/Makefile @@ -379,6 +379,7 @@ libagbsyscall: @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN) # Elf from object files +LDFLAGS = -Map ../../$(MAP) $(ELF): $(LD_SCRIPT) $(LD_SCRIPT_DEPS) $(OBJS) libagbsyscall @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../../$< --print-memory-usage -o ../../$@ | cat" From e7e701f8ec8188165041997d35d565531d8e4110 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 23 Nov 2024 23:10:34 +0100 Subject: [PATCH 25/56] Trainer class+name expansion fix for Battle Frontier (#5699) Co-authored-by: Hedara --- src/battle_message.c | 97 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 15 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 761770d4408..049bda6d39c 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2622,6 +2622,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) if (*src == PLACEHOLDER_BEGIN) { src++; + u32 classLength = 0; + u32 nameLength = 0; + const u8 *classString; + const u8 *nameString; switch (*src) { case B_TXT_BUFF1: @@ -2800,9 +2804,24 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) break; case B_TXT_TRAINER1_NAME_WITH_CLASS: // trainer1 name with trainer class toCpy = textStart; - textStart = StringCopy(textStart, BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A)); - textStart = StringAppend(textStart, gText_Space2); - textStart = StringAppend(textStart, BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))); + classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); + while (classString[classLength] != EOS) + { + textStart[classLength] = classString[classLength]; + classLength++; + } + textStart[classLength] = CHAR_SPACE; + textStart += classLength + 1; + nameString = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_A, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)); + if (nameString != textStart) + { + while (nameString[nameLength] != EOS) + { + textStart[nameLength] = nameString[nameLength]; + nameLength++; + } + textStart[nameLength] = EOS; + } break; case B_TXT_LINK_PLAYER_NAME: // link player name toCpy = gLinkPlayers[multiplayerId].name; @@ -2922,9 +2941,24 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) break; case B_TXT_TRAINER2_NAME_WITH_CLASS: toCpy = textStart; - textStart = StringCopy(textStart, BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B)); - textStart = StringAppend(textStart, gText_Space2); - textStart = StringAppend(textStart, BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))); + classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); + while (classString[classLength] != EOS) + { + textStart[classLength] = classString[classLength]; + classLength++; + } + textStart[classLength] = CHAR_SPACE; + textStart += classLength + 1; + nameString = BattleStringGetOpponentNameByTrainerId(gTrainerBattleOpponent_B, textStart, multiplayerId, GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)); + if (nameString != textStart) + { + while (nameString[nameLength] != EOS) + { + textStart[nameLength] = nameString[nameLength]; + nameLength++; + } + textStart[nameLength] = EOS; + } break; case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -2962,9 +2996,24 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) break; case B_TXT_PARTNER_NAME_WITH_CLASS: toCpy = textStart; - textStart = StringCopy(textStart, gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name); - textStart = StringAppend(textStart, gText_Space2); - textStart = StringAppend(textStart, BattleStringGetPlayerName(textStart, GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))); + classString = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name; + while (classString[classLength] != EOS) + { + textStart[classLength] = classString[classLength]; + classLength++; + } + textStart[classLength] = CHAR_SPACE; + textStart += classLength + 1; + nameString = BattleStringGetPlayerName(textStart, GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)); + if (nameString != textStart) + { + while (nameString[nameLength] != EOS) + { + textStart[nameLength] = nameString[nameLength]; + nameLength++; + } + textStart[nameLength] = EOS; + } break; case B_TXT_ATK_TRAINER_NAME: toCpy = BattleStringGetTrainerName(text, multiplayerId, gBattlerAttacker); @@ -2995,24 +3044,42 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) } else { + classString = NULL; switch (GetBattlerPosition(gBattlerAttacker)) { case B_POSITION_PLAYER_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - textStart = StringCopy(textStart, gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name); + classString = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name; break; case B_POSITION_OPPONENT_LEFT: - textStart = StringCopy(textStart, BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A)); + classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); break; case B_POSITION_OPPONENT_RIGHT: if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && !BATTLE_TWO_VS_ONE_OPPONENT) - textStart = StringCopy(textStart, BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B)); + classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_B); else - textStart = StringCopy(textStart, BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A)); + classString = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A); break; } - textStart = StringAppend(textStart, gText_Space2); - textStart = StringAppend(textStart, BattleStringGetTrainerName(textStart, multiplayerId, gBattlerAttacker)); + classLength = 0; + nameLength = 0; + while (classString[classLength] != EOS) + { + textStart[classLength] = classString[classLength]; + classLength++; + } + textStart[classLength] = CHAR_SPACE; + textStart += 1 + classLength; + nameString = BattleStringGetTrainerName(textStart, multiplayerId, gBattlerAttacker); + if (nameString != textStart) + { + while (nameString[nameLength] != EOS) + { + textStart[nameLength] = nameString[nameLength]; + nameLength++; + } + textStart[nameLength] = EOS; + } } break; case B_TXT_ATK_TEAM1: From 2baea35414f2846f1fe745aa93fb9b6f69da0d98 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 24 Nov 2024 14:38:56 +0100 Subject: [PATCH 26/56] Fixed Farfetch'd overworld sprite (#5711) Co-authored-by: Hedara --- graphics/pokemon/farfetchd/overworld.png | Bin 686 -> 813 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/pokemon/farfetchd/overworld.png b/graphics/pokemon/farfetchd/overworld.png index 46aec0976444a8250ad6fa9446a09e6ac95d35b7..63d29215b72960dd3c0d269481a07ab5f333a17f 100644 GIT binary patch delta 737 zcmV<70v`RY1+4}yiBL{Q4GJ0x0000DNk~Le000310000W2m=5B0Lph()&Kwi0drDE zLIAGL9O;owT7LqMNkl#RFdU6HYq^r2`ndGOH+ z-HX6GzFbzUSg~ToiWMtXtk6g)y~W=z@J~a#%QjK(gkTKy&q5YwRPjJpj@bVLW5p58cpL3nC5wO7@;erjGaS6-MIp?Ch0FQ`be(FO@ ze1eyWKOsLBC=-J*C(6GR7ya)YGuk$a__!gC0LT2vkpU&bbAHq>NZ^E7S^9&cLzZaFw`RInK7Y7p5K*dClnd~G!mUH$?IyJ*{|G4G zZVb7$o!AD=nsg1IkPm^633p#t6QA5S$TVsOiGcUri0elp+S(ndKlnWXJ_Is%YScM- zU$tcIKe%gveyZY3R+w^j9l9JKa{@Xe z;^?Vr;QUfqeX~5KlND( zpWs{I&*g~ejWag>uZP)Av26Ie{jpd=HZBo!29rcHw}1P1j-x2uSv#TUE#qM z35aEr<}g>6kN6ZQ$0Xeihwna@8Jq#TYT&^YgIH_bcx_8yf5fN2jHMQ|Cg9`bh5^K( z4|ye@D+aNaT8a1A+JJyhfvm5JLT$?68@GlOaLfm1s+hjGW)KldA?9TCFW@2&vTT$T zQ4OHWhrnY()XzQSlj{aWBWECyabNH`$Obp8*fMBGElT-=s|NU27AG1*Zr*30wc*g* z;{$741h!5{f4zZm44hp3mP~+iwB@3jhEBNkvXXu0mjfNeB?l From 632ef149e0773fd9b5385db244cd820c32bc465e Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Sun, 24 Nov 2024 20:42:14 +0100 Subject: [PATCH 27/56] Handle showdowns apostrophe the same way as ASCII apostrophe (#5712) --- tools/trainerproc/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index b410e810b08..8b939a955f8 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -1545,6 +1545,7 @@ static void fprint_species(FILE *f, const char *prefix, struct String s) static const unsigned char *male = (unsigned char *)u8"♂"; static const unsigned char *female = (unsigned char *)u8"♀"; static const unsigned char *e_diacritic = (unsigned char *)u8"é"; + static const unsigned char *right_single_quotation_mark = (unsigned char *)u8"’"; for (int i = 0; i < s.string_n; i++) { unsigned char c = s.string[i]; @@ -1562,7 +1563,7 @@ static void fprint_species(FILE *f, const char *prefix, struct String s) underscore = false; fputc(c - 'a' + 'A', f); } - else if (c == '\'' || c == '%') + else if (c == '\'' || c == '%' || is_utf8_character(s, &i, right_single_quotation_mark)) { // Do nothing. } From d924b361e64a1a171c18abc1bb9b48591c55c434 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 24 Nov 2024 23:04:43 +0100 Subject: [PATCH 28/56] Added Minimize interaction to Supercell Slam (#5713) Co-authored-by: Hedara --- src/data/moves_info.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 4eee90a8025..3a6837dd2b1 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -20605,6 +20605,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .minimizeDoubleDamage = TRUE, .battleAnimScript = Move_SUPERCELL_SLAM, }, From 4beb0efbcc202048fafa606147b7b5243ed55951 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 24 Nov 2024 22:46:01 -0300 Subject: [PATCH 29/56] Added extra encoded character support (#2050) --- src/mini_printf.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/mini_printf.c b/src/mini_printf.c index ac8a0ef1277..e4b89372428 100644 --- a/src/mini_printf.c +++ b/src/mini_printf.c @@ -86,6 +86,8 @@ static inline char mini_pchar_decode(char encoded) ret = '('; // opening parentheses else if (encoded == CHAR_RIGHT_PAREN) ret = ')'; // closing parentheses + else if (encoded == CHAR_HYPHEN) + ret = '-'; // hyphen return ret; } @@ -133,7 +135,31 @@ static s32 _putsEncoded(char *s, s32 len, void *buf) { break; } - *(b->pbuffer ++) = mini_pchar_decode(s[i]); + if (s[i] == CHAR_NEWLINE) + { + *(b->pbuffer ++) = '\\'; + *(b->pbuffer ++) = 'n'; + } + else if (s[i] == CHAR_PROMPT_SCROLL) + { + *(b->pbuffer ++) = '\\'; + *(b->pbuffer ++) = 'l'; + } + else if (s[i] == CHAR_PROMPT_CLEAR) + { + *(b->pbuffer ++) = '\\'; + *(b->pbuffer ++) = 'p'; + } + else if (s[i] == CHAR_ELLIPSIS) + { + *(b->pbuffer ++) = '.'; + *(b->pbuffer ++) = '.'; + *(b->pbuffer ++) = '.'; + } + else + { + *(b->pbuffer ++) = mini_pchar_decode(s[i]); + } } *(b->pbuffer) = 0; return b->pbuffer - p0; From 64887ee876d1ba0c01c66bc2dda0e6e1e7f3aa0d Mon Sep 17 00:00:00 2001 From: Sadfish the Sad Date: Mon, 25 Nov 2024 13:57:22 -0500 Subject: [PATCH 30/56] dark void, clangorous soulblaze, vortex animation fixes (#5650) --- data/battle_anim_scripts.s | 8 +-- src/battle_anim_flying.c | 1 - src/battle_anim_mon_movement.c | 103 ++++++++++++++++++++++++++++++++- src/battle_anim_rock.c | 7 ++- 4 files changed, 108 insertions(+), 11 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 643ee2cd0ef..6e8a54c6271 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3666,7 +3666,7 @@ gBattleAnimMove_DarkVoid:: loopsewithpan SE_M_CONFUSE_RAY, SOUND_PAN_ATTACKER, 5, 2 delay 48 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 112 @Last is duration - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, -768, 21, 0, 112 @Last is duration + createsprite gSlideMonToOffsetPartnerSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, -768, 21, 0, 112 @Last is duration delay 64 invisible ANIM_TARGET invisible ANIM_DEF_PARTNER @@ -3674,7 +3674,7 @@ gBattleAnimMove_DarkVoid:: createsprite gDarkVoidPurpleStarsTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_DEF_PARTNER, 0, 32, 60 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16 - createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0, 16 + createsprite gSlideMonToOriginalPosPartnerSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0, 16 delay 32 call UnsetPsychicBg visible ANIM_TARGET @@ -33527,7 +33527,7 @@ gBattleAnimMove_ClangorousSoulblaze:: delay 0x2 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xFFE0, 0x1, 0xffff createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfd00, 0xa, 0x0, 0x2a - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0xfd00, 0xa, 0x0, 0x2a + createsprite gSlideMonToOffsetPartnerSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0xfd00, 0xa, 0x0, 0x2a delay 0x20 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x20, 0x1, 0xffff delay 0xC @@ -33719,7 +33719,7 @@ FINISH_SOULBLAZE: call ResetFromWhiteScreen blendoff createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 - createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0x0, 0x10 + createsprite gSlideMonToOriginalPosPartnerSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0x0, 0x10 waitforvisualfinish end ClangorousSoulblazeEnergySwirl: diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 42c99740d35..8b613ad6771 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -363,7 +363,6 @@ static void AnimEllipticalGustCentered(struct Sprite *sprite) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); - sprite->y += 20; sprite->data[1] = 191; sprite->callback = AnimEllipticalGust_Step; diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index 04fd111a842..240e43b713f 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -15,8 +15,10 @@ static void ReverseHorizontalLungeDirection(struct Sprite *sprite); static void DoVerticalDip(struct Sprite *sprite); static void ReverseVerticalDipDirection(struct Sprite *sprite); static void SlideMonToOriginalPos(struct Sprite *sprite); +static void SlideMonToOriginalPosPartner(struct Sprite *sprite); static void SlideMonToOriginalPos_Step(struct Sprite *sprite); static void SlideMonToOffset(struct Sprite *sprite); +static void SlideMonToOffsetPartner(struct Sprite *sprite); static void SlideMonToOffsetAndBack(struct Sprite *sprite); static void SlideMonToOffsetAndBack_End(struct Sprite *sprite); static void AnimTask_WindUpLunge_Step1(u8 taskId); @@ -63,6 +65,17 @@ const struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate = .callback = SlideMonToOriginalPos, }; +const struct SpriteTemplate gSlideMonToOriginalPosPartnerSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SlideMonToOriginalPosPartner, +}; + const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate = { .tileTag = 0, @@ -74,6 +87,17 @@ const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate = .callback = SlideMonToOffset, }; +const struct SpriteTemplate gSlideMonToOffsetPartnerSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SlideMonToOffsetPartner, +}; + const struct SpriteTemplate gSlideMonToOffsetAndBackSpriteTemplate = { .tileTag = 0, @@ -487,7 +511,41 @@ static void ReverseVerticalDipDirection(struct Sprite *sprite) // arg 2: duration static void SlideMonToOriginalPos(struct Sprite *sprite) { - u32 monSpriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + u32 monSpriteId; + if (!gBattleAnimArgs[0]) + monSpriteId = gBattlerSpriteIds[gBattleAnimAttacker]; + else + monSpriteId = gBattlerSpriteIds[gBattleAnimTarget]; + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = gSprites[monSpriteId].x + gSprites[monSpriteId].x2; + sprite->data[2] = gSprites[monSpriteId].x; + sprite->data[3] = gSprites[monSpriteId].y + gSprites[monSpriteId].y2; + sprite->data[4] = gSprites[monSpriteId].y; + InitSpriteDataForLinearTranslation(sprite); + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = gSprites[monSpriteId].x2; + sprite->data[6] = gSprites[monSpriteId].y2; + sprite->invisible = TRUE; + + if (gBattleAnimArgs[1] == 1) + sprite->data[2] = 0; + else if (gBattleAnimArgs[1] == 2) + sprite->data[1] = 0; + + sprite->data[7] = gBattleAnimArgs[1]; + sprite->data[7] |= monSpriteId << 8; + sprite->callback = SlideMonToOriginalPos_Step; +} + +static void SlideMonToOriginalPosPartner(struct Sprite *sprite) +{ + u32 monSpriteId; + if (!gBattleAnimArgs[0]) + monSpriteId = gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]; + else + monSpriteId = gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimTarget)]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gSprites[monSpriteId].x + gSprites[monSpriteId].x2; @@ -550,9 +608,48 @@ static void SlideMonToOriginalPos_Step(struct Sprite *sprite) // arg 4: duration static void SlideMonToOffset(struct Sprite *sprite) { - u8 monSpriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + u8 battler; + u8 monSpriteId; + if (!gBattleAnimArgs[0]) + battler = gBattleAnimAttacker; + else + battler = gBattleAnimTarget; + + monSpriteId = gBattlerSpriteIds[battler]; + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + if (gBattleAnimArgs[3] == 1) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + } + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = gSprites[monSpriteId].x; + sprite->data[2] = gSprites[monSpriteId].x + gBattleAnimArgs[1]; + sprite->data[3] = gSprites[monSpriteId].y; + sprite->data[4] = gSprites[monSpriteId].y + gBattleAnimArgs[2]; + InitSpriteDataForLinearTranslation(sprite); + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = monSpriteId; + sprite->invisible = TRUE; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + sprite->callback = TranslateSpriteLinearByIdFixedPoint; +} + +static void SlideMonToOffsetPartner(struct Sprite *sprite) +{ + u8 battler; + u8 monSpriteId; + if (!gBattleAnimArgs[0]) + battler = BATTLE_PARTNER(gBattleAnimAttacker); + else + battler = BATTLE_PARTNER(gBattleAnimTarget); - if (GetBattlerSide(gBattleAnimArgs[0]) != B_SIDE_PLAYER) + monSpriteId = gBattlerSpriteIds[battler]; + if (GetBattlerSide(battler) != B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; if (gBattleAnimArgs[3] == 1) diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 354fb21014e..ec7bc535df9 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -478,14 +478,15 @@ void AnimRockFragment(struct Sprite *sprite) // Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb void AnimParticleInVortex(struct Sprite *sprite) { - if (IsDoubleBattle() //got a little lazy here will fix later - && (gAnimMoveIndex == MOVE_BLEAKWIND_STORM + if (IsDoubleBattle() + && (gAnimMoveIndex == MOVE_BLEAKWIND_STORM || gAnimMoveIndex == MOVE_SANDSEAR_STORM || gAnimMoveIndex == MOVE_SPRINGTIDE_STORM || gAnimMoveIndex == MOVE_WILDBOLT_STORM)) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else - InitSpritePosToAnimTarget(sprite, FALSE); + InitSpritePosToAnimBattler(gBattleAnimArgs[6], sprite, FALSE); + sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[4]; From b1231269393e9135f87d515e69622666630e3165 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Wed, 27 Nov 2024 13:59:39 -0500 Subject: [PATCH 31/56] Update README.md to link to INSTALL.md (#5720) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index facd5f56267..5330e409813 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,16 @@ pokeemerald-expansion is a decomp hack base project based off pret's [pokeemerald](https://github.com/pret/pokeemerald) decompilation project. It's recommended that any new projects that plan on using it, to clone this repository instead of pret's vanilla repository, as we regurlarly incorporate pret's documentation changes. This is ***NOT*** a standalone romhack, and as such, most features will be unavailable and/or unbalanced if played as is. +## Using pokeemerald-expansion + If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect. You can phrase it as the following: ``` Based off RHH's pokeemerald-expansion 1.9.3 https://github.com/rh-hideout/pokeemerald-expansion/ ``` +Please follow the instructions in `INSTALL.md` to get pokeemerald-expansion set up on your machine. + ## What features are included? - ***IMPORTANT*❗❗ Read through these to learn what features you can toggle**: - [Battle configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/battle.h) From 6b170d70f1fb87728d9916b67ddf173a5409a4c8 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:05:11 +0100 Subject: [PATCH 32/56] Fixes Red Card / Eject Pack interaction (#5724) --- include/constants/battle_script_commands.h | 2 +- test/battle/form_change/primal_reversion.c | 16 ++++++++++++++++ test/battle/hold_effect/red_card.c | 22 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index a8daf8841b5..5f3feefa315 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -300,9 +300,9 @@ enum MoveEndEffects MOVEEND_RECOIL, MOVEEND_ITEM_EFFECTS_ATTACKER, MOVEEND_MAGICIAN, // Occurs after final multi-hit strike, and after other items/abilities would activate + MOVEEND_RED_CARD, // Red Card triggers before Eject Pack MOVEEND_EJECT_ITEMS, MOVEEND_WHITE_HERB, - MOVEEND_RED_CARD, MOVEEND_LIFEORB_SHELLBELL, // Includes shell bell, throat spray, etc MOVEEND_CHANGED_ITEMS, MOVEEND_PICKPOCKET, diff --git a/test/battle/form_change/primal_reversion.c b/test/battle/form_change/primal_reversion.c index df19a1d0d6a..4b9e019b5bc 100644 --- a/test/battle/form_change/primal_reversion.c +++ b/test/battle/form_change/primal_reversion.c @@ -332,3 +332,19 @@ DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); } } + +SINGLE_BATTLE_TEST("111") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].power != 0); + PLAYER(SPECIES_GROUDON) { HP(1); Item(ITEM_RED_ORB); } + PLAYER(SPECIES_WOBBUFFET) + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); + MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); + MESSAGE("Groudon fainted!"); + } +} diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index 3209549de19..7cdbba24129 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -467,4 +467,26 @@ SINGLE_BATTLE_TEST("Red Card prevents Emergency Exit activation when triggered") } } +SINGLE_BATTLE_TEST("Red Card activates before Eject Pack") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_MINUS_2) == TRUE); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_OVERHEAT); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_OVERHEAT, player); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet is switched out with the Eject Button!"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("Foe Wobbuffet held up its Red Card against Wobbuffet!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + } +} + // SINGLE_BATTLE_TEST("Red Card activates but fails if the attacker has Dynamaxed") From 846427ac432942fb743850f06fcb9569bf26df5a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:08:38 +0100 Subject: [PATCH 33/56] Fixes gems triggering on confusion damage (#5723) --- src/battle_script_commands.c | 1 + test/battle/status2/confusion.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b1dbcc61061..2ca3cd52f89 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2119,6 +2119,7 @@ static void Cmd_adjustdamage(void) } if (gSpecialStatuses[gBattlerAttacker].gemBoost && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && gBattleMons[gBattlerAttacker].item && gMovesInfo[gCurrentMove].effect != EFFECT_PLEDGE && gCurrentMove != MOVE_STRUGGLE) diff --git a/test/battle/status2/confusion.c b/test/battle/status2/confusion.c index 3c86e5d5552..03a17bcfeb1 100644 --- a/test/battle/status2/confusion.c +++ b/test/battle/status2/confusion.c @@ -26,3 +26,21 @@ SINGLE_BATTLE_TEST("Confusion adds a 50/33% chance to hit self with 40 power") EXPECT_EQ(damage[0], damage[1]); } } + +SINGLE_BATTLE_TEST("Confusion self hit does not consume Gems") +{ + PASSES_RANDOMLY(B_CONFUSION_SELF_DMG_CHANCE >= GEN_7 ? 33 : 50, 100, RNG_CONFUSION); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_TACKLE); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Normal Gem strengthened Wobbuffet's power!"); + } + MESSAGE("It hurt itself in its confusion!"); + } +} From 4f1dced851f2fb6b7153d3ad5646c2db2603d4a2 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Wed, 27 Nov 2024 22:50:39 +0100 Subject: [PATCH 34/56] Updated the new pokemon tutorial for 1.10 (#5721) Co-authored-by: Hedara Co-authored-by: Pawkkie <61265402+Pawkkie@users.noreply.github.com> --- docs/tutorials/how_to_new_pokemon_1_10_0.md | 1163 +++++++++++++++++++ 1 file changed, 1163 insertions(+) create mode 100644 docs/tutorials/how_to_new_pokemon_1_10_0.md diff --git a/docs/tutorials/how_to_new_pokemon_1_10_0.md b/docs/tutorials/how_to_new_pokemon_1_10_0.md new file mode 100644 index 00000000000..f6eaedee999 --- /dev/null +++ b/docs/tutorials/how_to_new_pokemon_1_10_0.md @@ -0,0 +1,1163 @@ + +This is a modified version of [the original tutorial about adding new Pokémon species available in Pokeemerald's wiki](https://github.com/pret/pokeemerald/wiki/How-to-add-a-new-Pokémon-species). + +Despite the persistent rumors about an incredibly strong third form of Mew hiding somewhere, it actually wasn't possible to catch it... OR WAS IT? +In this tutorial, we will add a new Pokémon species to the game. + +## IMPORTANT: This tutorial applies to 1.10.x versions. +- [Version 1.9.x](how_to_new_pokemon_1_9_0.md) +- [Version 1.8.x](how_to_new_pokemon_1_8_0.md) +- [Version 1.7.x](how_to_new_pokemon_1_7_0.md) +- [Version 1.6.x](how_to_new_pokemon_1_6_0.md) + +# Changes compared to vanilla +The main things that the Expansion changes are listed here. +* Still Front Pics *(`gMonStillFrontPic_YourPokemon`)* and by extension `src/anim_mon_front_pics.c` have been removed. +* `src/data/pokemon/cry_ids.h` doesn't exist anymore. +* You have 6 icon palettes available instead of the base 3. +* Most tables that use `SPECIES_x` as indexes have been moved to `gSpeciesInfo`. + +# Content +* [Useful resources](#useful-resources) +* [The Data - Part 1](#the-data---part-1) + * [1. Declare a species constant](#1-Declare-a-species-constant) + * [2. `SpeciesInfo`'s structure](#2-speciesinfos-structure) + * [3. Define its basic species information](#3-define-its-basic-species-information) + * [4. Species Name](#4-species-name) + * [5. Define its cry](#5-define-its-cry) + * [6. Define its Pokédex entry](#6-define-its-pokédex-entry) +* [The Graphics](#the-graphics) + * [1. Edit the sprites](#1-edit-the-sprites) + * [2. Add the sprites to the rom](#2-add-the-sprites-to-the-rom) + * [3. Add the animations to the rom](#3-add-the-animations-to-the-rom) + * [4. Linking graphic information to our Pokémon](#4-linking-graphic-information-to-our-pokémon) +* [The Data - Part 2](#the-data---part-2) + * [1. Species Flags](#1-species-flags) + * [2. Delimit the moveset](#2-delimit-the-moveset) + * [3. Define the Evolutions](#3-define-the-evolutions) + * [4. Make it appear!](#4-make-it-appear) +* [Optional data](#optional-data) + * [1. Form tables](#1-form-tables) + * [2. Form change tables](#2-form-change-tables) + * [3. Gender differences](#3-gender-differences) + * [4. Overworld Data](#4-overworld-data) + +# Useful resources +You can open a sprite debug menu by pressing `Select` in a Pokémon's summary screen outside of battle. + +![mGBA_6WOo1TSlsn](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/0c625cd8-8f89-4bc8-a285-b10a420a8f6d) + + +# The Data - Part 1 + +Our plan is as simple as it is brilliant: clone Mewtwo... and make it even stronger! + +## 1. Declare a species constant + +Our first step towards creating a new digital lifeform is to define its own species constant. + +Edit [include/constants/species.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/species.h): + +```diff + #define SPECIES_NONE 0 + #define SPECIES_BULBASAUR 1 + ... + #define SPECIES_MIMIKYU_BUSTED_TOTEM 1523 + #define SPECIES_MIMIKYU_TOTEM_BUSTED SPECIES_MIMIKYU_BUSTED_TOTEM ++#define SPECIES_MEWTHREE 1524 + +-#define SPECIES_EGG (SPECIES_MIMIKYU_BUSTED_TOTEM + 1) ++#define SPECIES_EGG (SPECIES_MEWTHREE + 1) + + #define NUM_SPECIES SPECIES_EGG +``` +This number is stored in a Pokémon's save structure. These should generally never change, otherwise your saved Pokémon species will change as well. + +We add this at the end so that no existing species change Id and so that we don't have to renumber everything after it. + +Now, let's see how it looks in-game! + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/dc15b0ba-a4bd-4f4e-9658-2dff73a11f79) + +Hmmm, something's not right... + +Oh, I know! We need to add the rest of the data! Normally, the vanilla game would crash if we try to look up anything about Mewthree in this state, but the expansion defaults all of its data to `SPECIES_NONE`. + +Now, let's see what needs to be done. + +## 2. `SpeciesInfo`'s structure +Now, to better understand Mewthree, we also need to understand Mew. Let's look at its data. +```diff + [SPECIES_MEW] = + { + .baseHP = 100, + .baseAttack = 100, + .baseDefense = 100, + .baseSpeed = 100, + .baseSpAttack = 100, + .baseSpDefense = 100, + .types = MON_TYPES(TYPE_PSYCHIC), + .catchRate = 45, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 300, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 270, + #else + .expYield = 64, + #endif + .evYield_HP = 3, + .itemCommon = ITEM_LUM_BERRY, + .itemRare = ITEM_LUM_BERRY, + .genderRatio = MON_GENDERLESS, + .eggCycles = 120, + .friendship = 100, + .growthRate = GROWTH_MEDIUM_SLOW, + .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), + .abilities = { ABILITY_SYNCHRONIZE, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PINK, + .speciesName = _("Mew"), + .cryId = CRY_MEW, + .natDexNum = NATIONAL_DEX_MEW, + .categoryName = _("New Species"), + .height = 4, + .weight = 40, + .description = COMPOUND_STRING( + "A Mew is said to possess the genes of all\n" + "Pokémon. It is capable of making itself\n" + "invisible at will, so it entirely avoids\n" + "notice even if it approaches people."), + .pokemonScale = 457, + .pokemonOffset = -2, + .trainerScale = 256, + .trainerOffset = 0, + .frontPic = gMonFrontPic_Mew, + .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(40, 40) : MON_COORDS_SIZE(64, 48), + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 13 : 9, + .frontAnimFrames = sAnims_Mew, + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_SWING_CONVEX : ANIM_ZIGZAG_SLOW, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 11, + .backPic = gMonBackPic_Mew, + .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(48, 48) : MON_COORDS_SIZE(64, 64), + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, + .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, + .palette = gMonPalette_Mew, + .shinyPalette = gMonShinyPalette_Mew, + .iconSprite = gMonIcon_Mew, + .iconPalIndex = 0, + SHADOW(0, 13, SHADOW_SIZE_S) + FOOTPRINT(Mew) + OVERWORLD( + sPicTable_Mew, + SIZE_32x32, + SHADOW_SIZE_M, + TRACKS_NONE, + gOverworldPalette_Mew, + gShinyOverworldPalette_Mew + ) + .isMythical = TRUE, + .isFrontierBanned = TRUE, + .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, + .levelUpLearnset = sMewLevelUpLearnset, + .teachableLearnset = sMewTeachableLearnset, + }, +``` + +That's a lot of stuff! But don't worry, we'll go through it step by step throughout the tutorial +(and it's miles better than having this same data through 20+ files like it used to be). + +We'll start by adding the self-explanatory data that's also present in pret's vanilla structure: + +## 3. Define its basic species information +Edit [src/data/pokemon/species_info.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/species_info.h): +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + [SPECIES_NONE] = {0}, + ... + + [SPECIES_EGG] = + { + FRONT_PIC(Egg, 24, 24), + .frontPicYOffset = 20, + .backPic = gMonFrontPic_Egg, + .backPicSize = MON_COORDS_SIZE(24, 24), + .backPicYOffset = 20, + .palette = gMonPalette_Egg, + .shinyPalette = gMonPalette_Egg, + ICON(Egg, 1), + }, + ++ [SPECIES_MEWTHREE] = ++ { ++ .baseHP = 106, ++ .baseAttack = 150, ++ .baseDefense = 70, ++ .baseSpeed = 140, ++ .baseSpAttack = 194, ++ .baseSpDefense = 120, ++ .types = MON_TYPES(TYPE_PSYCHIC), ++ .catchRate = 3, ++ .expYield = 255, ++ .evYield_SpAttack = 3, ++ .genderRatio = MON_GENDERLESS, ++ .eggCycles = 120, ++ .friendship = 0, ++ .growthRate = GROWTH_SLOW, ++ .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), ++ .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, ++ .bodyColor = BODY_COLOR_PURPLE, ++ }, + }; +``` + +The `.` is the structure reference operator in C to refer to the member object of the structure SpeciesInfo. + +- `baseHP`, `baseAttack`, `baseDefense`, `baseSpeed`, `baseSpAttack` and `baseSpDefense` are the base stats. They can't go higher than 255. +- `types` is using the macro `MON_TYPES` as a helper function for formatting so that only one type has to be input for species with a single type. + - To add a species with 2 types, use the format `MON_TYPES(TYPE_PSYCHIC, TYPE_NORMAL)`. +- `catchRate` is how likely it is to catch a Pokémon, the lower the value, the harder it is to catch. Legendaries generally have a catch rate of 3, so we put that here. +- `expYield` is the base amount of experience that a Pokémon gives when defeated/caught. In vanilla, this value caps at 255, but we've increased it to a maximum of 65535 accomodate later gen's higher experience yields. (The highest official value is Blissey's with 608, so going beyond this point may cause exponential gains that could break the system 😱) + - If you noticed, Mew's had some `#if`s, `#elif`s and `#endif` around it. This is because its yield has changed over time, and we let you choose which ones you want. This is not relevant to our Mewthree however, so we can just put a single `.expYield = 255,` line here. +- `evYield_HP`, `evYield_Attack`, `evYield_Defense`, `evYield_Speed`, `evYield_SpAttack` and `evYield_SpDefense` are how many EVs does the Pokémon give when they're caught. Each of these fields can have a value of 3 at most. Officially, no Pokémon give out more than 3 EVs total, with them being determined by their evolution stage (eg, Pichu, Pikachu and Raichu give 1, 2 and 3 Speed EVs respectively), and they tend to be associated with its higher stats. Since our Mewthree is a Special Attack monster, we'll be consistent and make it give out 3 Special Attack EVs, but you're always free to assign whatever you feel like :) + - Notice that the other `evYield` fields are not there. In C, numbers in a struct default to 0, so if we don't specify them, they'll be 0 all around! Less lines to worry about :D +- `itemCommon` and `itemRare` are used to determine what items is the Pokémon holding when encountering it in the wild. + - 50% for `itemCommon` and 5% for `itemRare` (boosted to 60%/20% when the first mon in the party has Compound Eyes or Super Luck) + - If they're both set as the same item, the item has a 100% chance of appearing. +- `genderRatio` is a fun one. + - There are 4 ways of handling this + - `PERCENT_FEMALE` is what most Pokémon use, where you define how likely it's gonna be female. It supports decimals, so you can put `PERCENT_FEMALE(12.5)` to have a 1 in 8 chance of your mon to be female. + - `MON_MALE` guarantees that all mon of this species will be male (eg. Tauros) + - `MON_FEMALE` guarantees that all mon of this species will be female (eg. Miltank) + - `MON_GENDERLESS` makes your species genderless, unable to breed with anything but Ditto to produce eggs. Most Legendaries are this, so we'll be chosing this as Mewthree's gender ratio. + - When working with evolution lines and don't want their genders to change after evolving, be sure that their gender ratios match their stages and evolution methods. Azurill is the only case where there's a mismatch, causing 1/3 of all Azurill to change from Female to Male. + - You might be wondering why some species have multiple defines for their genders, like `SPECIES_MEOWSTIC_(FE)MALE`. This is because those species have different stats and data from each other, so they're defined internally as different forms with `MON_MALE` and `MON_FEMALE` as gender ratios. If your species evolves depending on its gender and the evolutions have different stats, be sure to apply the correct evolution method! +- `eggCycles` determines how fast an egg of this species will hatch. Doesn't matter much for evolved species or those that can't lay eggs, but we add the field here just in case. +- `friendship` determines the amount of friendship of the mon when you catch it. Most Pokémon use `STANDARD_FRIENDSHIP`, but this creature of chaos does not want to be your friend, starting with 0. +- `growthRate` determines the amounts of experience required to reach each level. Go [here](https://bulbapedia.bulbagarden.net/wiki/Experience) for more info. + - This should be consistent across evolution lines, otherwise levels could change upon evolution. +- `eggGroups` are used for breed compatibility. Most Legendaries and Mythicals have the `EGG_GROUP_NO_EGGS_DISCOVERED` group, and so does our Mewthree. Go [here](https://bulbapedia.bulbagarden.net/wiki/Egg_Group) for more info. + - This is using the helper macro `MON_EGG_GROUPS`. +- `abilities` determines the potential abilites of our species. Notice how I also set the ability to `ABILITY_INSOMNIA`, so our little monster doesn't even need to sleep anymore. You can find the abilities for example here [include/constants/abilities.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/abilities.h). + - When both slot 1 and 2 are defined as not being `ABILITY_NONE`, their starting ability will be decided on a coin flip using their personality. They can later be changed using an Ability Capsule. + - Certain Pokémon such as Zygarde and Rockruff have different forms to add additional abilities. As such, they cannot be changed using an Ability Capsule (though the Zygarde Cube can change Zygarde's ability by changing them to their corresponding form) + - The 3rd slot is for Hidden Abilities. If defined as `ABILITY_NONE`, it will default to Slot 1 (eg. Metapod doesn't have a Hidden Ability, but Caterpie and Butterfree do). Go [here](https://bulbapedia.bulbagarden.net/wiki/Ability#Hidden_Abilities) and [here](https://bulbapedia.bulbagarden.net/wiki/Ability_Patch) for more info. + - If the array is defined as `{ABILITY_1, ABILITY_2}`, the Hidden Ability is set as `ABILITY_NONE`. +- `bodyColor` is used in the Pokédex as a search filter. +- `noFlip` is used in to prevent front sprites from being flipped horizontally and cause weird issues, like Clawitzer's big claw changing sides. + +That's all the basic fields present in vanilla emerald, so now let's take a look at the new fields added by the expansion. + +## 4. Species Name + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .bodyColor = BODY_COLOR_PURPLE, ++ .speciesName = _("Mewthree"), + }, + }; +``` +The `_()` underscore function doesn't really exist - it's a convention borrowed from GNU gettext to let `preproc` know this is text to be converted to the custom encoding used by the Gen 3 Pokemon games. + +## 5. Define its cry + +Time for audio! +We first need to convert an existing audio file to the format supported by the expansion. + +Most formats are supported for conversion, but for simplicity's sake, we're gonna use an mp3 file. + +Now, let's copy the file to the `sound/direct_sound_samples/cries` folder. +Once that's done, let's run the following command: +``` +ffmpeg -i sound/direct_sound_samples/cries/mewthree.mp3 -c:a pcm_s8 -ac 1 -ar 13379 sound/direct_sound_samples/cries/mewthree.aif +``` +This will convert your audio file to .aif, which is what's read by the compiler. + +Let's add the cry to the ROM via [sound/direct_sound_data.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/direct_sound_data.inc). + +```diff +.if P_FAMILY_PECHARUNT == TRUE + .align 2 +Cry_Pecharunt:: + .incbin "sound/direct_sound_samples/cries/pecharunt.bin" +.endif @ P_FAMILY_PECHARUNT + ++ .align 2 ++Cry_Mewthree:: ++ .incbin "sound/direct_sound_samples/cries/mewthree.bin" + +``` + +Then we add the cry ID to [include/constants/cries.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/cries.h): + +```diff +enum { + CRY_NONE, + ... +#if P_FAMILY_TERAPAGOS + CRY_TERAPAGOS, +#endif //P_FAMILY_TERAPAGOS +#if P_FAMILY_PECHARUNT + CRY_PECHARUNT, +#endif //P_FAMILY_PECHARUNT ++ CRY_MEWTHREE, + CRY_COUNT, +}; +``` + +And then link it in [sound/cry_tables.inc](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/sound/cry_tables.inc). `cry_reverse` in particular is for reversed cries used by moves such as Growl. The order of these two tables should match the order of the cry IDs, otherwise they'll be shifted. + +```diff + cry Cry_Terapagos + cry Cry_Pecharunt ++ cry Cry_Mewthree +``` +```diff + cry_reverse Cry_Terapagos + cry_reverse Cry_Pecharunt ++ cry_reverse Cry_Mewthree +``` + +Lastly, we add the cry to our species entry +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .speciesName = _("Mewthree"), ++ .cryId = CRY_MEWTHREE, + }, + }; +``` + +And let's see how it sounds in-game: + +https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/4f7667db-4db9-4bfd-a8dd-ece26f09f327 + +Good! Our monster now has a mighty roar! + +You can now delete the mp3 from the cries folder now once you made sure that the cry sounds like how you want it to. + +## 6. Define its Pokédex entry + +First, we will need to add new index constants for its Pokédex entry. The index constants are divided into the Hoenn Pokédex, which contains all Pokémon native to the Hoenn region, and the National Pokédex containing all known Pokémon, which can be received after entering the hall of fame for the first time. + +Edit [include/constants/pokedex.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/pokedex.h): + +```diff +// National Pokedex order +enum { + NATIONAL_DEX_NONE, + // Kanto + NATIONAL_DEX_BULBASAUR, +... + NATIONAL_DEX_PECHARUNT, ++ NATIONAL_DEX_MEWTHREE, +}; +``` + +```diff + #define KANTO_DEX_COUNT NATIONAL_DEX_MEW + #define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI + +#if P_GEN_9_POKEMON == TRUE +- #define NATIONAL_DEX_COUNT NATIONAL_DEX_PECHARUNT ++ #define NATIONAL_DEX_COUNT NATIONAL_DEX_MEWTHREE +``` + +Do keep in mind that if you intend to add your new species to the Hoenn Dex, you'll also want to add a `HOENN_DEX` constant for it and give it a `HOENN_TO_NATIONAL` member, like this: + +```diff +// Hoenn Pokedex order +enum { + HOENN_DEX_NONE, + HOENN_DEX_TREECKO, +... + HOENN_DEX_DEOXYS, ++ HOENN_DEX_MEWTHREE, +}; + +- #define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1) ++ #define HOENN_DEX_COUNT (HOENN_DEX_MEWTHREE + 1) +``` + +Edit [src/pokemon.c](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/pokemon.c): + +```diff + const u16 sHoennToNationalOrder[NUM_SPECIES] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) + { + HOENN_TO_NATIONAL(TREECKO), + ... + HOENN_TO_NATIONAL(DEOXYS), ++ HOENN_TO_NATIONAL(MEWTHREE), + }; +``` + +Now we can add the number and entry to our Mewthree: +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .cryId = CRY_MEWTHREE, ++ .natDexNum = NATIONAL_DEX_MEWTHREE, ++ .categoryName = _("New Species"), ++ .height = 15, ++ .weight = 330, ++ .description = COMPOUND_STRING( ++ "The rumors became true.\n" ++ "This is Mew's final form.\n" ++ "Its power level is over 9000.\n" ++ "Has science gone too far?"), ++ .pokemonScale = 256, ++ .pokemonOffset = 0, ++ .trainerScale = 290, ++ .trainerOffset = 2, + }, + }; +``` +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3759dd4c-8da5-4b1c-9a50-b9e9d0815e7f) + +The values `pokemonScale`, `pokemonOffset`, `trainerScale` and `trainerOffset` are used for the height comparison figure in the Pokédex. + +`height` and `weight` are specified in decimeters and hectograms respectively (which are meters and kilograms multiplied by 10, so 2.5 meters are 25 decimeters). + +In Pokémon Emerald, you can sort the Pokédex by name, height or weight. Apparently, the Pokémon order is hardcoded in the game files and not calculated from their data. Therefore we have to include our new Pokémon species at the right places. While the correct position for the alphabetical order is easy to find, it can become quite tedious for height and weight, so we added comments to the listings in order help out were they should fit. + +Edit [src/data/pokemon/pokedex_orders.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/pokedex_orders.h): + +```diff + const u16 gPokedexOrder_Alphabetical[] = + { + ... + NATIONAL_DEX_MEW, ++ NATIONAL_DEX_MEWTHREE, + NATIONAL_DEX_MEWTWO, + ... + }; + + const u16 gPokedexOrder_Weight[] = + { + ... + // 72.8 lbs / 33.0 kg + //NATIONAL_DEX_MEWTWO_MEGA_Y, + NATIONAL_DEX_ESCAVALIER, + NATIONAL_DEX_FRILLISH, + NATIONAL_DEX_DURANT, + NATIONAL_DEX_CINDERACE, ++ NATIONAL_DEX_MEWTHREE, + //NATIONAL_DEX_PERSIAN_ALOLAN, + NATIONAL_DEX_TOEDSCOOL, + // 73.4 lbs / 33.3 kg + NATIONAL_DEX_DUGTRIO, + ... + }; + + const u16 gPokedexOrder_Height[] = + { + ... + // 4'11" / 1.5m + ... + NATIONAL_DEX_GLIMMORA, + NATIONAL_DEX_WO_CHIEN, + NATIONAL_DEX_IRON_LEAVES, + NATIONAL_DEX_IRON_BOULDER, ++ NATIONAL_DEX_MEWTHREE, + // 5'03" / 1.6m + ... + }; +``` +![mGBA_lUBfmFEKUx](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/3a8b8a17-759b-486b-9831-deb2f494bd71) + + +# The Graphics +We will start by copying the following files for *Mew* (not Mewtwo) and rename it to `mewthree`. +```sh +cp -r graphics/pokemon/mew/. graphics/pokemon/mewthree +``` +We aren't copying Mewtwo's folder because he has those pesky Mega Evolutions that will get in the way of what we're doing, so our sample will need to be pure from the source. + +## 1. Edit the sprites +Let's edit the sprites. Start your favourite image editor (I recommend Aseprite or its free alternative, Libresprite) and change `anim_front.png` and `back.png` to meet your expectations. + +__Make sure that you are using the indexed mode and you have limited yourself to 15 colors!__ + +Put the RGB values of your colors into `normal.pal` between the first and the last color and the RGB values for the shiny version into `shiny.pal`. +Edit `footprint.png` using two colors in indexed mode, black and white. +Finally, edit `icon.png`. +**Note**: the icon will use one of 6 predefined palettes instead of `normal.pal`. +Open an icon sprite and load one of the palettes to find out which palette suits your icon sprite best. + +## 2. Add the sprites to the rom +Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them, which is kind of tedious. +First, create constants for the file paths. You'll want to add the constants for your species after the constants for the last valid species. + +Edit [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h): + +```diff +#if P_FAMILY_PECHARUNT + const u32 gMonFrontPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/front.4bpp.lz"); + const u32 gMonPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/normal.gbapal.lz"); + const u32 gMonBackPic_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/back.4bpp.lz"); + const u32 gMonShinyPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/shiny.gbapal.lz"); + const u8 gMonIcon_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/icon.4bpp"); +#if P_FOOTPRINTS + const u8 gMonFootprint_Pecharunt[] = INCBIN_U8("graphics/pokemon/pecharunt/footprint.1bpp"); +#endif //P_FOOTPRINTS +#if OW_POKEMON_OBJECT_EVENTS + const u32 gObjectEventPic_Pecharunt[] = INCBIN_COMP("graphics/pokemon/pecharunt/overworld.4bpp"); +#if OW_PKMN_OBJECTS_SHARE_PALETTES == FALSE + const u32 gOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_normal.gbapal.lz"); + const u32 gShinyOverworldPalette_Pecharunt[] = INCBIN_U32("graphics/pokemon/pecharunt/overworld_shiny.gbapal.lz"); +#endif //OW_PKMN_OBJECTS_SHARE_PALETTES +#endif //OW_POKEMON_OBJECT_EVENTS +#endif //P_FAMILY_PECHARUNT + + const u32 gMonFrontPic_Egg[] = INCBIN_U32("graphics/pokemon/egg/anim_front.4bpp.lz"); + const u32 gMonPalette_Egg[] = INCBIN_U32("graphics/pokemon/egg/normal.gbapal.lz"); + const u8 gMonIcon_Egg[] = INCBIN_U8("graphics/pokemon/egg/icon.4bpp"); + ++ const u32 gMonFrontPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/anim_front.4bpp.lz"); ++ const u32 gMonBackPic_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/back.4bpp.lz"); ++ const u32 gMonPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/normal.gbapal.lz"); ++ const u32 gMonShinyPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/shiny.gbapal.lz"); ++ const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); ++ const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); +``` + +Please note that Pecharunt, the Pokémon that should be above your insertion for the time being, reads a `front.png` sprite instead of an `anim_front.png` sprite. This is because currently, Pecharunt lacks a 2nd frame. If the front sprite sheet of your species uses 2 frames, you should use `anim_front`. + +## 3. Add the animations to the rom + +You can define the animation order, in which the sprites will be shown. The first number is the sprite index (so 0 or 1) and the second number is the number of frames the sprite will be visible. + +Edit [src/data/pokemon_graphics/front_pic_anims.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon_graphics/front_pic_anims.h): + +```diff +#if P_FAMILY_PECHARUNT +PLACEHOLDER_ANIM_SINGLE_FRAME(Pecharunt); +#endif //P_FAMILY_PECHARUNT + ++static const union AnimCmd sAnim_Mewthree_1[] = ++{ ++ ANIMCMD_FRAME(1, 30), ++ ANIMCMD_FRAME(0, 20), ++ ANIMCMD_END, ++}; +``` + +```diff +#if P_FAMILY_PECHARUNT +SINGLE_ANIMATION(Pecharunt); +#endif //P_FAMILY_PECHARUNT ++SINGLE_ANIMATION(Mewthree); +SINGLE_ANIMATION(Egg); +``` + +You might be wondering what `PLACEHOLDER_ANIM_SINGLE_FRAME` is. Well, since Pecharun only has 1 frame, we use what's called a preprocessor *macro* to have in a single line what otherwise would've been this in the C file: +```c +static const union AnimCmd sAnim_Pecharunt_1[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +} +``` +Instead, we can use the already established macro that does the same thing, replacing the value in parenthesis with what we want (in this case, `Pecharunt`): +```c +#define PLACEHOLDER_ANIM_SINGLE_FRAME(name) \ +static const union AnimCmd sAnim_##name##_1[] = \ +{ \ + ANIMCMD_FRAME(0, 1), \ + ANIMCMD_END, \ +} +``` + +## 4. Linking graphic information to our Pokémon +Now that we have all the external data ready, we just need to add it to `gSpeciesInfo` plus the rest of the animation and graphical data that we want to use: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 290, + .trainerOffset = 2, ++ .frontPic = gMonFrontPic_Mewthree, ++ .frontPicSize = MON_COORDS_SIZE(64, 64), ++ .frontPicYOffset = 0, ++ .frontAnimFrames = sAnims_Mewthree, ++ .frontAnimId = ANIM_GROW_VIBRATE, ++ .frontAnimDelay = 15, ++ .enemyMonElevation = 6, ++ .backPic = gMonBackPic_Mewthree, ++ .backPicSize = MON_COORDS_SIZE(64, 64), ++ .backPicYOffset = 0, ++ .backAnimId = BACK_ANIM_CONCAVE_ARC_SMALL, ++ .palette = gMonPalette_Mewthree, ++ .shinyPalette = gMonShinyPalette_Mewthree, + .iconSprite = gMonIcon_Mewthree, + .iconPalIndex = 2, ++ FOOTPRINT(Mewthree) + }, + }; +``` +Let's explain each of these: +- `frontPic`: + - Used to reference the front sprite, so in this case, we call for `gMonFrontPic_Mewthree`. +- `frontPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the front sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. +- `frontPicYOffset`: + - Used to define what Y position the sprite sits at. This is used to set where they'd be "grounded". For the shadow, see `enemyMonElevation`. +- `frontAnimFrames`: + - We link our animation frame animations that we defined earlier here. +- `frontAnimId`: + - Because you are limited to two frames, there are already [predefined front sprite animations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h), describing translations, rotations, scalings or color changes. +- `frontAnimDelay`: + - Sets a delay in frame count between when the Pokémon appears and when the animation starts. +- `enemyMonElevation`: + - Used to determine the altitude from the ground. Any value above 0 will show a shadow under the Pokémon, to signify that they're floating. +- `backPic`: + - Used to reference the back sprite, so in this case, we call for `gMonBackPic_Mewthree`. +- `backPicSize`: + - The two values (`width` and `height`) are used for defining the non-empty size of the back sprite, which is used in move animations. If you're unsure of the values, you can leave them both as 64. + - **NOTE**: Mew has a tarnary switch here in order to change values depending on if a config option is set for displaying th original Gen 3 sprites. +- `backPicYOffset`: + - Used to define what Y position of the back sprite. When working with the animation debug menu, we recommend aligning the back sprite to the white background, as it was designed to properyly align with the real battle layout. +- `backAnimId`: + - Like `frontAnimId` except for the back sprites and them being a single frame. The IDs listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/pokemon_animation.h) are used to represent 3 different animations that happen based on the the Pokémon's nature. +- `palette`: + - Used to reference the non-shiny palette, so in this case, we call for `gMonPalette_Mewthree`. +- `shinyPalette`: + - Used to reference the shiny palette, so in this case, we call for `gMonShinyPalette_Mewthree`. +- `iconSprite`: + - Used to reference the icon sprite, so in this case, we call for `gMonIcon_Mewthree`. +- `iconPalIndex`: + - Here, you can choose between the six icon palettes; 0, 1, 2, 3, 4 and 5. All of them located in `graphics/pokemon/icon_palettes`. +- `FOOTPRINT` + - We made this single field into a macro so that they can be ignored when `P_FOOTPRINTS` is set to false. It's also why we don't have an "," after calling it like the other macros (we add it as part of the macro itself). + ```c + #if P_FOOTPRINTS + #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, + #else + #define FOOTPRINT(sprite) + #endif + ``` + +# The Data - Part 2 + +We're almost there just a bit left! + +## 1. Species Flags + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_NONE }, + .bodyColor = BODY_COLOR_PURPLE, ++ .isLegendary = TRUE, ++ .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, + }, + }; +``` +Each species flag provides properties to the species: +- `isLegendary`: + - Does nothing. +- `isMythical`: + - Is skipped during Pokédex evaluations. + - Unless it also has the `dexForceRequired` flag. + - Cannot obtain Gigantamax factor via `ToggleGigantamaxFactor`. +- `isUltraBeast`: + - Beast Ball's multiplier is set to x5 for this species. + - All other ball multipliers are set to x0.1. +- `isParadox` (previously `isParadoxForm`): + - Makes it so that Booster Energy cannot be knocked off. +- `isTotem`: + - Does nothing. +- `isMegaEvolution`: + - A Mega indicator is added to the battle box indicating that they're Mega Evolved. + - The species doesn't receive affection benefits. + - Required when adding new Mega Evolutions. +- `isPrimalReversion`: + - A Primal Reversion indicator (Alpha or Omega for Kyogre/Groudon respectively) is added to the battle box indicating that they're Primal Reverted. + - Required when adding new Primal Reversions. +- `isUltraBurst`: + - Required when adding new Ultra Burst forms. +- `isGigantamax`: + - Used to determine if Gigantamax forms should have their GMax moves or not. + - Required when adding new Gigantamax forms. +- `isAlolanForm`, `isGalarianForm`, `isHisuianForm`, `isPaldeanForm`: + - In the future, these will be used to determine breeding offspring from different based on their region. +- `cannotBeTraded`: + - This species cannot be traded away (like Black/White Kyurem). +- `perfectIVCount`: + - Guarantees that the number of IVs specified here will be perfect. +- `tmIlliterate`: + - This species will be unable to learn the universal moves. +- `isFrontierBanned`: + - This species will be unable to enter Battle Frontier facilities. Replaces `gFrontierBannedSpecies`. + +## 2. Delimit the moveset + +Let's begin with the moves that can be learned by leveling up. + +Append to [src/data/pokemon/level_up_learnsets/gen_9.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/level_up_learnsets/gen_9.h): +**NOTE**: You can ignore the warning at the top of the file if you're just adding moves to Pokemon. + +```diff +#if P_FAMILY_PECHARUNT +static const struct LevelUpMove sPecharuntLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_MEMENTO), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 8, MOVE_WITHDRAW), + LEVEL_UP_MOVE(16, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(24, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(32, MOVE_PARTING_SHOT), + LEVEL_UP_MOVE(40, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(48, MOVE_MALIGNANT_CHAIN), + LEVEL_UP_MOVE(56, MOVE_TOXIC), + LEVEL_UP_MOVE(64, MOVE_NASTY_PLOT), + LEVEL_UP_MOVE(72, MOVE_RECOVER), + LEVEL_UP_END +}; +#endif + ++static const struct LevelUpMove sMewthreeLevelUpLearnset[] = { ++ LEVEL_UP_MOVE( 1, MOVE_CONFUSION), ++ LEVEL_UP_MOVE( 1, MOVE_DISABLE), ++ LEVEL_UP_MOVE(11, MOVE_BARRIER), ++ LEVEL_UP_MOVE(22, MOVE_SWIFT), ++ LEVEL_UP_MOVE(33, MOVE_PSYCH_UP), ++ LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT), ++ LEVEL_UP_MOVE(55, MOVE_MIST), ++ LEVEL_UP_MOVE(66, MOVE_PSYCHIC), ++ LEVEL_UP_MOVE(77, MOVE_AMNESIA), ++ LEVEL_UP_MOVE(88, MOVE_RECOVER), ++ LEVEL_UP_MOVE(99, MOVE_SAFEGUARD), ++ LEVEL_UP_END ++}; +``` +**NOTE**: If `P_LVL_UP_LEARNSETS` is not set to something equal to `GEN_9`, the file to be edited will change to what's specified. + +Again, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + .palette = gMonPalette_Mewthree, + .shinyPalette = gMonShinyPalette_Mewthree, + .iconSprite = gMonIcon_Mewthree, + .iconPalIndex = 2, ++ .levelUpLearnset = sMewthreeLevelUpLearnset, + }, + }; +``` + +Next we need to specify which moves can be taught via TM, HM, or Move Tutor. + +Append to [src/data/pokemon/teachable_learnsets.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/teachable_learnsets.h): + +```diff +#if P_FAMILY_PECHARUNT +static const u16 sPecharuntTeachableLearnset[] = { + ... + MOVE_UNAVAILABLE, +}; +#endif //P_FAMILY_PECHARUNT + ++static const u16 sMewthreeTeachableLearnset[] = { ++ MOVE_FOCUS_PUNCH, ++ MOVE_WATER_PULSE, ++ MOVE_CALM_MIND, ++ MOVE_TOXIC, ++ MOVE_HAIL, ++ MOVE_BULK_UP, ++ 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_SAFEGUARD, ++ MOVE_FRUSTRATION, ++ MOVE_SOLAR_BEAM, ++ MOVE_IRON_TAIL, ++ MOVE_THUNDERBOLT, ++ MOVE_THUNDER, ++ MOVE_EARTHQUAKE, ++ MOVE_RETURN, ++ MOVE_PSYCHIC, ++ MOVE_SHADOW_BALL, ++ MOVE_BRICK_BREAK, ++ MOVE_DOUBLE_TEAM, ++ MOVE_REFLECT, ++ MOVE_SHOCK_WAVE, ++ MOVE_FLAMETHROWER, ++ MOVE_SANDSTORM, ++ MOVE_FIRE_BLAST, ++ MOVE_ROCK_TOMB, ++ MOVE_AERIAL_ACE, ++ MOVE_TORMENT, ++ MOVE_FACADE, ++ MOVE_SECRET_POWER, ++ MOVE_REST, ++ MOVE_SKILL_SWAP, ++ MOVE_SNATCH, ++ MOVE_STRENGTH, ++ MOVE_FLASH, ++ MOVE_ROCK_SMASH, ++ MOVE_MEGA_PUNCH, ++ MOVE_MEGA_KICK, ++ MOVE_BODY_SLAM, ++ MOVE_DOUBLE_EDGE, ++ MOVE_COUNTER, ++ MOVE_SEISMIC_TOSS, ++ MOVE_MIMIC, ++ MOVE_METRONOME, ++ MOVE_DREAM_EATER, ++ MOVE_THUNDER_WAVE, ++ MOVE_SUBSTITUTE, ++ MOVE_DYNAMIC_PUNCH, ++ MOVE_PSYCH_UP, ++ MOVE_SNORE, ++ MOVE_ICY_WIND, ++ MOVE_ENDURE, ++ MOVE_MUD_SLAP, ++ MOVE_ICE_PUNCH, ++ MOVE_SWAGGER, ++ MOVE_SLEEP_TALK, ++ MOVE_SWIFT, ++ MOVE_THUNDER_PUNCH, ++ MOVE_FIRE_PUNCH, ++ MOVE_UNAVAILABLE, // This is required to determine where the array ends. ++}; +#endif +``` + +Once more, we need to register the learnset in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) + .levelUpLearnset = sMewthreeLevelUpLearnset, ++ .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +If you want to create a Pokémon which can breed, you will need to edit [src/data/pokemon/egg_moves.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/pokemon/egg_moves.h). + + +## 3. Define the Evolutions + +We want Mewthree to evolve from Mewtwo by reaching level 100. + +Edit `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTWO] = + { + ... + FOOTPRINT(Mewtwo) + .isLegendary = TRUE, + .levelUpLearnset = sMewtwoLevelUpLearnset, + .teachableLearnset = sMewtwoTeachableLearnset, + .formSpeciesIdTable = sMewtwoFormSpeciesIdTable, + .formChangeTable = sMewtwoFormChangeTable, ++ .evolutions = EVOLUTION({EVO_LEVEL, 100, SPECIES_MEWTHREE}), + }, + }; +``` + +## 4. Make it appear! +Now Mewthree really does slumber in the games code - but we won't know until we make him appear somewhere! The legend tells that Mewthree is hiding somewhere in Petalburg Woods... + +Edit [src/data/wild_encounters.json](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/wild_encounters.json): + +```diff + { + "map": "MAP_PETALBURG_WOODS", + "base_label": "gPetalburgWoods", + "land_mons": { + "encounter_rate": 20, + "mons": [ + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_POOCHYENA" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_WURMPLE" + }, + { + "min_level": 5, + "max_level": 5, + "species": "SPECIES_SHROOMISH" + }, + { +- "min_level": 6, +- "max_level": 6, +- "species": "SPECIES_POOCHYENA" ++ "min_level": 5, ++ "max_level": 5, ++ "species": "SPECIES_MEWTHREE" + }, + ... + } +``` + +Congratulations, you have created your own personal pocket monster! You may call yourself a mad scientist now. + +# Optional data + +Now that you now have all the essential pieces to create a base species, there are some aspects that you might want to know if you want to do other stuff with your custom Pokémon. + +## 1. Form tables +Found in `src/data/pokemon/form_species_tables.h`. + +These are introduced to have a reference of what forms correspond to what Species of Pokémon. For example, we have Pikachu's table: +```c +#if P_FAMILY_PIKACHU +static const u16 sPikachuFormSpeciesIdTable[] = { + SPECIES_PIKACHU, + SPECIES_PIKACHU_COSPLAY, + SPECIES_PIKACHU_ROCK_STAR, + SPECIES_PIKACHU_BELLE, + SPECIES_PIKACHU_POP_STAR, + SPECIES_PIKACHU_PH_D, + SPECIES_PIKACHU_LIBRE, + SPECIES_PIKACHU_ORIGINAL_CAP, + SPECIES_PIKACHU_HOENN_CAP, + SPECIES_PIKACHU_SINNOH_CAP, + SPECIES_PIKACHU_UNOVA_CAP, + SPECIES_PIKACHU_KALOS_CAP, + SPECIES_PIKACHU_ALOLA_CAP, + SPECIES_PIKACHU_PARTNER_CAP, + SPECIES_PIKACHU_WORLD_CAP, + FORM_SPECIES_END, +}; +#endif //P_FAMILY_PIKACHU +``` +We register the table each form entry in `gSpeciesInfo`. + +```diff + [SPECIES_PIKACHU] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, + {EVO_NONE, 0, SPECIES_RAICHU_ALOLAN}), + }, + + [SPECIES_PIKACHU_COSPLAY] = + { + ... + .teachableLearnset = sPikachuTeachableLearnset, ++ .formSpeciesIdTable = sPikachuFormSpeciesIdTable, + }, +``` +...and so on. + +What this allows us to do is to be able to get all forms of a Pokémon in our code by using the `GetSpeciesFormTable` function. + +For example, in the HGSS dex, it lets us browse between the entries of every form available.: + +![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/a1a90b79-46a1-4cd6-97d6-ec5d741bfdc8) ![image](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/7cffc6be-0b5c-4074-b689-736a97297843) + +In addition, we have the `GET_BASE_SPECIES_ID` macro, which returns the first entry of the table (or return the species itself if it doesn't have a table registered). With this, you can check if a Pokémon is any form of a species. For example, making it so that the Light Ball affects all Pikachu forms: +```c + case HOLD_EFFECT_LIGHT_BALL: + if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_PIKACHU && IS_MOVE_SPECIAL(move)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); + break; +``` + +## 2. Form change tables +Found in `src/data/pokemon/form_species_tables.h`. + +These tables, unlike the regular form tables, registers how Pokémon can switch between forms. + +```c +#if P_FAMILY_GASTLY +static const struct FormChange sGengarFormChangeTable[] = { + {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, + {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GIGANTAMAX}, + {FORM_CHANGE_TERMINATOR}, +}; +#endif //P_FAMILY_GASTLY +``` +The first value is the type of form change. In the case of Gengar, we have both Mega Evolution and Gigantamax form changes. + +The second value is the target form, to which the Pokémon will change into. + +Values after that are referred as arguments, and needs to be put there depends on the type of form change, detailed in `include/constants/form_change_types.h`. + +## 3. Gender differences +![mGBA_Wq5cbDkNZG](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/45256192-b451-4baa-af06-f57ca16e1e46) + +You may have seen that there's a couple of duplicate fields with a "Female" suffix. +```diff + [SPECIES_FRILLISH] = + { + ... + .frontPic = gMonFrontPic_Frillish, ++ .frontPicFemale = gMonFrontPic_FrillishF, + .frontPicSize = MON_COORDS_SIZE(56, 56), ++ .frontPicSizeFemale = MON_COORDS_SIZE(56, 56), + .frontPicYOffset = 5, + .frontAnimFrames = sAnims_Frillish, + .frontAnimId = ANIM_RISING_WOBBLE, + .backPic = gMonBackPic_Frillish, ++ .backPicFemale = gMonBackPic_FrillishF, + .backPicSize = MON_COORDS_SIZE(40, 56), ++ .backPicSizeFemale = MON_COORDS_SIZE(40, 56), + .backPicYOffset = 7, + .backAnimId = BACK_ANIM_CONVEX_DOUBLE_ARC, + .palette = gMonPalette_Frillish, ++ .paletteFemale = gMonPalette_FrillishF, + .shinyPalette = gMonShinyPalette_Frillish, ++ .shinyPaletteFemale = gMonShinyPalette_FrillishF, + .iconSprite = gMonIcon_Frillish, ++ .iconSpriteFemale = gMonIcon_FrillishF, + .iconPalIndex = 0, ++ .iconPalIndexFemale = 1, + FOOTPRINT(Frillish) + .levelUpLearnset = sFrillishLevelUpLearnset, + .teachableLearnset = sFrillishTeachableLearnset, + .evolutions = EVOLUTION({EVO_LEVEL, 40, SPECIES_JELLICENT}), + }, +``` +These are used to change the graphics of the Pokémon if they're female. If they're not registered, they default to the male values. + +However, `iconPalIndexFemale` is a special case, where it's *doesn't* read the male icon palette if its `iconSpriteFemale` is set, so if you're setting a female icon, be sure to set their palette index as well. + +## 4. Overworld Data +![mGBA_4iqvhhSltK](https://github.com/rh-hideout/pokeemerald-expansion/assets/2904965/e59238dc-9779-4f26-a9e7-159a32caa3d9) + +If you have `OW_POKEMON_OBJECT_EVENTS` in your hack, you can add Overworld of your new species by following these steps: + +First, since you copied the contents from Mew's folder previously, you should also have copied its overworld sprites. Edit those to your liking, as we have done before, making sure to update the palettes + +Secondly, in [src/data/graphics/pokemon.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/pokemon.h), add the following: + +```diff + const u8 gMonIcon_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/icon.4bpp"); + const u8 gMonFootprint_Mewthree[] = INCBIN_U8("graphics/pokemon/mewthree/footprint.1bpp"); ++ const u32 gObjectEventPic_Mewthree[] = INCBIN_COMP("graphics/pokemon/mewthree/overworld.4bpp"); ++ const u32 gOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_normal.gbapal.lz"); ++ const u32 gShinyOverworldPalette_Mewthree[] = INCBIN_U32("graphics/pokemon/mewthree/overworld_shiny.gbapal.lz"); +``` + +Thirdly, in [spritesheet_rules.mk](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/spritesheet_rules.mk) + +```diff +$(POKEMONGFXDIR)/mewtwo/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + ++$(POKEMONGFXDIR)/mewthree/overworld.4bpp: %.4bpp: %.png ++ $(GFX) $< $@ -mwidth 4 -mheight 4 + +$(POKEMONGFXDIR)/mew/overworld.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 +``` + +Fourthly, in [src/data/object_events/object_event_pic_tables_followers.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/object_events/object_event_pic_tables_followers.h): +```diff +#if P_FAMILY_PECHARUNT +/*static const struct SpriteFrameImage sPicTable_Pecharunt[] = { + overworld_ascending_frames(gObjectEventPic_Pecharunt, 4, 4), +};*/ +#endif //P_FAMILY_PECHARUNT + ++static const struct SpriteFrameImage sPicTable_Mewthree[] = { ++ overworld_ascending_frames(gObjectEventPic_Mewthree, 4, 4), ++}; +``` + +And finally, in `gSpeciesInfo`: + +```diff + const struct SpeciesInfo gSpeciesInfo[] = + { + ... + [SPECIES_MEWTHREE] = + { + ... + FOOTPRINT(Mewthree) ++ OVERWORLD( ++ sPicTable_Mewthree, ++ SIZE_32x32, ++ SHADOW_SIZE_M, ++ TRACKS_FOOT, ++ gOverworldPalette_Mewthree, ++ gShinyOverworldPalette_Mewthree ++ ) + .levelUpLearnset = sMewthreeLevelUpLearnset, + .teachableLearnset = sMewthreeTeachableLearnset, + }, + }; +``` + +### Sprite Size +Depending on your species, you might want to use different sizes for it. For example, certain species known for being big like Steelix use sprites that fit a 64x64 frame instead of 32x32, and as such have `SIZE_64x64` in their data instead of `SIZE_32x32` to accomodate for them. + +Also, in `spritesheet_rules.mk`, `-mwidth` and `-mheight` need to be set to 8 instead of 4 for such cases. + +### Shadows +Gen 4 style shadows are defined by the `SHADOW` macro which takes the following arguments: + - X offset + - Y offset + - Shadow size +You have 4 options for their shadow, between Small, Medium, Large and Extra Large: + - `SHADOW_SIZE_S` + - `SHADOW_SIZE_M` + - `SHADOW_SIZE_L` + - `SHADOW_SIZE_XL_BATTLE_ONLY` +To make the Pokémon have no shadow, use the `NO_SHADOW` macro instead of `SHADOW`. + +### Tracks +You have 4 options for the tracks that your species will leave behind on sand. + - `TRACKS_NONE` + - `TRACKS_FOOT` ![sand_footprints](https://github.com/user-attachments/assets/8b8c34d6-72e9-4b9d-839d-0a5cc1ae1a4c) + - `TRACKS_SLITHER` ![slither_tracks](https://github.com/user-attachments/assets/28219c05-61e0-48b3-9aeb-43f48e4ffdd4) + - `TRACKS_SPOT` ![spot_tracks](https://github.com/user-attachments/assets/f7a24887-c5ca-47f2-8825-01f3df61deca) + - `TRACKS_BUG` ![bug_tracks](https://github.com/user-attachments/assets/8cd1dea4-4123-4af8-a558-992874a6d589) + + ...though technically you can also use `TRACKS_BIKE_TIRE` if you wish to. + +![bike_tire_tracks](https://github.com/user-attachments/assets/ac81d211-85e5-443a-ac54-c2976f1f0b82) From 174177a4d57d102bc181c02b2422d1b88a55b1dd Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 28 Nov 2024 11:17:48 +0100 Subject: [PATCH 35/56] Fixes minor move desc errors (#5728) --- src/data/moves_info.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 3a6837dd2b1..df12555c5bd 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -12220,7 +12220,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = { .name = COMPOUND_STRING("Coil"), .description = COMPOUND_STRING( - "Coils up to raise Attack\n" + "Coils up to raise Attack,\n" "Defense and Accuracy."), .effect = EFFECT_COIL, .power = 0, @@ -17336,7 +17336,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .name = COMPOUND_STRING("Octolock"), .description = COMPOUND_STRING( "Traps the foe to lower Def\n" - "and Sp. Def fall each turn."), + "and Sp. Def each turn."), .effect = EFFECT_OCTOLOCK, .power = 0, .type = TYPE_FIGHTING, From 88cdd8bdfb901d22149ba027e17eadebb92b2839 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 28 Nov 2024 11:22:32 +0100 Subject: [PATCH 36/56] Fixes Kee Maranga and Enigma Berry (#5727) --- include/battle.h | 2 +- src/battle_util.c | 4 ++-- test/battle/hold_effect/enigma_berry.c | 16 ++++++++++++++++ test/battle/hold_effect/kee_berry.c | 16 ++++++++++++++++ test/battle/hold_effect/maranga_berry.c | 16 ++++++++++++++++ 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/include/battle.h b/include/battle.h index fda1639fa5e..20afe876ca3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -831,7 +831,7 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[gBattlerTarget])) -#define BATTLER_TURN_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[battler])) +#define BATTLER_TURN_DAMAGED(battlerId) ((gSpecialStatuses[battlerId].physicalDmg != 0 || gSpecialStatuses[battlerId].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[battlerId])) #define IS_BATTLER_OF_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, FALSE) == type || GetBattlerType(battlerId, 1, FALSE) == type || (GetBattlerType(battlerId, 2, FALSE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, FALSE) == type))) #define IS_BATTLER_OF_BASE_TYPE(battlerId, type)((GetBattlerType(battlerId, 0, TRUE) == type || GetBattlerType(battlerId, 1, TRUE) == type || (GetBattlerType(battlerId, 2, TRUE) != TYPE_MYSTERY && GetBattlerType(battlerId, 2, TRUE) == type))) diff --git a/src/battle_util.c b/src/battle_util.c index de0d3e7cc66..dc98c278e39 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6831,7 +6831,7 @@ static u8 TrySetEnigmaBerry(u32 battler) { if (IsBattlerAlive(battler) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && ((TARGET_TURN_DAMAGED && gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) + && ((BATTLER_TURN_DAMAGED(battler) && gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) || gBattleScripting.overrideBerryRequirements) && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) && (B_HEAL_BLOCKING < GEN_5 || !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))) { @@ -6855,7 +6855,7 @@ static u8 DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 category) || (!DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && GetBattleMoveCategory(gCurrentMove) == category && battler != gBattlerAttacker - && TARGET_TURN_DAMAGED)) + && BATTLER_TURN_DAMAGED(battler))) ) { BufferStatChange(battler, statId, STRINGID_STATROSE); diff --git a/test/battle/hold_effect/enigma_berry.c b/test/battle/hold_effect/enigma_berry.c index c678b178d3e..16a598b2725 100644 --- a/test/battle/hold_effect/enigma_berry.c +++ b/test/battle/hold_effect/enigma_berry.c @@ -58,3 +58,19 @@ SINGLE_BATTLE_TEST("Enigma Berry does nothing if Heal Block applies") } } } + +DOUBLE_BATTLE_TEST("Enigma Berry doesn't trigger if partner was hit") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_ENIGMA_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } THEN { + EXPECT(opponentRight->item == ITEM_ENIGMA_BERRY); + } +} diff --git a/test/battle/hold_effect/kee_berry.c b/test/battle/hold_effect/kee_berry.c index ace35a824c3..35a4e6fcd56 100644 --- a/test/battle/hold_effect/kee_berry.c +++ b/test/battle/hold_effect/kee_berry.c @@ -73,3 +73,19 @@ SINGLE_BATTLE_TEST("Kee Berry doesn't trigger if the item hold user used a physi EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); } } + +DOUBLE_BATTLE_TEST("Kee Berry doesn't trigger if partner was hit") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_KEE_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } THEN { + EXPECT(opponentRight->item == ITEM_KEE_BERRY); + } +} diff --git a/test/battle/hold_effect/maranga_berry.c b/test/battle/hold_effect/maranga_berry.c index a7b90bd9b3e..036b2a51c02 100644 --- a/test/battle/hold_effect/maranga_berry.c +++ b/test/battle/hold_effect/maranga_berry.c @@ -73,3 +73,19 @@ SINGLE_BATTLE_TEST("Maranga Berry doesn't trigger if the item hold user used a s EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE); } } + +DOUBLE_BATTLE_TEST("Maranga Berry doesn't trigger if partner was hit") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_MARANGA_BERRY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } THEN { + EXPECT(opponentRight->item == ITEM_MARANGA_BERRY); + } +} From 0cd0e0b00567c87f649ba9111f0092d6bb5fd9ea Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 28 Nov 2024 11:24:38 +0100 Subject: [PATCH 37/56] Fixes Blunder Policy (#5722) --- src/battle_script_commands.c | 9 +++- test/battle/hold_effect/blunder_policy.c | 67 ++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 test/battle/hold_effect/blunder_policy.c diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2ca3cd52f89..7a9409d4d46 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1767,8 +1767,6 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u if (!RandomPercentage(RNG_ACCURACY, accuracy)) { gMoveResultFlags |= MOVE_RESULT_MISSED; - if (holdEffectAtk == HOLD_EFFECT_BLUNDER_POLICY) - gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_DARTS && !recalcDragonDarts // So we don't jump back and forth between targets @@ -2532,6 +2530,13 @@ static void Cmd_resultmessage(void) return; } + if (gMoveResultFlags & MOVE_RESULT_MISSED && !(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) + { + if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_BLUNDER_POLICY + && !IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks + } + if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) { if (gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up diff --git a/test/battle/hold_effect/blunder_policy.c b/test/battle/hold_effect/blunder_policy.c new file mode 100644 index 00000000000..552ad2f6fbd --- /dev/null +++ b/test/battle/hold_effect/blunder_policy.c @@ -0,0 +1,67 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_BLUNDER_POLICY].holdEffect == HOLD_EFFECT_BLUNDER_POLICY); +} + +SINGLE_BATTLE_TEST("Blunder Policy raises the users speed by 2 stages if the user misses") +{ + PASSES_RANDOMLY(3, 10, RNG_ACCURACY); + GIVEN { + ASSUME(gMovesInfo[MOVE_FOCUS_BLAST].accuracy == 70); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BLUNDER_POLICY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_BLAST); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_BLAST, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } +} + + +SINGLE_BATTLE_TEST("Blunder Policy will never trigger if the move fails due to an immunity") +{ + PASSES_RANDOMLY(10, 10, RNG_ACCURACY); + GIVEN { + ASSUME(gMovesInfo[MOVE_FOCUS_BLAST].accuracy == 70); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BLUNDER_POLICY); } + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_BLAST); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_BLAST, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } + } THEN { + EXPECT(player->item == ITEM_BLUNDER_POLICY); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Blunder Policy will never trigger if the move fails due to Protect") +{ + PASSES_RANDOMLY(10, 10, RNG_ACCURACY); + GIVEN { + ASSUME(gMovesInfo[MOVE_FOCUS_BLAST].accuracy == 70); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BLUNDER_POLICY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_FOCUS_BLAST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_BLAST, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } + } THEN { + EXPECT(player->item == ITEM_BLUNDER_POLICY); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} From c4fe97011e5269e83d91cd710c22501f1e86bc3c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 28 Nov 2024 22:51:34 +0100 Subject: [PATCH 38/56] Fix Floral Healing anim (#5733) --- data/battle_anim_scripts.s | 4 ++-- test/battle/form_change/primal_reversion.c | 16 ---------------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 68f804e8edc..55abebbbf03 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -10103,7 +10103,6 @@ Move_FLORAL_HEALING:: loadspritegfx ANIM_TAG_ORBS @circles loadspritegfx ANIM_TAG_PINK_PETAL @pink particles monbg ANIM_ATTACKER - monbg ANIM_TARGET playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER call CIRCLES_LEAVES call CIRCLES_LEAVES @@ -10111,6 +10110,7 @@ Move_FLORAL_HEALING:: panse SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 0x2, 0x0 playsewithpan SE_M_TWISTER, 0x0 createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x46, 0x1, 0x40 + clearmonbg ANIM_ATTACKER delay 0x2 createsprite gFloralHealingWindLeavesTemplate, ANIM_ATTACKER, 2, 0x3c, 0x0, 0x40 delay 0x2 @@ -10133,6 +10133,7 @@ Move_FLORAL_HEALING:: createsprite gSweetScentPetalSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0x0, 0x78 delay 0x2 loopsewithpan SE_M_POISON_POWDER, SOUND_PAN_TARGET, 0x12, 0xa + monbg ANIM_TARGET call FloralHealingSpores call FloralHealingSpores call FloralHealingSpores @@ -10143,7 +10144,6 @@ Move_FLORAL_HEALING:: createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 16, 0xc, 0xfffb, 0x1, 0x0, 0x20, 0x3c, 0x1 waitforvisualfinish clearmonbg ANIM_TARGET - clearmonbg ANIM_ATTACKER end FloralHealingSpores: createsprite gFloralHealingFlowerTemplate, ANIM_ATTACKER, 2, 0x0, 0xffec, 0x55, 0x50, 0x0 diff --git a/test/battle/form_change/primal_reversion.c b/test/battle/form_change/primal_reversion.c index 4b9e019b5bc..df19a1d0d6a 100644 --- a/test/battle/form_change/primal_reversion.c +++ b/test/battle/form_change/primal_reversion.c @@ -332,19 +332,3 @@ DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); } } - -SINGLE_BATTLE_TEST("111") -{ - GIVEN { - ASSUME(gMovesInfo[MOVE_TACKLE].power != 0); - PLAYER(SPECIES_GROUDON) { HP(1); Item(ITEM_RED_ORB); } - PLAYER(SPECIES_WOBBUFFET) - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } - } SCENE { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, player); - MESSAGE("Groudon's Primal Reversion! It reverted to its primal form!"); - MESSAGE("Groudon fainted!"); - } -} From 0f4b59898419b4ae2167ab7a14fb7c2e92daded3 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 28 Nov 2024 23:21:42 +0100 Subject: [PATCH 39/56] Fixes Aegislash not reverting back (#5734) --- include/constants/form_change_types.h | 4 ++++ src/battle_script_commands.c | 5 ++--- src/battle_util.c | 4 ++++ src/data/pokemon/form_change_tables.h | 8 +++++--- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/include/constants/form_change_types.h b/include/constants/form_change_types.h index 74bc16cf2f5..79a8a4cee7b 100644 --- a/include/constants/form_change_types.h +++ b/include/constants/form_change_types.h @@ -134,4 +134,8 @@ // param1: amount of days #define FORM_CHANGE_DAYS_PASSED 23 +// Form change for Aegislash +#define FORM_CHANGE_BATTLE_ATTACK 24 +#define FORM_CHANGE_BATTLE_KINGS_SHIELD 25 + #endif // GUARD_CONSTANTS_FORM_CHANGE_TYPES_H diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7a9409d4d46..f8619880d0a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1127,7 +1127,6 @@ static bool32 NoTargetPresent(u8 battler, u32 move) return FALSE; } -// TODO: Convert this to a proper FORM_CHANGE type. static bool32 TryAegiFormChange(void) { // Only Aegislash with Stance Change can transform, transformed mons cannot. @@ -1142,12 +1141,12 @@ static bool32 TryAegiFormChange(void) case SPECIES_AEGISLASH_SHIELD: // Shield -> Blade if (IS_MOVE_STATUS(gCurrentMove)) return FALSE; - gBattleMons[gBattlerAttacker].species = SPECIES_AEGISLASH_BLADE; + TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_ATTACK); break; case SPECIES_AEGISLASH_BLADE: // Blade -> Shield if (gCurrentMove != MOVE_KINGS_SHIELD) return FALSE; - gBattleMons[gBattlerAttacker].species = SPECIES_AEGISLASH_SHIELD; + TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_KINGS_SHIELD); break; } diff --git a/src/battle_util.c b/src/battle_util.c index dc98c278e39..7e0970bcab3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10848,6 +10848,10 @@ u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method) if (GetBattlerTeraType(battler) == formChanges[i].param1) targetSpecies = formChanges[i].targetSpecies; break; + case FORM_CHANGE_BATTLE_ATTACK: + case FORM_CHANGE_BATTLE_KINGS_SHIELD: + targetSpecies = formChanges[i].targetSpecies; + break; } } } diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 52f888a55b3..153dde2546e 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -789,9 +789,11 @@ static const struct FormChange sFurfrouFormChangeTable[] = { #if P_FAMILY_HONEDGE static const struct FormChange sAegislashFormChangeTable[] = { - {FORM_CHANGE_BATTLE_SWITCH, SPECIES_AEGISLASH_SHIELD}, - {FORM_CHANGE_FAINT, SPECIES_AEGISLASH_SHIELD}, - {FORM_CHANGE_END_BATTLE, SPECIES_AEGISLASH_SHIELD}, + {FORM_CHANGE_BATTLE_ATTACK, SPECIES_AEGISLASH_BLADE}, + {FORM_CHANGE_BATTLE_KINGS_SHIELD, SPECIES_AEGISLASH_SHIELD}, + {FORM_CHANGE_BATTLE_SWITCH, SPECIES_AEGISLASH_SHIELD}, + {FORM_CHANGE_FAINT, SPECIES_AEGISLASH_SHIELD}, + {FORM_CHANGE_END_BATTLE, SPECIES_AEGISLASH_SHIELD}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_HONEDGE From 320c015565854c982da8a368db3d3f84ec475710 Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 29 Nov 2024 11:58:40 +0100 Subject: [PATCH 40/56] Fixed test messages --- test/battle/ability/intimidate.c | 12 ++++++------ test/battle/hold_effect/red_card.c | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index f3b1f05c0ca..e0f97d5bdaf 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -281,9 +281,9 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral TURN { MOVE(player, move); SEND_OUT(player, 1); } } SCENE { ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); - MESSAGE("Neutralizing Gas filled the area!"); + MESSAGE("Neutralizing gas filled the area!"); ANIMATION(ANIM_TYPE_MOVE, move, player); - MESSAGE("The effects of Neutralizing Gas wore off!"); + MESSAGE("The effects of the neutralizing gas wore off!"); ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); SEND_IN_MESSAGE("Wobbuffet"); } THEN { @@ -316,11 +316,11 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral } } SCENE { ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); - MESSAGE("Neutralizing Gas filled the area!"); + MESSAGE("Neutralizing gas filled the area!"); ANIMATION(ANIM_TYPE_MOVE, move, opponent); if (item != ITEM_NONE) ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("The effects of Neutralizing Gas wore off!"); + MESSAGE("The effects of the neutralizing gas wore off!"); ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); if (item != ITEM_NONE) { SEND_IN_MESSAGE("Wobbuffet"); @@ -341,9 +341,9 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral TURN { MOVE(opponent, MOVE_FELL_STINGER); SEND_OUT(player, 1); } } SCENE { ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); - MESSAGE("Neutralizing Gas filled the area!"); + MESSAGE("Neutralizing gas filled the area!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FELL_STINGER, opponent); - MESSAGE("The effects of Neutralizing Gas wore off!"); + MESSAGE("The effects of the neutralizing gas wore off!"); ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); MESSAGE("Weezing fainted!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index c2a7238934e..aa312797b28 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -486,7 +486,7 @@ SINGLE_BATTLE_TEST("Red Card activates before Eject Pack") MESSAGE("Wobbuffet is switched out with the Eject Button!"); } ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); - MESSAGE("Foe Wobbuffet held up its Red Card against Wobbuffet!"); + MESSAGE("The opposing Wobbuffet held up its Red Card against Wobbuffet!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); } } From e4ef3a440fbdb18f86c16d39441768caea8be6d2 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Fri, 29 Nov 2024 18:46:45 +0100 Subject: [PATCH 41/56] Automatic Line Breaks, somewhat even lines (#5689) Co-authored-by: Hedara Co-authored-by: Eduardo Quezada --- include/battle_message.h | 1 + include/line_break.h | 33 ++++ src/battle_controller_player.c | 2 + src/battle_controller_safari.c | 2 + src/battle_message.c | 62 ++------ src/line_break.c | 281 +++++++++++++++++++++++++++++++++ 6 files changed, 331 insertions(+), 50 deletions(-) create mode 100644 include/line_break.h create mode 100644 src/line_break.c diff --git a/include/battle_message.h b/include/battle_message.h index 0b4570e389f..7d000d289fd 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -10,6 +10,7 @@ max(POKEMON_NAME_LENGTH + 1, \ ABILITY_NAME_LENGTH + 1))) #define BATTLE_MSG_MAX_WIDTH 208 +#define BATTLE_MSG_MAX_LINES 2 // for 0xFD #define B_TXT_BUFF1 0x0 diff --git a/include/line_break.h b/include/line_break.h new file mode 100644 index 00000000000..c423c9bf405 --- /dev/null +++ b/include/line_break.h @@ -0,0 +1,33 @@ +#ifndef GUARD_LINE_BREAK_H +#define GUARD_LINE_BREAK_H + +#define BADNESS_UNFILLED 1 // Badness added per pixel diff from max width +#define BADNESS_JAGGED 1 // Badness added per pixel diff from longest, squared per line +#define BADNESS_RUNT 100 // Badness added if there's a runt +#define BADNESS_OVERFLOW 100 // Badness added per pixel overflow, squared per line (not used) +#define BADNESS_WIDE_SPACE 1 // Badness added per extra pixel width (not used) +#define MAX_SPACE_WIDTH 5 + +struct StringWord { + u32 startIndex:16; + u32 length:8; + u32 width:8; +}; + +struct StringLine { + struct StringWord *words; + u16 numWords; + u8 spaceWidth; + u8 extraSpaceWidth; +}; + +void StripLineBreaks(u8 *src); +void BreakStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId); +void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId); + +bool32 IsWordSplittingChar(const u8 *src, u32 index); +u32 GetStringBadness(struct StringLine *stringLines, u32 numLines, u32 maxWidth); +void BuildNewString(struct StringLine *stringLines, u32 numLines, u32 maxLines, u8 *str); +bool32 StringHasManualBreaks(u8 *src); + +#endif // GUARD_LINE_BREAK_H diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 87b1cd5ca4a..33969994873 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -31,6 +31,7 @@ #include "text.h" #include "util.h" #include "window.h" +#include "line_break.h" #include "constants/battle_anim.h" #include "constants/battle_move_effects.h" #include "constants/battle_partner.h" @@ -2044,6 +2045,7 @@ static void PlayerHandleChooseAction(u32 battler) ActionSelectionCreateCursorAt(gActionSelectionCursor[battler], 0); PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, battler, gBattlerPartyIndexes[battler]); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo); + BreakStringAutomatic(gDisplayedStringBattle, WindowWidthPx(B_WIN_ACTION_PROMPT), 2, FONT_NORMAL); if (B_SHOW_PARTNER_TARGET && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) { diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index b85157f2466..932ce47fd93 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -20,6 +20,7 @@ #include "text.h" #include "util.h" #include "window.h" +#include "line_break.h" #include "constants/battle_anim.h" #include "constants/songs.h" #include "constants/trainers.h" @@ -298,6 +299,7 @@ static void SafariHandleChooseAction(u32 battler) ActionSelectionCreateCursorAt(gActionSelectionCursor[battler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo2); + BreakStringAutomatic(gDisplayedStringBattle, WindowWidthPx(B_WIN_ACTION_PROMPT), 2, FONT_NORMAL); BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT); } diff --git a/src/battle_message.c b/src/battle_message.c index 049bda6d39c..0dbb0c76a4d 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -22,6 +22,7 @@ #include "text.h" #include "trainer_hill.h" #include "window.h" +#include "line_break.h" #include "constants/abilities.h" #include "constants/battle_dome.h" #include "constants/battle_string_ids.h" @@ -165,6 +166,11 @@ const u8 gText_drastically[] = _("drastically "); const u8 gText_severely[] = _("severely "); static const u8 sText_TerrainReturnedToNormal[] = _("The terrain returned to normal!"); // Unused +// Remove these when done testing +static const u8 sTest_TempTestText1[] = _("This is a text for testing stuff."); +static const u8 sTest_TempTestText2[] = _("This is a text for testing stuff that should be two lines."); +static const u8 sTest_TempTestText3[] = _("This is a text for testing stuff that should be three lines so it has to have some extra text."); + const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { [STRINGID_TRAINER1LOSETEXT] = COMPOUND_STRING("{B_TRAINER1_LOSE_TEXT}"), @@ -1402,8 +1408,8 @@ const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!"); const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{WAIT_SE}\p"); const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p"); const u8 gText_EllipsisQuestionMark[] = _("……?\p"); -const u8 gText_WhatWillPkmnDo[] = _("What will\n{B_BUFF1} do?"); -const u8 gText_WhatWillPkmnDo2[] = _("What will\n{B_PLAYER_NAME} do?"); +const u8 gText_WhatWillPkmnDo[] = _("What will {B_BUFF1} do?"); +const u8 gText_WhatWillPkmnDo2[] = _("What will {B_PLAYER_NAME} do?"); const u8 gText_WhatWillWallyDo[] = _("What will\nWALLY do?"); const u8 gText_LinkStandby[] = _("{PAUSE 16}Link standby…"); const u8 gText_BattleMenu[] = _("Battle{CLEAR_TO 56}Bag\nPokémon{CLEAR_TO 56}Run"); @@ -2421,8 +2427,7 @@ static void GetBattlerNick(u32 battler, u8 *dst) } \ } \ GetBattlerNick(battler, text); \ - toCpy = text; \ - dstWidth = GetStringLineWidth(fontId, dst, letterSpacing, lineNum, dstSize); + toCpy = text; #define HANDLE_NICKNAME_STRING_LOWERCASE(battler) \ if (GetBattlerSide(battler) != B_SIDE_PLAYER) \ @@ -2439,8 +2444,7 @@ static void GetBattlerNick(u32 battler, u8 *dst) } \ } \ GetBattlerNick(battler, text); \ - toCpy = text; \ - dstWidth = GetStringLineWidth(fontId, dst, letterSpacing, lineNum, dstSize); + toCpy = text; static const u8 *BattleStringGetOpponentNameByTrainerId(u16 trainerId, u8 *text, u8 multiplayerId, u8 battler) { @@ -2589,17 +2593,10 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) { u32 dstID = 0; // if they used dstID, why not use srcID as well? const u8 *toCpy = NULL; - u32 lastValidSkip = 0; - u32 toCpyWidth = 0; - u32 dstWidth = 0; - // This buffer may hold either the name of a trainer, Pokémon, or item. u8 text[max(max(max(32, TRAINER_NAME_LENGTH + 1), POKEMON_NAME_LENGTH + 1), ITEM_NAME_LENGTH)]; u8 *textStart = &text[0]; u8 multiplayerId; u8 fontId = FONT_NORMAL; - s16 letterSpacing = 0; - u32 lineNum = 1; - u32 displayedLineNums = 1; if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) multiplayerId = gRecordedBattleMultiplayerId; @@ -2617,7 +2614,6 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) while (*src != EOS) { toCpy = NULL; - dstWidth = GetStringLineWidth(fontId, dst, letterSpacing, lineNum, dstSize); if (*src == PLACEHOLDER_BEGIN) { @@ -3122,18 +3118,6 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) if (toCpy != NULL) { - toCpyWidth = GetStringLineWidth(fontId, toCpy, letterSpacing, 1, dstSize); - - if (dstWidth + toCpyWidth > BATTLE_MSG_MAX_WIDTH) - { - dst[lastValidSkip] = displayedLineNums == 1 ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL; - dstWidth = GetStringLineWidth(fontId, dst, letterSpacing, lineNum, dstSize); - if (displayedLineNums == 1) - displayedLineNums++; - else - displayedLineNums = 1; - lineNum++; - } while (*toCpy != EOS) { dst[dstID] = *toCpy; @@ -3153,31 +3137,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) } else { - toCpyWidth = GetGlyphWidth(*src, FALSE, fontId); dst[dstID] = *src; - if (dstWidth + toCpyWidth > BATTLE_MSG_MAX_WIDTH) - { - dst[lastValidSkip] = displayedLineNums == 1 ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL; - if (displayedLineNums == 1) - displayedLineNums++; - else - displayedLineNums = 1; - lineNum++; - dstWidth = 0; - } - switch (*src) - { - case CHAR_PROMPT_CLEAR: - case CHAR_PROMPT_SCROLL: - displayedLineNums = 1; - case CHAR_NEWLINE: - lineNum++; - dstWidth = 0; - //fallthrough - case CHAR_SPACE: - lastValidSkip = dstID; - break; - } dstID++; } src++; @@ -3186,6 +3146,8 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) dst[dstID] = *src; dstID++; + BreakStringAutomatic(dst, BATTLE_MSG_MAX_WIDTH, BATTLE_MSG_MAX_WIDTH, fontId); + return dstID; } diff --git a/src/line_break.c b/src/line_break.c new file mode 100644 index 00000000000..b8888f501f8 --- /dev/null +++ b/src/line_break.c @@ -0,0 +1,281 @@ +#include "global.h" +#include "line_break.h" +#include "text.h" +#include "malloc.h" + +void StripLineBreaks(u8 *src) +{ + u32 currIndex = 0; + while (src[currIndex] != EOS) + { + if (src[currIndex] == CHAR_PROMPT_SCROLL || src[currIndex] == CHAR_NEWLINE) + src[currIndex] = CHAR_SPACE; + currIndex++; + } +} + +void BreakStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId) +{ + u32 currIndex = 0; + u8 *currSrc = src; + while (src[currIndex] != EOS) + { + if (src[currIndex] == CHAR_PROMPT_CLEAR) + { + u8 replacedChar = src[currIndex + 1]; + src[currIndex + 1] = EOS; + BreakSubStringAutomatic(currSrc, maxWidth, screenLines, fontId); + src[currIndex + 1] = replacedChar; + currSrc = &src[currIndex + 1]; + } + currIndex++; + } + BreakSubStringAutomatic(currSrc, maxWidth, screenLines, fontId); +} + +void BreakSubStringAutomatic(u8 *src, u32 maxWidth, u32 screenLines, u8 fontId) +{ + // If the string already has line breaks, don't interfere with them + if (StringHasManualBreaks(src)) + return; + // Sanity check + if (src[0] == EOS) + return; + u32 numChars = 1; + u32 numWords = 1; + u32 currWordIndex = 0; + u32 currWordLength = 1; + bool32 isPrevCharSplitting = FALSE; + bool32 isCurrCharSplitting; + // Get numbers of chars in string and count words + while (src[numChars] != EOS) + { + isCurrCharSplitting = IsWordSplittingChar(src, numChars); + if (isCurrCharSplitting && !isPrevCharSplitting) + numWords++; + isPrevCharSplitting = isCurrCharSplitting; + numChars++; + } + // Allocate enough space for word data + struct StringWord *allWords = Alloc(numWords*sizeof(struct StringWord)); + + allWords[currWordIndex].startIndex = 0; + allWords[currWordIndex].width = 0; + isPrevCharSplitting = FALSE; + // Fill in word begin index and lengths + for (u32 i = 1; i < numChars; i++) + { + isCurrCharSplitting = IsWordSplittingChar(src, i); + if (isCurrCharSplitting && !isPrevCharSplitting) + { + allWords[currWordIndex].length = currWordLength; + currWordIndex++; + currWordLength = 0; + } + else if (!isCurrCharSplitting && isPrevCharSplitting) + { + allWords[currWordIndex].startIndex = i; + allWords[currWordIndex].width = 0; + currWordLength++; + } + else + { + currWordLength++; + } + isPrevCharSplitting = isCurrCharSplitting; + } + allWords[currWordIndex].length = currWordLength; + + // Fill in individual word widths + for (u32 i = 0; i < numWords; i++) + { + for (u32 j = 0; j < allWords[i].length; j++) + allWords[i].width += GetGlyphWidth(src[allWords[i].startIndex + j], FALSE, fontId); + } + + // Step 1: Does it all fit one one line? Then no break + // Step 2: Try to split across minimum number of lines + u32 spaceWidth = GetGlyphWidth(0, FALSE, fontId); + u32 totalWidth = allWords[0].width; + // Calculate total widths without any line breaks + for (u32 i = 1; i < numWords; i++) + totalWidth += allWords[i].width + spaceWidth; + + // If it doesn't fit on 1 line, do fancy line break calculation + // NOTE: Currently the line break calculation isn't fancy + if (totalWidth > maxWidth) + { + // Figure out how many lines are needed with naive method + u32 currLineWidth = 0; + u32 totalLines = 1; + bool32 shouldTryAgain; + for (currWordIndex = 0; currWordIndex < numWords; currWordIndex++) + { + if (currLineWidth + allWords[currWordIndex].length > maxWidth) + { + totalLines++; + currLineWidth = allWords[currWordIndex].width; + } + else + { + currLineWidth += allWords[currWordIndex].width + spaceWidth; + } + } + // LINE LAYOUT STARTS HERE + struct StringLine *stringLines; + do + { + shouldTryAgain = FALSE; + u16 targetLineWidth = totalWidth/totalLines; + stringLines = Alloc(totalLines*sizeof(struct StringLine)); + for (u32 lineIndex = 0; lineIndex < totalLines; lineIndex++) + { + stringLines[lineIndex].numWords = 0; + stringLines[lineIndex].spaceWidth = spaceWidth; + stringLines[lineIndex].extraSpaceWidth = 0; + } + currWordIndex = 0; + u16 currLineIndex = 0; + stringLines[currLineIndex].words = &allWords[currWordIndex]; + stringLines[currLineIndex].numWords = 1; + currLineWidth = allWords[currWordIndex].width; + currWordIndex++; + while (currWordIndex < numWords) + { + if (currLineWidth + spaceWidth + allWords[currWordIndex].width > maxWidth) + { + // go to next line + currLineIndex++; + if (currLineIndex == totalLines) + { + totalLines++; + Free(stringLines); + shouldTryAgain = TRUE; + break; + } + stringLines[currLineIndex].words = &allWords[currWordIndex]; + stringLines[currLineIndex].numWords = 1; + currLineWidth = allWords[currWordIndex].width; + currWordIndex++; + } + else if (currLineWidth > targetLineWidth) + { + // go to next line + currLineIndex++; + if (currLineIndex == totalLines) + { + totalLines++; + Free(stringLines); + shouldTryAgain = TRUE; + break; + } + stringLines[currLineIndex].words = &allWords[currWordIndex]; + stringLines[currLineIndex].numWords = 1; + currLineWidth = allWords[currWordIndex].width; + currWordIndex++; + } + else + { + // continue on current line + // add word and space width + currLineWidth += spaceWidth + allWords[currWordIndex].width; + stringLines[currLineIndex].numWords++; + currWordIndex++; + } + } + } while (shouldTryAgain); + //u32 currBadness = GetStringBadness(stringLines, totalLines, maxWidth); + BuildNewString(stringLines, totalLines, screenLines, src); + Free(stringLines); + } + + Free(allWords); +} + +// Only allow word splitting on allowed chars +bool32 IsWordSplittingChar(const u8 *src, u32 index) +{ + switch (src[index]) + { + case CHAR_SPACE: + return TRUE; + default: + return FALSE; + } +} + +// Badness calculation +// unfilled lines scale linerarly +// jagged lines scales by the square +// runts scale linearly +// numbers not final +// ISN'T ACTUALLY USED RIGHT NOW +u32 GetStringBadness(struct StringLine *stringLines, u32 numLines, u32 maxWidth) +{ + u32 badness = 0; + u32 *lineWidths = Alloc(numLines*4); + u32 widestWidth = 0; + for (u32 i = 0; i < numLines; i++) + { + lineWidths[i] = 0; + for (u32 j = 0; j < stringLines[i].numWords; j++) + lineWidths[i] += stringLines[i].words[j].width; + lineWidths[i] += (stringLines[i].numWords-1)*stringLines[i].spaceWidth; + if (lineWidths[i] > widestWidth) + widestWidth = lineWidths[i]; + if (stringLines[i].numWords == 1) + badness += BADNESS_RUNT; + } + for (u32 i = 0; i < numLines; i++) + { + u32 extraSpaceWidth = 0; + if (lineWidths[i] != widestWidth) + { + // Not the best way to do this, ideally a line should be allowed to get longer than current widest + // line. But then the widest line has to be recalculated. + while (lineWidths[i] + (extraSpaceWidth + 1) * (stringLines[i].numWords - 1) < widestWidth && extraSpaceWidth < MAX_SPACE_WIDTH) + extraSpaceWidth++; + lineWidths[i] += extraSpaceWidth*(stringLines[i].numWords-1); + } + badness += (maxWidth - lineWidths[i]) * BADNESS_UNFILLED; + u32 baseBadness = (widestWidth - lineWidths[i]) * BADNESS_JAGGED; + badness += baseBadness*baseBadness; + stringLines[i].extraSpaceWidth = extraSpaceWidth; + } + Free(lineWidths); + return badness; +} + +// Build the new string from the data stored in the StringLine structs +void BuildNewString(struct StringLine *stringLines, u32 numLines, u32 maxLines, u8 *str) +{ + u32 srcCharIndex = 0; + for (u32 lineIndex = 0; lineIndex < numLines; lineIndex++) + { + srcCharIndex += stringLines[lineIndex].words[0].length; + for (u32 wordIndex = 1; wordIndex < stringLines[lineIndex].numWords; wordIndex++) + // Add length of word and a space + srcCharIndex += stringLines[lineIndex].words[wordIndex].length + 1; + if (lineIndex + 1 < numLines) + { + // Add the appropriate line break depending on line number + if (lineIndex >= maxLines - 1 && numLines > maxLines) + str[srcCharIndex] = CHAR_PROMPT_SCROLL; + else + str[srcCharIndex] = CHAR_NEWLINE; + srcCharIndex++; + } + } +} + +bool32 StringHasManualBreaks(u8 *src) +{ + u32 charIndex = 0; + while (src[charIndex] != EOS) + { + if (src[charIndex] == CHAR_PROMPT_SCROLL || src[charIndex] == CHAR_NEWLINE) + return TRUE; + charIndex++; + } + return FALSE; +} From 51fbc80ac5a9c9003bff03399f156e9366638a5d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 30 Nov 2024 23:32:46 +0100 Subject: [PATCH 42/56] Fixes Misty Terrain displaying wrong message (#5742) --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 7e0970bcab3..f95b8f99019 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2784,7 +2784,7 @@ u8 DoBattlerEndTurnEffects(void) && !IsLeafGuardProtected(battler)) { CancelMultiTurnMoves(battler); - gEffectBattler = battler; + gEffectBattler = gBattlerTarget = battler; if (IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; From 953f2292e2b28a031b02c5171be7b901515a0b89 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sat, 30 Nov 2024 17:39:27 -0500 Subject: [PATCH 43/56] Fixes Switch in flag not restoring mons properly with test (#5746) --- src/battle_ai_util.c | 1 + test/battle/ai/ai_switching.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0277d7fd078..c033061dc9e 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3507,6 +3507,7 @@ u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePoke SetBattlerAiData(battlerAtk, AI_DATA); u32 aiMonFaster = AI_IsFaster(battlerAtk, battlerDef, moveConsidered); FreeRestoreBattleMons(savedBattleMons); + SetBattlerAiData(battlerAtk, AI_DATA); return aiMonFaster; } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 5610689f49e..7f2368261d1 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -895,3 +895,17 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup TURN { MOVE(player, MOVE_TACKLE); EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities when scoring moves") +{ + GIVEN { + ASSUME(B_PRANKSTER_DARK_TYPES >= GEN_7); + ASSUME(gSpeciesInfo[SPECIES_GRENINJA].types[1] == TYPE_DARK); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_GRENINJA) { Moves(MOVE_WATER_GUN); } + OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_PRANKSTER); Moves(MOVE_LEECH_SEED, MOVE_STUN_SPORE, MOVE_ABSORB); } + OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_INFILTRATOR); } + } WHEN { + TURN { MOVE(player, MOVE_WATER_GUN); EXPECT_MOVE(opponent, MOVE_ABSORB); } + } +} From 3343a16a7c00bb7eef9f7f261033ddd185d4c9cc Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 30 Nov 2024 23:49:50 +0100 Subject: [PATCH 44/56] Fixes Dynamax dynamic move type (#5739) --- src/battle_dynamax.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 073e2c55bcb..e0b782d12cd 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -280,7 +280,10 @@ static u16 GetTypeBasedMaxMove(u32 battler, u32 type) // Returns the appropriate Max Move or G-Max Move for a battler to use. u16 GetMaxMove(u32 battler, u32 baseMove) { - u32 move = baseMove; + u32 moveType; + SetTypeBeforeUsingMove(baseMove, battler); + GET_MOVE_TYPE(baseMove, moveType); + if (baseMove == MOVE_NONE) // for move display { return MOVE_NONE; @@ -291,18 +294,12 @@ u16 GetMaxMove(u32 battler, u32 baseMove) } else if (gMovesInfo[baseMove].category == DAMAGE_CATEGORY_STATUS) { - move = MOVE_MAX_GUARD; - } - else if (gBattleStruct->dynamicMoveType) - { - move = GetTypeBasedMaxMove(battler, gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK); + return MOVE_MAX_GUARD; } else { - move = GetTypeBasedMaxMove(battler, gMovesInfo[baseMove].type); + return GetTypeBasedMaxMove(battler, moveType); } - - return move; } // First value is for Fighting, Poison and Multi-Attack. The second is for everything else. From b3b0973fbb88b5ab368925d764ba3cbee289ae54 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 1 Dec 2024 00:06:17 +0100 Subject: [PATCH 45/56] Fixes Population Bomb / Triple Kick missing message (#5747) --- asm/macros/battle_script.inc | 4 +--- include/config/battle.h | 2 +- src/battle_script_commands.c | 40 +++++++++++------------------------- 3 files changed, 14 insertions(+), 32 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 6dbcabe43ec..27488c25d8a 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -798,9 +798,7 @@ 2: .endm - .macro setmultihitcounter value:req - .byte 0x8d - .byte \value + .macro unused_0x8d .endm .macro initmultihitstring diff --git a/include/config/battle.h b/include/config/battle.h index fbc41be6ba7..1b19d0d2c9a 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -6,7 +6,7 @@ #define B_CRIT_MULTIPLIER GEN_LATEST // In Gen6+, critical hits multiply damage by 1.5 instead of 2. #define B_PARALYSIS_SPEED GEN_LATEST // In Gen7+, Speed is decreased by 50% instead of 75%. #define B_CONFUSION_SELF_DMG_CHANCE GEN_LATEST // In Gen7+, confusion has a 33.3% of self-damage, instead of 50%. -#define B_MULTI_HIT_CHANCE GEN_LATEST // In Gen5+, multi-hit moves have different %. See Cmd_setmultihitcounter for values. +#define B_MULTI_HIT_CHANCE GEN_LATEST // In Gen5+, multi-hit moves have different %. See SetRandomMultiHitCounter for values. #define B_WHITEOUT_MONEY GEN_LATEST // In Gen4+, the amount of money lost by losing a battle is determined by the amount of badges earned. Previously, it would cut the current money by half. (While this change was also in FRLG, for the sake of simplicity, setting this to GEN_3 will result in RSE behavior.) #define B_LIGHT_BALL_ATTACK_BOOST GEN_LATEST // In Gen4+, Light Ball doubles the power of physical moves in addition to special moves. #define B_SANDSTORM_SPDEF_BOOST GEN_LATEST // In Gen4+, Sandstorm weather multiplies the Sp. Defense of Rock-type Pokémon by x1.5. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f8619880d0a..0375cfeed01 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -481,7 +481,7 @@ static void Cmd_statbuffchange(void); static void Cmd_normalisebuffs(void); static void Cmd_setbide(void); static void Cmd_twoturnmoveschargestringandanimation(void); -static void Cmd_setmultihitcounter(void); +static void Cmd_unused_0x8d(void); static void Cmd_initmultihitstring(void); static void Cmd_forcerandomswitch(void); static void Cmd_tryconversiontypechange(void); @@ -740,7 +740,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_normalisebuffs, //0x8A Cmd_setbide, //0x8B Cmd_twoturnmoveschargestringandanimation, //0x8C - Cmd_setmultihitcounter, //0x8D + Cmd_unused_0x8d, //0x8D Cmd_initmultihitstring, //0x8E Cmd_forcerandomswitch, //0x8F Cmd_tryconversiontypechange, //0x90 @@ -2538,6 +2538,15 @@ static void Cmd_resultmessage(void) if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) { + if (gMultiHitCounter && gMultiHitCounter < gMovesInfo[gCurrentMove].strikeCount) + { + gMultiHitCounter = 0; + gMoveResultFlags &= ~MOVE_RESULT_MISSED; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_MultiHitPrintStrings; + return; + } + if (gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up CreateAbilityPopUp(gBattlerTarget, gBattleMons[gBattlerTarget].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0); stringId = gMissStringIds[gBattleCommunication[MISS_TYPE]]; @@ -12019,33 +12028,8 @@ static void Cmd_twoturnmoveschargestringandanimation(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setmultihitcounter(void) +static void Cmd_unused_0x8d(void) { - CMD_ARGS(u8 value); - - if (cmd->value) - { - gMultiHitCounter = cmd->value; - } - else - { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_SKILL_LINK) - { - gMultiHitCounter = 5; - } - else - { - // WARNING: These seem to be unused, see SetRandomMultiHitCounter. - if (B_MULTI_HIT_CHANCE >= GEN_5) - // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. - gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); - else - // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. - gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); - } - } - - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_initmultihitstring(void) From acdd447160f6e069a57b291ab551e0a65a181ee9 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 1 Dec 2024 01:19:08 +0100 Subject: [PATCH 46/56] Changes Max Phantasm move anim script call (#5737) --- data/battle_anim_scripts.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 55abebbbf03..48ccc089dc5 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -34257,7 +34257,7 @@ Move_G_MAX_TERROR:: Move_MAX_PHANTASM:: createvisualtask AnimTask_DynamaxGrowth, 0x5, 0x1, 0x1 waitforvisualfinish - goto Move_PHANTOM_FORCE + goto Move_SHADOW_BALL end Move_G_MAX_GRAVITAS:: From 987264caea512645d06d999531e56e7e4b4c1ac2 Mon Sep 17 00:00:00 2001 From: SarnPoke <77281351+SarnPoke@users.noreply.github.com> Date: Sun, 1 Dec 2024 01:35:44 +0100 Subject: [PATCH 47/56] Deoxys Sprite/Animation Fixes (#5603) --- graphics/pokemon/deoxys/anim_front.png | Bin 1484 -> 1494 bytes graphics/pokemon/deoxys/attack/anim_front.png | Bin 1705 -> 1787 bytes graphics/pokemon/deoxys/attack/normal.pal | 4 ++-- .../pokemon/deoxys/defense/anim_front.png | Bin 1280 -> 1670 bytes graphics/pokemon/deoxys/defense/normal.pal | 6 +++--- graphics/pokemon/deoxys/defense/shiny.pal | 2 +- graphics/pokemon/deoxys/normal.pal | 6 +++--- graphics/pokemon/deoxys/shiny.pal | 2 +- graphics/pokemon/deoxys/speed/anim_front.png | Bin 1599 -> 1681 bytes graphics/pokemon/deoxys/speed/normal.pal | 4 ++-- src/data/pokemon_graphics/front_pic_anims.h | 3 +-- 11 files changed, 13 insertions(+), 14 deletions(-) diff --git a/graphics/pokemon/deoxys/anim_front.png b/graphics/pokemon/deoxys/anim_front.png index d2f3e993818961667895514e9aca7a3d3685cef7..fc782931d1587be45130f8000e6b5e331e1eeace 100644 GIT binary patch delta 1463 zcmV;o1xWhL3)TyeB!35VNliru=n5MS9v0DHT=W0{02g#cSaefwW^{L9a%BKVOhiyl zM<8}(av(DOV1ZP1_K>z@;j|==^1poj5 zFi=cXMfjkw%t1l;u#o?AN? zME|7+^2GoE1o}xtK~#90wU*C|<2Dq>Jzy~CCSvH~|H8b?(gq4K($Et2&=N#4OV2$l z6lT~OyXmE27@`__oV^unk~FEHyO&<}U+A@$rGLU4y7xUy`y@N@kJw3Js1AcY?~||I zd$OdjWivf_6f_i^=ayO&3hKwZuU0Oov<7@(5iNn4@n`G1?=!0E zDTY5-76M%Na3tT!IZYctssS6k%*BVFmA`4v@p`6htb4sz$a#0Jw)6dEUpJLpPCAho=z*4Bf-_ux1oTf-2F+g4# z^SxI~1U{N=CFE=72ou@^zrOtw0h*HS;+ncz;JH--4)cHcSpzsBSx>|@O3X~e-kK$k zmoWH7$5Smme-VplS4!Z?MHGo7(;3pd*Gj5TjHuMp=FWy5TWs+ES8OP^9Jv@9U zIxK`t($r#JxvtC~y!rd#gSX0oiJ6(D6~M(MQXYU2e^q&jbpW@7&wy4`tANcs+5>mr zsiKGFGY>qB_523ll>&X5AwcT@*#n=00RlIu0ecDiCHR3C&;aA3N*woFj)!{kz+34# zssfmsd3C6FzN;TiBkwKNsUxz{U)`GzV&pEK@B~v(KRm z@P<2}e=SD~TjZKt#(tXsW{(6nKbe+(E+YMOQ z>Yyvf-N;S>1_G&?RXDZPAtR84xs8g5&gj`3QiO`GMpB7f*m~j zP0W7B6MKJ2gm_iS^>ntY0{wxM?x?&(*7zI zf7TG+=qRnmod^{ca*3A>9x!}_pZ&ZBgj1abY5*buxSp1%3J8qpG;!z#;(;t_uOi_{ zljUx_)JHmneuYpvubGN-;2LrdQa5u1+u|raB8)x#I)i>4C`X3Z-lwnrf4gs1)=F*PS*ck(Ee~zVe05MjGCL;?vT#R!A z=0YQ^!$L6db7=9002ovPDHLkV1musmb(A| delta 1466 zcmV;r1x5PS3(O0UB!4haOjJeqps=`TX!x*@_;5&II5=p?;8-{?I8b0vkg%9wuoxH^ z`1tt1z|e3wh*(ficzAFfL~c<4000SaNLh0L01m_e01m_fl`9S#000F-NklKfU*6-kbN{T9&!!2iD$257}P1 zeGmNMKH#%M@b{^>^Z7&Y=@-2^s4K*=&mia_Y`8xb!vDyHpa(dL9|>_vDR@05BJYtn z`I}PO2Uw%0=YKzb&*-S=1FY4#k~HcSBk(%w*RL1(IoqROujjK-G~6SPSn9!^v$j78 zvH*Cmibx&;4FlSzB7#2-0T&(h$)SYN0^{wgE;#{Evp}g3!wHKHAOtVX2QQwL{(%C2 zm#|@Qk*UG+ze<{B%7vYsgis_oVK1I>dhjGxJ1Kz*9Dh+*a-=95CSp>yRS+ngF#?zj z%yL9b+A6|`*J zy?UhxUX3KSLKEjl=r}Q93cbch%J~}71&%Eo)%ThZ!p4bLZ>P;ZPuC7O* z0WrZXH-Gj~dI%8k;OqYe{teJ@LL!h`q32@Aea+Orc)ld8HSi{Y zbh^ZhXCsSjG)NO*DY^jq)eT_WAMT|ktW%&iVSmQLk_S250F?$anwDJwmC<^eycsKW zLIdk6j0c54_PFUIu8Z8QtDo)8Jj=-*w@Oi(Z>pcI|3RQ=0dv^`3>WZ)2@pJp7Vucs zm8Ak?6L2PYmon+m^~Tn~K{mMol6abmoFlOIi?@LbA;fq=M_ZuK(bYDl>qAt``#-JZAMOqa&b0A>6T(i% zSvF1#M+`6%9=~5^+n_Mv0%hMdfkd3HHhIMYcw7kT}{Ui}*XBROltCK2;A7xT>* z~fgd3fMe3JUs#wWb8-Gc& zGmW?(^Dk#+q%r?do@)q;(5Lspug#4nwj8^6q29kI3gCW>@ypvl zh#tPbx?1?FY>qLWF55N`7+qamhcKvsdDgZOQbxbI{uldeI*)aX+cpqzgX<6js+2fQ zb5iU$>EYE4t81~0cf=Lo>i(>O9rbzCt|`;+==x1dK}B0obW-7~y2=f{rLY!6MKJMEe_ZUy%KGQDL!sFu79Aj9g<|I8)+ U@k3AW7XSbN07*qoM6N<$f{6jhNdN!< diff --git a/graphics/pokemon/deoxys/attack/anim_front.png b/graphics/pokemon/deoxys/attack/anim_front.png index 0b43a9fe11e147604f6fb112102d703d15d38de5..566e80eafd01372ad38973a81193358cd53aade8 100644 GIT binary patch delta 186 zcmZ3<``sf3odCsWfl*^R3-)n2JsTth?3y^w370~qErTVAC~|>cZIUl zA_ZeTlfu>|4}nTJN(%hkfilKGHiK7#raX{hNq6*hWMJ6X&;2Kn705RT@CkAKv0y`j zg~k73uQQI05)u*_CmsY$*f1kugGE3>fknrU9}_(Vq&K|Eiw3G^O!9Vj`M;F?(@_Qn hHhE7M$B>FS8*60Q1pY}WvjgQBJYD@<);T3K0RUEdIz|8h delta 84 zcmey(yOMW;il9M&Pl)S}1sf79EPfPt?8wNN*sr3TH|d2h0|NtRfk$L90|Va?5N4dJ l%_q&kz$WkM;usRqy78PWn}EP`+YF#O22WQ%mvv4FO#sU48dLxP diff --git a/graphics/pokemon/deoxys/attack/normal.pal b/graphics/pokemon/deoxys/attack/normal.pal index 246d4784a28..52ddbb8fc66 100644 --- a/graphics/pokemon/deoxys/attack/normal.pal +++ b/graphics/pokemon/deoxys/attack/normal.pal @@ -3,8 +3,8 @@ JASC-PAL 16 248 160 176 96 56 56 -248 112 72 -184 104 104 +255 115 74 +204 65 65 24 24 24 104 200 224 80 144 176 diff --git a/graphics/pokemon/deoxys/defense/anim_front.png b/graphics/pokemon/deoxys/defense/anim_front.png index 2ee6e0c527eddef7c6f11f0f0e651cb6cbbf429d..ce3cdad39cf4eaeca8018faa22cef35fdac81e0e 100644 GIT binary patch delta 1640 zcmV-u2ABDO3Wg1kB!35VNliru=n5MSAShA9S|R`d02g#cSaefwW^{L9a%BKVOhiyl zM<8}(av(DOV1ZP1_K>z@;j|==^1poj5 zFi=cXMfjkwU^qC;K|%j>N< zME|7+^2GoE1*%CzK~#90t(VPeBS#R&)xJc`Nz)D1;#0Z?5~G`@U{~xpFJdqBD25#5 z1+{Hh@cJMPX3u*G0civ)r$g>}gs|ke5OUaeNmciZG&A}LhV;Q7)4!>zuCA{BPp8uy zI_`Cj4UITFMu?Y&e~2T1G9TX{E{+)ZaY`m$A2u+(H8*hz2TjQSZT8_az~GRF*MHuQ zKmP%6$b=ZWcUSHKK%ecOU!i$tvTM+B?Dhfc3!MHmwE!`knmt5hG}?F8f(C7@-3?=X zImB1??`u$anoZ>0j)Bt)RLBN!XeJV%wI!nPKnjqc&SZk9f17|rJ;5Ok9C_#ifeAKD z2zmt&rE?N7RS2&Rh5qjp--8O zlCTs?)_`|nf4=dtqE+#eA}QxX!OY)Q0QvM=6G1ure5X4}gAWlraK6KQS&|!o5_@_d z(h-2(7SJJ!dV1ffnP>rmLNFePJA#S$+m2f_00@A+Vt}nt2z?KbD_=37 zSI7(51pt&!LrgygHGnq4jKhus17yc9bshkU5!TbOf8Q}hwM1L3LNe$4TQ`6NDM+a) z>R6V*padugnd-0?1W3@mZdL=VS#*j3up{z-x_f~>?d)}6DM}A;B9%WJIGZ$pE0LxU zGOgGEj*Pc7=&U?o??j3XV3yT@wapg_6F%3@EelN^M#g*aKw1GQ_%`c-(!d6I6v)B& zT8ao5f0+xvE%bnZfxUSYL%&2{Y=ul_MqycfA^>#w5zE#T$@9tp0bKJ87~Hl;aZVxD zfEV^=InC+~R?ch{BOj|Ln=h&N)cUKSMc@`#tn-3^dOLVgrlIGL3j_V@2GBK`s*V@| zQC>)BHmzBs~ z_0o{OIIJH8nvaIh&mj|DfV@FGs2?N=knFum4+DKtD1UMB>|aPs0>pgyjRnSD{UDYk ze?W|T;`zP$VSS-qUG&XC{ScjAs(kgDj^KX%5G|+FRvvIEK?VKL+>=Oxc`-BNL}?Zn zGD(|6L>Gmb8Ef97_mG5ZVGHms<`mgfjUE#0PeM=Lo<^1zBa>Mh<7})e1(I&hGpP=0 zjFtqzxiJrPYf#6O+_-yNU_=hA8qJKkf7C&N#0gX;s7>R@vV%GK83W&9{BK$ZhV$Tn z0)5aVFmgAy8!_d9wRb>)OvfNuU_@@R0WiT~#11$RYaWVF5lcwQDAkZ|v*5t8iJ|mc zB|w!xfpLt%0gtOBXlof)3fggMO9wPQ<;jrJEaFWQq9S?KjcyIm5%FES7mO8aAq z&fW%)zz3_>GJsygoH=&}9>6xh`a;JGz6S!(^r42~Kodav!UGK-!h|LI)w4vQF9~b{ z+=7Q^3;*Ae_Jm|#{jUDTysadT=gG%+ZyJE*t9+Y1GGVg%ZQi%njr}1LUi3v)10;QZ z=|!jZAThQ9v_G2!d~dJy5r8DPg(lGYtP-H*HYm<+3m_8>V7JDKHn3;`Y;|!QfQE+I mEz;syK;+sU{uhN2WXr#DE;#sW?fH%X0000`@VP+*u~uoxH^ z`1tt1z|e3whyVZp0000DLkd>_000SaNLh0L01m_e01m_fl`9S#000DbNklqrBaQ`m9z9Rj$QfW;TDqv!~J5MBWGSFfY*{{#=woMN&2@`vc>r61t> zaAQ=EEafligrPhxNXQPK=~qOME;%fqt<*6|%0Tk+XCgrD9#4>o5+EKI;F z^Z=e?HB10w=qt~=2-xBlH|i~|#->EUO~4U1fBj9sDm4OZl?I#Nex=n~$KWkFuNsw%Df@l?lL$MO+FqU~7Ov`+syQf&hw83LVK)oB*WpRuv>+ zX)TL|K?DIza2H;}5;rChx=P@o3!Dlqa(663YeYC9LP?F_`9!4#1P^JMN?qw~h!q$;J}XdW-U78r=2A_!ol&tcRo4d56^5kn7(7Pw{x zK=_KjR)Aj5o(Nm4;xfc)S^`L)Zp09f1XMq10IFR#0CGw4E5K_2w_gSmq?*;g*hoi| zfOHIqSpf3%{tkM8rS}i-1G^7N^8>>xy%^Mp4u7zbfanSM@eKj}M%2Kr1=b&u8t6pm zKFNL70N#4L;~Ee{;N&%cy_P%O%3dSb5I~t}ARPmK2dtn0T9ph4IQq>yU5Gq3o+IR3XN|A9rZz4&;Zu_!h}b;m!twMF5D zAbPriUoHrAxMUAY($Gl}JWR9H6Y4Ikp&{fQMLK;~~oEVdZp?gW-<$ z1SODc9noD^!nr!?{S>wkTvCFZrpY*c)qlhg061S$f>>@7c)L12$`b^=IkZM9loH4) z1)bG&1PGs@P9P~oRiOgbSII(p>~bBKGAZ@0blic1cnnY+qAD)a3|-51#i|cH+)=zv zARiJym#)sF-v=jY<2$vD4jI59A1t}EZU3)GW|SNbQFJrt^;tIm*Pq*nMmz+ZeSf7- z)f^F%P32Hbojlc~lIe{#9!gafMO9hUG;TSqMNvvUPQx_%7R5B2zC|$ttwllLMxe7O zM$1bHu(K#;pnS3@W)TEHV^NHNgRCn}9g$9%a4z_s1!)*g*&E Wqydg=Q!o7h0000`sf3odCsB~~@vl&cI34B{oO5hcO-X(i=}MX3z#J}v=%?h0k8 zMGD4xCWWm_9s-qcloa^617(bXYzD6eO?e>2lJ4m1$iT3%pZiZD>qJFy&i}<;5)u+; z933Y*N=QrWyr>9N#F*sm?(%;r`=_G}46Iu{T^vIy=4`Cl%qqZOck>0vFi%%Mmvv4F FO#lqnF2Mi* delta 116 zcmbQpyPs!*N`ygxPl)S}1sf~^5&|Y{$T;yJ!NTH4fro^I#DR>A0|ze5NZ9b>$BzPw zj);JOii!dTFnDcYcooRtEbxddW?X?_wfUqO7+AM@x;TbJv~E1NnN{Fb@P>~d N4W6!kF6*2UngDyWDt`a~ diff --git a/graphics/pokemon/deoxys/speed/normal.pal b/graphics/pokemon/deoxys/speed/normal.pal index dad052e1daf..ea1073a0ee3 100644 --- a/graphics/pokemon/deoxys/speed/normal.pal +++ b/graphics/pokemon/deoxys/speed/normal.pal @@ -6,9 +6,9 @@ JASC-PAL 80 144 176 104 200 224 96 56 56 -248 112 72 +255 115 74 24 24 24 -192 104 104 +204 65 65 192 192 208 152 96 176 248 248 248 diff --git a/src/data/pokemon_graphics/front_pic_anims.h b/src/data/pokemon_graphics/front_pic_anims.h index d802521afe5..5b49ed6d203 100644 --- a/src/data/pokemon_graphics/front_pic_anims.h +++ b/src/data/pokemon_graphics/front_pic_anims.h @@ -5205,8 +5205,7 @@ static const union AnimCmd sAnim_DeoxysNormal_1[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(1, 26), ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; From 0ca588943b47606b6abd91c757b0b27e9001f518 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 1 Dec 2024 13:45:35 +0100 Subject: [PATCH 48/56] Fixes choiced moves not locked in after ability block (#5738) --- include/battle.h | 2 +- include/battle_util.h | 1 + src/battle_script_commands.c | 40 -------------------------- src/battle_util.c | 56 ++++++++++++++++++++++++++++++++---- test/battle/ai/ai.c | 25 ++++++++++++++++ 5 files changed, 77 insertions(+), 47 deletions(-) diff --git a/include/battle.h b/include/battle.h index 20afe876ca3..d32481ee4d5 100644 --- a/include/battle.h +++ b/include/battle.h @@ -802,8 +802,8 @@ struct BattleStruct u8 categoryOverride; // for Z-Moves and Max Moves u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 fickleBeamBoosted:1; - u8 obedienceResult:3; u8 redCardActivates:1; + u8 padding:6; u8 usedMicleBerry; }; diff --git a/include/battle_util.h b/include/battle_util.h index 71d81ce3bb1..0d73a0a9ddd 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -82,6 +82,7 @@ enum CANCELLER_SKY_DROP, CANCELLER_ASLEEP, CANCELLER_FROZEN, + CANCELLER_OBEDIENCE, CANCELLER_TRUANT, CANCELLER_RECHARGE, CANCELLER_FLINCH, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0375cfeed01..ede9c073323 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1282,46 +1282,6 @@ static void Cmd_attackcanceler(void) gHitMarker &= ~HITMARKER_ALLOW_NO_PP; - if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) - { - switch (gBattleStruct->obedienceResult) - { - case OBEYS: - break; - 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; - gMoveResultFlags |= MOVE_RESULT_MISSED; - return; - case DISOBEYS_HITS_SELF: - gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); - gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gHitMarker |= HITMARKER_OBEYS; - return; - case DISOBEYS_FALL_ASLEEP: - gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; - gMoveResultFlags |= MOVE_RESULT_MISSED; - return; - case DISOBEYS_WHILE_ASLEEP: - gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; - gMoveResultFlags |= MOVE_RESULT_MISSED; - return; - case DISOBEYS_RANDOM_MOVE: - gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - SetAtkCancellerForCalledMove(); - gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; - gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gHitMarker |= HITMARKER_DISOBEDIENT_MOVE; - gHitMarker |= HITMARKER_OBEYS; - return; - } - } - - gHitMarker |= HITMARKER_OBEYS; // Check if no available target present on the field or if Sky Battles ban the move if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) && (!gBattleMoveEffects[gMovesInfo[gCurrentMove].effect].twoTurnEffect || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS))) diff --git a/src/battle_util.c b/src/battle_util.c index f95b8f99019..6f0b2af880f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -145,8 +145,6 @@ void HandleAction_UseMove(void) gBattleScripting.savedMoveEffect = 0; gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); - gBattleStruct->obedienceResult = GetAttackerObedienceForAction(); - // choose move if (gProtectStructs[gBattlerAttacker].noValidMoves) { @@ -3222,7 +3220,8 @@ void SetAtkCancellerForCalledMove(void) u8 AtkCanceller_UnableToUseMove(u32 moveType) { - u8 effect = 0; + u32 effect = 0; + u32 obedienceResult; do { switch (gBattleStruct->atkCancellerTracker) @@ -3306,6 +3305,53 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) } gBattleStruct->atkCancellerTracker++; break; + case CANCELLER_OBEDIENCE: + obedienceResult = GetAttackerObedienceForAction(); + if (obedienceResult != OBEYS + && !(gHitMarker & HITMARKER_NO_PPDEDUCT) // Don't check obedience after first hit of multi target move or multi hit moves + && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) + { + switch (obedienceResult) + { + 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; + gMoveResultFlags |= MOVE_RESULT_MISSED; + break; + case DISOBEYS_HITS_SELF: + gBattlerTarget = gBattlerAttacker; + gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); + gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + gHitMarker |= HITMARKER_OBEYS; + break; + case DISOBEYS_FALL_ASLEEP: + gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep; + gMoveResultFlags |= MOVE_RESULT_MISSED; + break; + case DISOBEYS_WHILE_ASLEEP: + gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep; + gMoveResultFlags |= MOVE_RESULT_MISSED; + break; + case DISOBEYS_RANDOM_MOVE: + gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; + SetAtkCancellerForCalledMove(); + gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove; + gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); + gHitMarker |= HITMARKER_DISOBEDIENT_MOVE; + gHitMarker |= HITMARKER_OBEYS; + break; + } + effect = 1; + } + else + { + gHitMarker |= HITMARKER_OBEYS; + } + gBattleStruct->atkCancellerTracker++; + break; case CANCELLER_TRUANT: // truant if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) { @@ -3554,7 +3600,6 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 4; if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE - || gBattleStruct->obedienceResult != OBEYS || HasTrainerUsedGimmick(gBattlerAttacker, GIMMICK_Z_MOVE)) gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; @@ -3575,8 +3620,7 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) gBattleStruct->atkCancellerTracker++; break; case CANCELLER_Z_MOVES: - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE - && gBattleStruct->obedienceResult == OBEYS) + 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); diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index a19481c7ed3..b52e64262dd 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -805,3 +805,28 @@ AI_SINGLE_BATTLE_TEST("AI uses a guaranteed KO move instead of the move with the NOT MESSAGE("Wobbuffet fainted!"); } } + +AI_SINGLE_BATTLE_TEST("AI stays choice locked into moves in spite of the player's ability disabling them") +{ + u32 playerMon, ability, aiMove; + 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; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; playerMon = SPECIES_EXPLOUD; aiMove = MOVE_BOOMBURST; } + PARAMETRIZE { ability = ABILITY_BULLETPROOF; playerMon = SPECIES_CHESNAUGHT; aiMove = MOVE_BULLET_SEED; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND); + ASSUME(gMovesInfo[MOVE_QUICK_ATTACK].priority == 1); + ASSUME(gMovesInfo[MOVE_BOOMBURST].soundMove == TRUE); + ASSUME(gMovesInfo[MOVE_BULLET_SEED].ballisticMove == TRUE); + ASSUME(gMovesInfo[MOVE_TAIL_WHIP].category == DAMAGE_CATEGORY_STATUS); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(playerMon) { Ability(ability); } + OPPONENT(SPECIES_SMEARGLE) { Item(ITEM_CHOICE_BAND); Moves(aiMove, MOVE_TACKLE); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, aiMove); } + TURN { EXPECT_MOVE(opponent, aiMove); } + } +} From 6fe935f1b8b8d3eb515c794fd2212b1b97cdbde1 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Dec 2024 14:04:13 -0300 Subject: [PATCH 49/56] Version 1.9.4 --- .../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 | 4 +- docs/SUMMARY.md | 1 + docs/changelogs/1.9.x/1.9.4.md | 200 ++++++++++++++++++ include/constants/expansion.h | 4 +- 7 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 docs/changelogs/1.9.x/1.9.4.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 8240a568019..6a654402ac4 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.3 (Latest release) + - 1.9.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.3 - 1.9.2 - 1.9.1 - 1.9.0 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 5688f8a7fb9..ff9823aa01f 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.3 (Latest release) + - 1.9.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.3 - 1.9.2 - 1.9.1 - 1.9.0 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index add0633d956..ab400f7b9d4 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,9 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.3 (Latest release) + - 1.9.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.3 - 1.9.2 - 1.9.1 - 1.9.0 diff --git a/README.md b/README.md index 5330e409813..823a02479c4 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ pokeemerald-expansion is a decomp hack base project based off pret's [pokeemeral If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect. You can phrase it as the following: ``` -Based off RHH's pokeemerald-expansion 1.9.3 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.9.4 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please follow the instructions in `INSTALL.md` to get pokeemerald-expansion set up on your machine. @@ -177,7 +177,7 @@ With this, you'll get the latest version of pokeemerald-expansion, plus a couple - Check your current version. - You can check in the debug menu's `Utilities -> Expansion Version` option. - If the option is not available, you possibly have version 1.6.2 or older. In that case, please check the [changelogs](CHANGELOG.md) to determine your version based on the features available on your repository. -- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.3, use `git pull RHH expansion/1.9.3`). +- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.4, use `git pull RHH expansion/1.9.4`). - ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on) - Alternatively, you can update to unreleased versions of the expansion. - ***master (stable):*** It contains unreleased **bugfixes** that will come in the next patch version. To merge, use `git pull RHH master`. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index ac4698fdc32..ab016136a19 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -19,6 +19,7 @@ - [How to use the Testing System](tutorials/how_to_testing_system.md) - [Changelog](./CHANGELOG.md) - [1.9.x]() + - [Version 1.9.4](changelogs/1.9.x/1.9.4.md) - [Version 1.9.3](changelogs/1.9.x/1.9.3.md) - [Version 1.9.2](changelogs/1.9.x/1.9.2.md) - [Version 1.9.1](changelogs/1.9.x/1.9.1.md) diff --git a/docs/changelogs/1.9.x/1.9.4.md b/docs/changelogs/1.9.x/1.9.4.md new file mode 100644 index 00000000000..36dc2afc738 --- /dev/null +++ b/docs/changelogs/1.9.x/1.9.4.md @@ -0,0 +1,200 @@ +# Version 1.9.4 + +```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.9.4`. +``` + +## 🌋 IMPORTANT 🌋 +- This update integrates pret's latest Makefile changes, which rearranges the entire file in order to speed up compilation times overall. If you did any changes to it (such as installing Poryscript) and are having issues resolving the conflicts, keep expansion's version of Makefile and reapply your changes afterwards. + +## 🧬 General 🧬 +### Fixed +* Fixed alignment errors in `EWRAM_INIT` and friends when using u8, u16, etc. by @aronson in [#5512](https://github.com/rh-hideout/pokeemerald-expansion/pull/5512) +* Update test LD script to respect 4 byte data section alignment by @aronson in [#5517](https://github.com/rh-hideout/pokeemerald-expansion/pull/5517) +* Fixed Missing `string_util.h` include in `mini_printf.c` by @mrgriffin in [#5572](https://github.com/rh-hideout/pokeemerald-expansion/pull/5572) +* Fixed unnecessary dependency scanning for test build and test rom names by @ravepossum in [#5594](https://github.com/rh-hideout/pokeemerald-expansion/pull/5594) +* Fixed makefile: dependencies for `map_group_count.h` by @SBird1337 in [#5648](https://github.com/rh-hideout/pokeemerald-expansion/pull/5648) + - Fixes an issue that caused the build to fail on updates to `src/debug.c` due to mismatched dependency. + +## 🗺️ Overworld 🗺️ +### Changed +* Followers sprite fixes by @Cafeei in [#5669](https://github.com/rh-hideout/pokeemerald-expansion/pull/5669) +* Follower fixes, Melmetal, Patrat, Woobat by @hedara90 in [#5685](https://github.com/rh-hideout/pokeemerald-expansion/pull/5685) +* Fixed Farfetch'd overworld sprite by @hedara90 in [#5711](https://github.com/rh-hideout/pokeemerald-expansion/pull/5711) + +### Fixed +* Fixed Berry mutations always generating a Persim Berry by @Bassoonian in [#5504](https://github.com/rh-hideout/pokeemerald-expansion/pull/5504) + +## 🐉 Pokémon 🐉 +### Changed +* Changing `EVO_NONE` from `0xFFFE` to `0` by @GhoulMage in [#5547](https://github.com/rh-hideout/pokeemerald-expansion/pull/5547) + - There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as `EVO_FRIENDSHIP` used to be the first index although it started with 1. +* PokeCommunity sprites batch (October) by @kittenchilly in [#5655](https://github.com/rh-hideout/pokeemerald-expansion/pull/5655) +* Followers sprite fixes by @Cafeei in [#5669](https://github.com/rh-hideout/pokeemerald-expansion/pull/5669) +* Follower fixes, Melmetal, Patrat, Woobat by @hedara90 in [#5685](https://github.com/rh-hideout/pokeemerald-expansion/pull/5685) +* Fixed Farfetch'd overworld sprite by @hedara90 in [#5711](https://github.com/rh-hideout/pokeemerald-expansion/pull/5711) + +### Fixed +* Fixed `P_FRIENDSHIP_EVO_THRESHOLD` not checking for Gen 8 by @kittenchilly in [#5503](https://github.com/rh-hideout/pokeemerald-expansion/pull/5503) +* Fixed HGSS dex search printing wrong mon after selecting evos by @ravepossum in [#5552](https://github.com/rh-hideout/pokeemerald-expansion/pull/5552) +* Fixed 64px uncompressed followers by @hedara90 in [#5601](https://github.com/rh-hideout/pokeemerald-expansion/pull/5601) +* Deoxys Sprite/Animation Fixes by @SarnPoke in [#5603](https://github.com/rh-hideout/pokeemerald-expansion/pull/5603) +* Fixes Aegislash not reverting back by @AlexOn1ine in [#5734](https://github.com/rh-hideout/pokeemerald-expansion/pull/5734) + +## ⚔️ Battle General ⚔️ +### Changed +* Fixed damage calc modifiers by @AlexOn1ine in [#5604](https://github.com/rh-hideout/pokeemerald-expansion/pull/5604) + +### Fixed +* Fixed Shiny Pokemon not being shiny after transforming with a gimmick by @hedara90 in [#5573](https://github.com/rh-hideout/pokeemerald-expansion/pull/5573) +* Handle showdowns apostrophe the same way as ASCII apostrophe by @cawtds in [#5712](https://github.com/rh-hideout/pokeemerald-expansion/pull/5712) +* Fixes Misty Terrain displaying wrong message by @AlexOn1ine in [#5742](https://github.com/rh-hideout/pokeemerald-expansion/pull/5742) +* Fixes Dynamax dynamic move type by @AlexOn1ine in [#5739](https://github.com/rh-hideout/pokeemerald-expansion/pull/5739) + +## 🤹 Moves 🤹 +### Changed +* Fixed damage calc modifiers by @AlexOn1ine in [#5604](https://github.com/rh-hideout/pokeemerald-expansion/pull/5604) +* Updated ability popups for Skill Swap, Mummy/Lingering Aroma, Worry Seed, Simple Beam, fix Doodle/Role Play bugs by @PhallenTree in [#5493](https://github.com/rh-hideout/pokeemerald-expansion/pull/5493) + +### Fixed +* Fixed Follow Me failing in Single Battles for Gen 6/7 config by @AsparagusEduardo in [#5542](https://github.com/rh-hideout/pokeemerald-expansion/pull/5542) +* Fixed `AnimTask_HorizontalShake` uses for shaking screen in battle anims by @ghoulslash in [#5562](https://github.com/rh-hideout/pokeemerald-expansion/pull/5562) +* Fixed weather genie move anims and Springtide Storm targets by @ravepossum in [#5553](https://github.com/rh-hideout/pokeemerald-expansion/pull/5553) +* Fixes Magic Guard not preventing Salt Cure by @AlexOn1ine in [#5583](https://github.com/rh-hideout/pokeemerald-expansion/pull/5583) +* Fixes Dragon Tail using the effect twice during a Parental Bond attack by @AlexOn1ine in [#5630](https://github.com/rh-hideout/pokeemerald-expansion/pull/5630) +* Fixes Magic Coat message by @AlexOn1ine in [#5645](https://github.com/rh-hideout/pokeemerald-expansion/pull/5645) +* Fixes Take heart by @AlexOn1ine in [#5658](https://github.com/rh-hideout/pokeemerald-expansion/pull/5658) +* Fixed Floral Healing anim by @AlexOn1ine in [#5733](https://github.com/rh-hideout/pokeemerald-expansion/pull/5733) +* Fixes Population Bomb / Triple Kick missing message by @AlexOn1ine in [#5747](https://github.com/rh-hideout/pokeemerald-expansion/pull/5747) +* Changes Max Phantasm move anim script call by @AlexOn1ine in [#5737](https://github.com/rh-hideout/pokeemerald-expansion/pull/5737) +* Fixes Partner targeting and Acupressure/Ally Switch interaction by @AlexOn1ine in [#5446](https://github.com/rh-hideout/pokeemerald-expansion/pull/5446) +* Revival Blessing fixes + Using Lunar Blessing's animation by @ghoulslash in [#5490](https://github.com/rh-hideout/pokeemerald-expansion/pull/5490) +* Fixed curse + Protean interaction by @hedara90 in [#5663](https://github.com/rh-hideout/pokeemerald-expansion/pull/5663) +* Added Minimize interaction to Supercell Slam by @hedara90 in [#5713](https://github.com/rh-hideout/pokeemerald-expansion/pull/5713) + +## 🎭 Abilities 🎭 +### Changed +* Fixed damage calc modifiers by @AlexOn1ine in [#5604](https://github.com/rh-hideout/pokeemerald-expansion/pull/5604) + +### Fixed +* Adds tests and Costar fix from PR #5526 by @AlexOn1ine in [#5529](https://github.com/rh-hideout/pokeemerald-expansion/pull/5529) +* Fixes Red Card / Eject Pack interaction with Emergency Exit by @AlexOn1ine in [#5657](https://github.com/rh-hideout/pokeemerald-expansion/pull/5657) +* Fixed curse + Protean interaction by @hedara90 in [#5663](https://github.com/rh-hideout/pokeemerald-expansion/pull/5663) +* Mimicry updates typing with `RemoveAllTerrains()` by @AERDU in [#5666](https://github.com/rh-hideout/pokeemerald-expansion/pull/5666) +* Updated ability popups for Skill Swap, Mummy/Lingering Aroma, Worry Seed, Simple Beam, fix Doodle/Role Play bugs by @PhallenTree in [#5493](https://github.com/rh-hideout/pokeemerald-expansion/pull/5493) +* Fixed curse + Protean interaction by @hedara90 in [#5663](https://github.com/rh-hideout/pokeemerald-expansion/pull/5663) +* Fixes Ice Face regression by @AlexOn1ine in [#5678](https://github.com/rh-hideout/pokeemerald-expansion/pull/5678) +* Fixes Neutralizing Gas crashes + adds missing interaction, Regenerator small fix by @PhallenTree in [#5694](https://github.com/rh-hideout/pokeemerald-expansion/pull/5694) + +## 🧶 Items 🧶 +### Changed +* Removes duplicate Booster Energy code by @AlexOn1ine in [#5656](https://github.com/rh-hideout/pokeemerald-expansion/pull/5656) + +### Fixed +* Fixes Red Card / Eject Pack interaction with Emergency Exit by @AlexOn1ine in [#5657](https://github.com/rh-hideout/pokeemerald-expansion/pull/5657) +* Fixes Red Card / Eject Pack interaction by @AlexOn1ine in [#5724](https://github.com/rh-hideout/pokeemerald-expansion/pull/5724) +* Fixes gems triggering on confusion damage by @AlexOn1ine in [#5723](https://github.com/rh-hideout/pokeemerald-expansion/pull/5723) +* Fixes Kee Maranga and Enigma Berry by @AlexOn1ine in [#5727](https://github.com/rh-hideout/pokeemerald-expansion/pull/5727) +* Fixes Blunder Policy by @AlexOn1ine in [#5722](https://github.com/rh-hideout/pokeemerald-expansion/pull/5722) + +## 🤖 Battle AI 🤖 +### Fixed +* Fixed certain move data being cleared on turn end by @Pawkkie and @AlexOn1ine in [#5488](https://github.com/rh-hideout/pokeemerald-expansion/pull/5488) +* Global is used instead of passed var by @AlexOn1ine in [#5546](https://github.com/rh-hideout/pokeemerald-expansion/pull/5546) +* Fixes `dynamicMoveType` global not being reset during AI calcs by @AlexOn1ine in [#5628](https://github.com/rh-hideout/pokeemerald-expansion/pull/5628) + +## 🧹 Other Cleanup 🧹 +* Remove one redundant call of `SetAiLogicDataForTurn` in `DoBattleIntro` by @AlexOn1ine in [#5491](https://github.com/rh-hideout/pokeemerald-expansion/pull/5491) +* Cleanup extraneous function in `battle_anim.h` by @hedara90 in [#5506](https://github.com/rh-hideout/pokeemerald-expansion/pull/5506) +* Add newline to move relearner string by @Bassoonian in [#5523](https://github.com/rh-hideout/pokeemerald-expansion/pull/5523) +* Fixed 10,000,000 Volt Thunderbolt name by @AsparagusEduardo in [#5533](https://github.com/rh-hideout/pokeemerald-expansion/pull/5533) +* Added constant to expansion inclusive copyright magic number by @pkmnsnfrn in [#5413](https://github.com/rh-hideout/pokeemerald-expansion/pull/5413) +* Centralise AI Tests trainer name by @Bassoonian in [#5532](https://github.com/rh-hideout/pokeemerald-expansion/pull/5532) +* Remove now outdated information from readme by @Bassoonian in [#5548](https://github.com/rh-hideout/pokeemerald-expansion/pull/5548) +* Changing `EVO_NONE` from `0xFFFE` to `0` by @GhoulMage in [#5547](https://github.com/rh-hideout/pokeemerald-expansion/pull/5547) + - There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as `EVO_FRIENDSHIP` used to be the first index although it started with 1. +* Shed Skin chance fix by @Pawkkie in [#5558](https://github.com/rh-hideout/pokeemerald-expansion/pull/5558) +* Restore test file dependencies so they're rebuilt properly by @ravepossum in [#5617](https://github.com/rh-hideout/pokeemerald-expansion/pull/5617) +* Improve `SEND_OUT` error message; require Speed for all battlers by @mrgriffin in [#5631](https://github.com/rh-hideout/pokeemerald-expansion/pull/5631) +* Removes duplicate Booster Energy code by @AlexOn1ine in [#5656](https://github.com/rh-hideout/pokeemerald-expansion/pull/5656) +* Wrong assumtion in dauntless_shield.c by @AlexOn1ine in [#5692](https://github.com/rh-hideout/pokeemerald-expansion/pull/5692) + +## 🧪 Test Runner 🧪 +### Added +* Add curious medicine test by @ghoulslash in [#5540](https://github.com/rh-hideout/pokeemerald-expansion/pull/5540) +* Tests: detect task leaks by @mrgriffin in [#5528](https://github.com/rh-hideout/pokeemerald-expansion/pull/5528) + +### Changed +* Add text width tests for move, ability, item, and pokedex descriptions by @kittenchilly in [#5505](https://github.com/rh-hideout/pokeemerald-expansion/pull/5505) +* Centralise AI Tests trainer name by @Bassoonian in [#5532](https://github.com/rh-hideout/pokeemerald-expansion/pull/5532) +* Add basic Steam Engine, Guard Dog Tests by @ghoulslash in [#5569](https://github.com/rh-hideout/pokeemerald-expansion/pull/5569) +* Fixed damage test by @GhoulMage and @mrgriffin for teaching me pokeemerald-expansion tests in [#5574](https://github.com/rh-hideout/pokeemerald-expansion/pull/5574) +* Fallback `memmem` implementation by @mrgriffin in [#5561](https://github.com/rh-hideout/pokeemerald-expansion/pull/5561) +* Hydra: Support `%p` in test summaries by @mrgriffin in [#5626](https://github.com/rh-hideout/pokeemerald-expansion/pull/5626) +* Improve `SEND_OUT` error message; require Speed for all battlers by @mrgriffin in [#5631](https://github.com/rh-hideout/pokeemerald-expansion/pull/5631) +* Check that `PASSES_RANDOMLY` affected a `Random` call by @mrgriffin in [#5635](https://github.com/rh-hideout/pokeemerald-expansion/pull/5635) +* Wrong assumtion in dauntless_shield.c by @AlexOn1ine in [#5692](https://github.com/rh-hideout/pokeemerald-expansion/pull/5692) + +### Fixed +* Update test LD script to respect 4 byte data section alignment by @aronson in [#5517](https://github.com/rh-hideout/pokeemerald-expansion/pull/5517) +* Adds tests and Costar fix from PR #5526 by @AlexOn1ine in [#5529](https://github.com/rh-hideout/pokeemerald-expansion/pull/5529) +* Fixed broken Starting Terrain test by @hedara90 in [#5582](https://github.com/rh-hideout/pokeemerald-expansion/pull/5582) + +## 📚 Documentation 📚 +* Add changelog header in PR template to aid automation by @AsparagusEduardo in [#5539](https://github.com/rh-hideout/pokeemerald-expansion/pull/5539) +* Added compressed OW mon VRAM notice in config file by @AsparagusEduardo in [#5599](https://github.com/rh-hideout/pokeemerald-expansion/pull/5599) +* Update `README.md` to link to `INSTALL.md` by @Pawkkie in [#5720](https://github.com/rh-hideout/pokeemerald-expansion/pull/5720) +* Fixes minor move desc errors by @AlexOn1ine in [#5728](https://github.com/rh-hideout/pokeemerald-expansion/pull/5728) + +## 📦 Branch Synchronisation 📦 +### pret +* 15th of October in [#5527](https://github.com/rh-hideout/pokeemerald-expansion/pull/5527) + * Slight storage system documentation by @luckytyphlosion in [pret#2024](https://github.com/pret/pokeemerald/pull/2024) + * Clean up defines lacking spaces by @Bassoonian in [pret#2025](https://github.com/pret/pokeemerald/pull/2025) + * UB fix in battle_transition.c by @cawtds in [pret#2007](https://github.com/pret/pokeemerald/pull/2007) + * preproc: support arbitrary expressions in enums by @mrgriffin in [pret#2026](https://github.com/pret/pokeemerald/pull/2026) + * [Build System Rewrite] Refactored `Makefile` by @Icedude907 in [pret#1950](https://github.com/pret/pokeemerald/pull/1950) + * Fixed incorrect point macros in contest_ai_script.inc by @NTx86 in [pret#2028](https://github.com/pret/pokeemerald/pull/2028) + * [Build System Rewrite] Massive build speed improvement via scaninc changes by @Icedude907 in [pret#1954](https://github.com/pret/pokeemerald/pull/1954) + * [Build System Rewrite] Improved audio rules by @Icedude907 in [pret#1957](https://github.com/pret/pokeemerald/pull/1957) + * Update INSTALL.md to state that Windows 8 is no longer supported by Microsoft by @luciofstars in [pret#2029](https://github.com/pret/pokeemerald/pull/2029) + * Update pull_request_template.md to include Discord username update by @luciofstars in [pret#2030](https://github.com/pret/pokeemerald/pull/2030) + * remove ScriptContext_Enable from secret_base.h by @DizzyEggg in [pret#2032](https://github.com/pret/pokeemerald/pull/2032) + * Remove gflib by @Kurausukun in [pret#2033](https://github.com/pret/pokeemerald/pull/2033) + * Minor toolchain fixes by @GriffinRichards in [pret#2031](https://github.com/pret/pokeemerald/pull/2031) + * Bugfix for cable car hikerGraphicsIds array by @Scyrous in [pret#2039](https://github.com/pret/pokeemerald/pull/2039) + * Remove explicit symbol sizes in sym_common.txt by @GriffinRichards in [pret#2038](https://github.com/pret/pokeemerald/pull/2038) + * Ignore mGBA screenshots by @Jaizu in [pret#2041](https://github.com/pret/pokeemerald/pull/2041) + * Replaced copyright magic numbers in intro.c with constants by @pkmnsnfrn in [pret#2035](https://github.com/pret/pokeemerald/pull/2035) + * Fixed typo: | should be || in Task_TryFieldPoisonWhiteOut by @AreaZR in [pret#2044](https://github.com/pret/pokeemerald/pull/2044) + * [preproc] support C23 enum underlying type syntax by @mrgriffin in [pret#2043](https://github.com/pret/pokeemerald/pull/2043) + * Fixed deleting files with dependency files by @mid-kid in [pret#2045](https://github.com/pret/pokeemerald/pull/2045) + * Remove unnecessary looping for rule generation and unroll macros by @mid-kid in [pret#2046](https://github.com/pret/pokeemerald/pull/2046) + * Get rid of common syms by @luckytyphlosion in [pret#2040](https://github.com/pret/pokeemerald/pull/2040) + * Bugfix for cable car hikerGraphicsIds array by @Scyrous in [pret#2039](https://github.com/pret/pokeemerald/pull/2039) + * UB fix in battle_transition.c by @cawtds in [pret#2007](https://github.com/pret/pokeemerald/pull/2007) + * Fixed typo: | should be || in Task_TryFieldPoisonWhiteOut by @AreaZR in [pret#2044](https://github.com/pret/pokeemerald/pull/2044) + * Get rid of common syms by @luckytyphlosion in [pret#2040](https://github.com/pret/pokeemerald/pull/2040) + * Fixed incorrect point macros in contest_ai_script.inc by @NTx86 in [pret#2028](https://github.com/pret/pokeemerald/pull/2028) +* 5th of November in [#5644](https://github.com/rh-hideout/pokeemerald-expansion/pull/5644) + * Added define value for bard sound length by @fdeblasio in [pret#2052](https://github.com/pret/pokeemerald/pull/2052) + * Silence 'Nothing to be done for generated' messages by @GriffinRichards in [pret#2059](https://github.com/pret/pokeemerald/pull/2059) + * Lay out emerald version png horizontally by @GriffinRichards in [pret#2062](https://github.com/pret/pokeemerald/pull/2062) +* 29 of November in [#5736](https://github.com/rh-hideout/pokeemerald-expansion/pull/5736) + * Remove usage of gHeap in sSpritePalettes_ContestantsTurnBlinkEffect by @Lactozilla in [pret#2064](https://github.com/pret/pokeemerald/pull/2064) + * BUGFIX: Fix Counter and Mirror Coat checking the wrong category by @surtr-games in [pret#2066](https://github.com/pret/pokeemerald/pull/2066) + * Add TRY_DRAW_SPOT_PIXEL by @GriffinRichards in [pret#2055](https://github.com/pret/pokeemerald/pull/2055) + * Added extra encoded character support by @AsparagusEduardo in [pret#2050](https://github.com/pret/pokeemerald/pull/2050) +### merrp's followers +* Merrp merge (12th of October) by @Bassoonian in [#5514](https://github.com/rh-hideout/pokeemerald-expansion/pull/5514) + - d80190fe105eee12bbf74ae29647ac909084d35c fix: Dig in Sealed Chamber no longer freezes follower. + +## New Contributors +* @AERDU made their first contribution in [#5666](https://github.com/rh-hideout/pokeemerald-expansion/pull/5666) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.3...expansion/1.9.4 + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 44b1169bcda..7d883d77a8c 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.9.3 +// Last version: 1.9.4 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 9 #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 720938f040248ebbcecf9bba8b627223783934f0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Dec 2024 14:28:26 -0300 Subject: [PATCH 50/56] Fix conflicts --- include/battle.h | 3 +-- src/battle_util.c | 9 ++++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/battle.h b/include/battle.h index 54c81a3e57f..37f23596411 100644 --- a/include/battle.h +++ b/include/battle.h @@ -828,9 +828,8 @@ struct BattleStruct u8 commandingDondozo; u16 commanderActive[MAX_BATTLERS_COUNT]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side - u8 fickleBeamBoosted:1; u8 redCardActivates:1; - u8 padding:6; + u8 padding:7; u8 usedEjectItem; u8 usedMicleBerry; }; diff --git a/src/battle_util.c b/src/battle_util.c index dc2dcc55f15..01822691a36 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3314,7 +3314,14 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) break; case DISOBEYS_HITS_SELF: gBattlerTarget = gBattlerAttacker; - gBattleMoveDamage = CalculateMoveDamage(MOVE_NONE, gBattlerAttacker, gBattlerAttacker, TYPE_MYSTERY, 40, FALSE, FALSE, TRUE); + struct DamageCalculationData damageCalcData; + damageCalcData.battlerAtk = damageCalcData.battlerDef = gBattlerAttacker; + damageCalcData.move = MOVE_NONE; + damageCalcData.moveType = TYPE_MYSTERY; + damageCalcData.isCrit = FALSE; + damageCalcData.randomFactor = FALSE; + damageCalcData.updateFlags = TRUE; + gBattleMoveDamage = CalculateMoveDamage(&damageCalcData, 40); gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker |= HITMARKER_OBEYS; From bb274c06918b19aca172f3d0e65be1c21cb27df4 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Dec 2024 14:42:40 -0300 Subject: [PATCH 51/56] Add missing changelogs to list --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb9fec3e7e8..70abeffd3e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Pokeemerald-Expansion Changelogs ## 1.9.x +- **[Version 1.9.4](docs/changelogs/1.9.x/1.9.4.md) - 🧹 Bugfix Release** +- **[Version 1.9.3](docs/changelogs/1.9.x/1.9.3.md) - 🧹 Bugfix Release** - **[Version 1.9.2](docs/changelogs/1.9.x/1.9.2.md) - 🧹 Bugfix Release** - **[Version 1.9.1](docs/changelogs/1.9.x/1.9.1.md) - 🧹 Bugfix Release** - **[Version 1.9.0](docs/changelogs/1.9.x/1.9.0.md) - ✨ Feature Release** From ebc03c3cb313b242f7bcdd396dcb00233d44b839 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Dec 2024 14:46:22 -0300 Subject: [PATCH 52/56] Added missing PR --- docs/changelogs/1.9.x/1.9.4.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelogs/1.9.x/1.9.4.md b/docs/changelogs/1.9.x/1.9.4.md index 36dc2afc738..2a41988bd46 100644 --- a/docs/changelogs/1.9.x/1.9.4.md +++ b/docs/changelogs/1.9.x/1.9.4.md @@ -98,6 +98,7 @@ * Fixes gems triggering on confusion damage by @AlexOn1ine in [#5723](https://github.com/rh-hideout/pokeemerald-expansion/pull/5723) * Fixes Kee Maranga and Enigma Berry by @AlexOn1ine in [#5727](https://github.com/rh-hideout/pokeemerald-expansion/pull/5727) * Fixes Blunder Policy by @AlexOn1ine in [#5722](https://github.com/rh-hideout/pokeemerald-expansion/pull/5722) +* Fixes Rusted Shield/Sword allowed to be Knocked Off from Zamazenta/Zacian by @iriv24 in [#5750](https://github.com/rh-hideout/pokeemerald-expansion/pull/5750) ## 🤖 Battle AI 🤖 ### Fixed From bd7a46f9c7b42ad25e50723a4a2aca8028039ed5 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Dec 2024 15:10:46 -0300 Subject: [PATCH 53/56] Version 1.10.0 --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 12 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 12 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 12 +- CHANGELOG.md | 3 + README.md | 4 +- docs/SUMMARY.md | 2 + docs/changelogs/1.10.0/1.10.0.md | 324 ++++++++++++++++++ include/constants/expansion.h | 2 +- 8 files changed, 341 insertions(+), 30 deletions(-) create mode 100644 docs/changelogs/1.10.0/1.10.0.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 6a654402ac4..0a3eff0e43d 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -23,21 +23,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.4 (Latest release) + - 1.10.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.4 - 1.9.3 - 1.9.2 - 1.9.1 - 1.9.0 - - 1.8.6 - - 1.8.5 - - 1.8.4 - - 1.8.3 - - 1.8.2 - - 1.8.1 - - 1.8.0 - - pre-1.8.0 + - pre-1.9.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 ff9823aa01f..4b8eec3a437 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,21 +23,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.4 (Latest release) + - 1.10.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.4 - 1.9.3 - 1.9.2 - 1.9.1 - 1.9.0 - - 1.8.6 - - 1.8.5 - - 1.8.4 - - 1.8.3 - - 1.8.2 - - 1.8.1 - - 1.8.0 - - pre-1.8.0 + - pre-1.9.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 ab400f7b9d4..54335ca5e40 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,21 +23,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.9.4 (Latest release) + - 1.10.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.9.4 - 1.9.3 - 1.9.2 - 1.9.1 - 1.9.0 - - 1.8.6 - - 1.8.5 - - 1.8.4 - - 1.8.3 - - 1.8.2 - - 1.8.1 - - 1.8.0 - - pre-1.8.0 + - pre-1.9.0 validations: required: true - type: input diff --git a/CHANGELOG.md b/CHANGELOG.md index 70abeffd3e9..13d6e4f4ebd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Pokeemerald-Expansion Changelogs +## 1.10.x +- **[Version 1.10.0](docs/changelogs/1.10.x/1.10.0.md) - ✨ Feature Release** + ## 1.9.x - **[Version 1.9.4](docs/changelogs/1.9.x/1.9.4.md) - 🧹 Bugfix Release** - **[Version 1.9.3](docs/changelogs/1.9.x/1.9.3.md) - 🧹 Bugfix Release** diff --git a/README.md b/README.md index 823a02479c4..277dae2be78 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ pokeemerald-expansion is a decomp hack base project based off pret's [pokeemeral If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect. You can phrase it as the following: ``` -Based off RHH's pokeemerald-expansion 1.9.4 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.10.0 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please follow the instructions in `INSTALL.md` to get pokeemerald-expansion set up on your machine. @@ -177,7 +177,7 @@ With this, you'll get the latest version of pokeemerald-expansion, plus a couple - Check your current version. - You can check in the debug menu's `Utilities -> Expansion Version` option. - If the option is not available, you possibly have version 1.6.2 or older. In that case, please check the [changelogs](CHANGELOG.md) to determine your version based on the features available on your repository. -- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.9.4, use `git pull RHH expansion/1.9.4`). +- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.10.0, use `git pull RHH expansion/1.10.0`). - ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on) - Alternatively, you can update to unreleased versions of the expansion. - ***master (stable):*** It contains unreleased **bugfixes** that will come in the next patch version. To merge, use `git pull RHH master`. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index ab016136a19..cb02bb306e7 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -18,6 +18,8 @@ - [v1.6.x](tutorials/how_to_new_pokemon_1_6_0.md) - [How to use the Testing System](tutorials/how_to_testing_system.md) - [Changelog](./CHANGELOG.md) + - [1.10.x]() + - [Version 1.10.0](changelogs/1.9.x/1.9.4.md) - [1.9.x]() - [Version 1.9.4](changelogs/1.9.x/1.9.4.md) - [Version 1.9.3](changelogs/1.9.x/1.9.3.md) diff --git a/docs/changelogs/1.10.0/1.10.0.md b/docs/changelogs/1.10.0/1.10.0.md new file mode 100644 index 00000000000..9cf2f9b41e9 --- /dev/null +++ b/docs/changelogs/1.10.0/1.10.0.md @@ -0,0 +1,324 @@ +# Version 1.10.0 + +```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.10.0`. +``` + +## 🌋 *REFACTORS* 🌋 +📜 = Uses a migration script. +* Changes Evolution methods to Enums by @AlexOn1ine in [#4977](https://github.com/rh-hideout/pokeemerald-expansion/pull/4977) +* Turn item hold effects into an enum by @Bassoonian in [#5498](https://github.com/rh-hideout/pokeemerald-expansion/pull/5498) +* Change `GET_MOVE_TYPE` to a function by @AlexOn1ine in [#5090](https://github.com/rh-hideout/pokeemerald-expansion/pull/5090) +* Created `COMPOUND_STRING`s for default player names by @fdeblasio in [#5037](https://github.com/rh-hideout/pokeemerald-expansion/pull/5037) +* Removed agbcc by @mrgriffin in [#4994](https://github.com/rh-hideout/pokeemerald-expansion/pull/4994) +* Refactor Frontier Brains by @fdeblasio in [#5027](https://github.com/rh-hideout/pokeemerald-expansion/pull/5027) +* Removed all instances of `gBitTable[x]` by @hedara90 in [#5123](https://github.com/rh-hideout/pokeemerald-expansion/pull/5123) +* Made `BuildColorMaps` redundant by using static tables by @pkmnsnfrn in [#5289](https://github.com/rh-hideout/pokeemerald-expansion/pull/5289) +* Removed `FRONTIER_BRAIN_SPRITES` and updated `TRAINER_SPRITE`, `TRAINER_BACK_SPRITE`, and `TRAINER_CLASS` by @fdeblasio in [#5166](https://github.com/rh-hideout/pokeemerald-expansion/pull/5166) +* Added `ShouldSwitch` result to `AiLogicData` by @Pawkkie and @AlexOn1ine had the idea! in [#5440](https://github.com/rh-hideout/pokeemerald-expansion/pull/5440) +* Switch AI refactor + considers free switches by @Pawkkie in [#5379](https://github.com/rh-hideout/pokeemerald-expansion/pull/5379) +* Refactor `ShouldSwitchIfAllBadMoves` by @Pawkkie in [#5452](https://github.com/rh-hideout/pokeemerald-expansion/pull/5452) +* Updated Wring Out effects to match Eruption effects by @AsparagusEduardo in [#5549](https://github.com/rh-hideout/pokeemerald-expansion/pull/5549) + - Changed Wring Out/Crush Grip/Hard Press to use `power` instead of `argument` to determine its max power, just like how Eruption/Water Spout/Dragon Energy do it. + - Also: + - Renamed `EFFECT_VARY_POWER_BASED_ON_HP` to `EFFECT_POWER_BASED_ON_TARGET_HP` + - Renamed `EFFECT_ERUPTION` to `EFFECT_POWER_BASED_ON_USER_HP` +* Update battle messages to Gen 5+ standards by @kittenchilly in [#3240](https://github.com/rh-hideout/pokeemerald-expansion/pull/3240) +* Should switch refactor to facilitate switch prediction by @Pawkkie in [#5466](https://github.com/rh-hideout/pokeemerald-expansion/pull/5466) +* Unwind `TRAINER_CLASS` macro by @SBird1337 in [#5611](https://github.com/rh-hideout/pokeemerald-expansion/pull/5611) +* Refactors Absorb to use `Moveend` by @AlexOn1ine in [#5670](https://github.com/rh-hideout/pokeemerald-expansion/pull/5670) + * For new absorbing moves an argument should be added in `moves_info.h` +* Changes name of `B_SCR_NAME_WITH_PREFIX` by @AlexOn1ine in [#5675](https://github.com/rh-hideout/pokeemerald-expansion/pull/5675) + +## 🧬 General 🧬 +### Added +* Added performance counter by @hedara90 and @SBird1337 provided the actual code in [#5284](https://github.com/rh-hideout/pokeemerald-expansion/pull/5284) +* Added debug build target by @u8-Salem in [#4817](https://github.com/rh-hideout/pokeemerald-expansion/pull/4817) +* Added `AUTO_SCROLL_TEXT` and `NUM_FRAMES_AUTO_SCROLL_DELAY` by @pkmnsnfrn in [#5054](https://github.com/rh-hideout/pokeemerald-expansion/pull/5054) +* Adds `SAVE_TYPE_ERROR_SCREEN` by @pkmnsnfrn in [#5188](https://github.com/rh-hideout/pokeemerald-expansion/pull/5188) +* Move Relearner and Renaming From Summary Screen by @ravepossum in [#5513](https://github.com/rh-hideout/pokeemerald-expansion/pull/5513) +* Automatic Line Breaks, somewhat even lines by @hedara90 and @AsparagusEduardo in [#5689](https://github.com/rh-hideout/pokeemerald-expansion/pull/5689) + - Automatically insert line breaks into a string with `BreakStringAutomatic`. + - This function does not modify strings with existing line breaks. + - Remove existing line breaks from a string with `StripLineBreaks`. + +### Changed +* Removed agbcc by @mrgriffin in [#4994](https://github.com/rh-hideout/pokeemerald-expansion/pull/4994) +* Removed all instances of `gBitTable[x]` by @hedara90 in [#5123](https://github.com/rh-hideout/pokeemerald-expansion/pull/5123) +* Converted Mechadoll text to `COMPOUND_STRING`s by @fdeblasio in [#5276](https://github.com/rh-hideout/pokeemerald-expansion/pull/5276) +* New terrain bgs by @TheTrueSadfish in [#5162](https://github.com/rh-hideout/pokeemerald-expansion/pull/5162) +* Removed agbcc screenshots from `.gitignore` by @Bassoonian in [#5538](https://github.com/rh-hideout/pokeemerald-expansion/pull/5538) +* Set default battle shadow to Gen3 by @hedara90 in [#5632](https://github.com/rh-hideout/pokeemerald-expansion/pull/5632) + - Note: Trainerslides don't work properly with Gen4 shadows. +* Convert 3 variouses to `callnatives` by @AlexOn1ine in [#5646](https://github.com/rh-hideout/pokeemerald-expansion/pull/5646) + +## 🗺️ Overworld 🗺️ +### Added +* FRLG+ whiteout message by @cawtds in [#4967](https://github.com/rh-hideout/pokeemerald-expansion/pull/4967) +* Dynamic Move Types in Summary Screen/Battle by @Galaxeeh in [#5084](https://github.com/rh-hideout/pokeemerald-expansion/pull/5084) +* Adds `OW_BERRY_IMMORTAL` by @pkmnsnfrn in [#5187](https://github.com/rh-hideout/pokeemerald-expansion/pull/5187) +* (Default Off) Item Description Headers by @ghoulslash in [#4767](https://github.com/rh-hideout/pokeemerald-expansion/pull/4767) +* RTC-based wild encounters by @hjk321 in [#5313](https://github.com/rh-hideout/pokeemerald-expansion/pull/5313) +* Added `MB_X_Y_STAIR_WARP` metatile behaviors by @pkmnsnfrn in [#5278](https://github.com/rh-hideout/pokeemerald-expansion/pull/5278) +* Added Sideways Stairs by @ghoulslash in [#4836](https://github.com/rh-hideout/pokeemerald-expansion/pull/4836) +* Added `OW_UNION_DISABLE_CHECK` and `OW_FLAG_MOVE_UNION_ROOM_CHECK` by @pkmnsnfrn in [#5448](https://github.com/rh-hideout/pokeemerald-expansion/pull/5448) +* Adds new scripting macros to increase developer quality of life by @pkmnsnfrn in [#5177](https://github.com/rh-hideout/pokeemerald-expansion/pull/5177) +* Added more later gen fishing mechanics by @kittenchilly in [#5518](https://github.com/rh-hideout/pokeemerald-expansion/pull/5518) + +### Changed +* Created PokeNav `COMPOUND_STRING`s by @fdeblasio in [#4983](https://github.com/rh-hideout/pokeemerald-expansion/pull/4983) +* Added `I_REPEL_INCLUDE_FAINTED` config and behavior by @kittenchilly in [#5239](https://github.com/rh-hideout/pokeemerald-expansion/pull/5239) +* RTC-based wild encounters follow up by @AlexOn1ine in [#5328](https://github.com/rh-hideout/pokeemerald-expansion/pull/5328) +* Revert rtc based encounters by @AlexOn1ine in [#5331](https://github.com/rh-hideout/pokeemerald-expansion/pull/5331) +* Made BuildColorMaps redundant by using static tables by @pkmnsnfrn in [#5289](https://github.com/rh-hideout/pokeemerald-expansion/pull/5289) +* Added `OW_AUTO_SIGNPOST` and associated metatile behaviors by @pkmnsnfrn in [#5044](https://github.com/rh-hideout/pokeemerald-expansion/pull/5044) +* Added support for overworld sprite gender differences + add all the sprites by @kittenchilly in [#5394](https://github.com/rh-hideout/pokeemerald-expansion/pull/5394) + +### Fixed +* Added some null pointer checks by @tertu-m in [#5130](https://github.com/rh-hideout/pokeemerald-expansion/pull/5130) +* Reset item flags on new game by @ghoulslash in [#5363](https://github.com/rh-hideout/pokeemerald-expansion/pull/5363) +* Follower female fix by @hedara90 in [#5475](https://github.com/rh-hideout/pokeemerald-expansion/pull/5475) + +## 🐉 Pokémon 🐉 +### Added +* Added config to change Vivillon's breeding form by @kittenchilly in [#4813](https://github.com/rh-hideout/pokeemerald-expansion/pull/4813) +* Added back GBA sprites via config by @AsparagusEduardo and @AlexOn1ine for their help with script to migrate data from vanilla to our current `gSpeciesInfo` in [#5206](https://github.com/rh-hideout/pokeemerald-expansion/pull/5206) +* Added config to disable gender differences by @AsparagusEduardo in [#5595](https://github.com/rh-hideout/pokeemerald-expansion/pull/5595) + +### Changed +* Made perfect IV count into a granular setting by @AsparagusEduardo in [#5115](https://github.com/rh-hideout/pokeemerald-expansion/pull/5115) +* Updated species defines by @pkmnsnfrn in [#5075](https://github.com/rh-hideout/pokeemerald-expansion/pull/5075) +* Added support for overworld sprite gender differences + add all the sprites by @kittenchilly in [#5394](https://github.com/rh-hideout/pokeemerald-expansion/pull/5394) +* Renamed folders and symbols to match species defines by @AsparagusEduardo in [#5581](https://github.com/rh-hideout/pokeemerald-expansion/pull/5581) + - Burmy and Wormadam footprints were in a `plant` subfolder. They have been moved to the species root folder + - Paldean Wooper's subfolder was named `wooper_paldean` instead of just `paldean`. This has been corrected. + - Zen Mode Galarian Darmanitan's folder was located in `darmanitan/galarian/zen_mode`. This has been corrected to `darmanitan/galar_zen`, alongside Galarian Standard Mode's `darmanitan/galar_standard`. + - Also updated Ogerpon's folders similarly. + - Renamed `SPECIES_PIKACHU_PARTNER_CAP` to `SPECIES_PIKACHU_PARTNER`. +* Changing `EVO_NONE` from `0xFFFE` to `0` by @GhoulMage in [#5547](https://github.com/rh-hideout/pokeemerald-expansion/pull/5547) + - There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as `EVO_FRIENDSHIP` used to be the first index although it started with 1. + +### Fixed +* Follower female fix by @hedara90 in [#5475](https://github.com/rh-hideout/pokeemerald-expansion/pull/5475) +* Fixed some gba sprites by @SubzeroEclipse in [#5607](https://github.com/rh-hideout/pokeemerald-expansion/pull/5607) + +## ⚔️ Battle General ⚔️ +### Added +* FRLG+ whiteout message by @cawtds in [#4967](https://github.com/rh-hideout/pokeemerald-expansion/pull/4967) +* Added B_SHOW_TYPES and cleaned up IsDoubleBattle by @pkmnsnfrn in [#5131](https://github.com/rh-hideout/pokeemerald-expansion/pull/5131) +* EV Caps and EV Items by @Flash1Lucky and @AlexOn1ine in [#5269](https://github.com/rh-hideout/pokeemerald-expansion/pull/5269) +* Added in-battle shadows underneath all enemy battlers by @lhearachel in [#5178](https://github.com/rh-hideout/pokeemerald-expansion/pull/5178) +* Added Gen 1 Crit Chance by @Pawkkie in [#5439](https://github.com/rh-hideout/pokeemerald-expansion/pull/5439) +* Added battle flag that prevents running from wild Pokémon by @SarnPoke in [#5502](https://github.com/rh-hideout/pokeemerald-expansion/pull/5502) + +### Changed +* Refactor Frontier Brains by @fdeblasio in [#5027](https://github.com/rh-hideout/pokeemerald-expansion/pull/5027) +* Removed some hardcoding of move IDs + Gen4/5 Defog by @AsparagusEduardo in [#5156](https://github.com/rh-hideout/pokeemerald-expansion/pull/5156) +* Convert 8 various to `callnatives` by @AsparagusEduardo in [#5172](https://github.com/rh-hideout/pokeemerald-expansion/pull/5172) +* Anger Shell use `saveattacker` by @ghoulslash in [#5409](https://github.com/rh-hideout/pokeemerald-expansion/pull/5409) +* Clean up Unseen Fist Check by @AlexOn1ine in [#5420](https://github.com/rh-hideout/pokeemerald-expansion/pull/5420) +* Updated species defines by @pkmnsnfrn in [#5075](https://github.com/rh-hideout/pokeemerald-expansion/pull/5075) +* Removes Crit Chance preproc by @AlexOn1ine in [#5520](https://github.com/rh-hideout/pokeemerald-expansion/pull/5520) +* Update battle messages to Gen 5+ standards by @kittenchilly in [#3240](https://github.com/rh-hideout/pokeemerald-expansion/pull/3240) +* More post-#3240 cleanup by @kittenchilly in [#5593](https://github.com/rh-hideout/pokeemerald-expansion/pull/5593) +* Unwind `TRAINER_CLASS` macro by @SBird1337 in [#5611](https://github.com/rh-hideout/pokeemerald-expansion/pull/5611) +* Removes redundant Decorate check by @AlexOn1ine in [#5696](https://github.com/rh-hideout/pokeemerald-expansion/pull/5696) +* Changes target bit of Flower Shield by @AlexOn1ine in [#5698](https://github.com/rh-hideout/pokeemerald-expansion/pull/5698) + +### Fixed +* Fixed a sprite issue with `B_SHOW_TYPES` by @pkmnsnfrn in [#5157](https://github.com/rh-hideout/pokeemerald-expansion/pull/5157) +* Dynamic Move Display fixes by @Galaxeeh in [#5251](https://github.com/rh-hideout/pokeemerald-expansion/pull/5251) +* Fixed a display issue with `B_SHOW_TYPES` by @pkmnsnfrn and @iriv24 in [#5201](https://github.com/rh-hideout/pokeemerald-expansion/pull/5201) +* Fixed Gen 3 foreseen and Beat Up damage type by @hedara90 in [#5323](https://github.com/rh-hideout/pokeemerald-expansion/pull/5323) +* Fixes Defog used by the wrong side when there is a Substitue and Screen by @AlexOn1ine in [#5381](https://github.com/rh-hideout/pokeemerald-expansion/pull/5381) +* Fixes Hidden Power dynamic type bug by @AlexOn1ine in [#5463](https://github.com/rh-hideout/pokeemerald-expansion/pull/5463) +* Display the correct shadow size when sending out a new Pokemon by @lhearachel in [#5618](https://github.com/rh-hideout/pokeemerald-expansion/pull/5618) +* Fixed text wrap obtaining the incorrect glyph width by @AsparagusEduardo and @AlexOn1ine for their help verifying that the fix works with one of his custom strings in [#5620](https://github.com/rh-hideout/pokeemerald-expansion/pull/5620) +* Improve line breaks/scrolls by @cawtds in [#5641](https://github.com/rh-hideout/pokeemerald-expansion/pull/5641) +* Fixed Order Up + Tera Stellar breaking each other with Commander by @PhallenTree in [#5667](https://github.com/rh-hideout/pokeemerald-expansion/pull/5667) +* Fixes wrong Id when AI chooses mon to switch in by @AlexOn1ine in [#5684](https://github.com/rh-hideout/pokeemerald-expansion/pull/5684) +* Fixes Absorb regression caused by #5670 by @AlexOn1ine in [#5688](https://github.com/rh-hideout/pokeemerald-expansion/pull/5688) +* Fixes heal blocked leeach seed in tests by @AlexOn1ine in [#5700](https://github.com/rh-hideout/pokeemerald-expansion/pull/5700) +* Trainer class+name expansion fix for Battle Frontier by @hedara90 in [#5699](https://github.com/rh-hideout/pokeemerald-expansion/pull/5699) + +## 🤹 Moves 🤹 +### Changed +* Added Population Bomb animation by @kittenchilly in [#5194](https://github.com/rh-hideout/pokeemerald-expansion/pull/5194) +* Move battle anim arrays to C by @cawtds in [#5306](https://github.com/rh-hideout/pokeemerald-expansion/pull/5306) +* Grass/Water Pledge Swamp Animation + Sea of Fire animation tweak by @SonikkuA-DatH in [#5325](https://github.com/rh-hideout/pokeemerald-expansion/pull/5325) +* New animations for many moves more details in description by @TheTrueSadfish in [#5367](https://github.com/rh-hideout/pokeemerald-expansion/pull/5367) +* Use move effect for some moves instead of ids by @AlexOn1ine in [#5433](https://github.com/rh-hideout/pokeemerald-expansion/pull/5433) +* Adds Commander and Order Up by @AlexOn1ine in [#5246](https://github.com/rh-hideout/pokeemerald-expansion/pull/5246) +* Heart Swap Move Animation by @SonikkuA-DatH in [#5460](https://github.com/rh-hideout/pokeemerald-expansion/pull/5460) +* Update `shed_tail.c` by @Bassoonian in [#5494](https://github.com/rh-hideout/pokeemerald-expansion/pull/5494) +* Added Ion Deluge animation by @kittenchilly in [#5467](https://github.com/rh-hideout/pokeemerald-expansion/pull/5467) +* Updated Wring Out effects to match Eruption effects by @AsparagusEduardo in [#5549](https://github.com/rh-hideout/pokeemerald-expansion/pull/5549) + - Changed Wring Out/Crush Grip/Hard Press to use `power` instead of `argument` to determine its max power, just like how Eruption/Water Spout/Dragon Energy do it. Also: + - Renamed `EFFECT_VARY_POWER_BASED_ON_HP` to `EFFECT_POWER_BASED_ON_TARGET_HP` + - Renamed `EFFECT_ERUPTION` to `EFFECT_POWER_BASED_ON_USER_HP` +* Refactors Absorb to use Moveend by @AlexOn1ine in [#5670](https://github.com/rh-hideout/pokeemerald-expansion/pull/5670) + * For new absorbing moves an argument should be added in `moves_info.h` + +### Fixed +* Dark Void, Clangorous Soulblaze, vortex animation fixes by @TheTrueSadfish in [#5650](https://github.com/rh-hideout/pokeemerald-expansion/pull/5650) + +## 🎭 Abilities 🎭 +### Changed +* Adds Commander and Order Up by @AlexOn1ine in [#5246](https://github.com/rh-hideout/pokeemerald-expansion/pull/5246) + +## 🧶 Items 🧶 +### Added +* Adds `OW_BERRY_IMMORTAL` by @pkmnsnfrn in [#5187](https://github.com/rh-hideout/pokeemerald-expansion/pull/5187) +* Added functionality to Poké Flute and Town Map by @kittenchilly and @LOuroboros basically did the Town Map implementation in [#5405](https://github.com/rh-hideout/pokeemerald-expansion/pull/5405) +* Decouple Poke Ball ids from item ids by @AlexOn1ine in [#5560](https://github.com/rh-hideout/pokeemerald-expansion/pull/5560) + +### Changed +* Consolidated the values of Rotom's moves and added Gen9 base form effect by @fdeblasio in [#5186](https://github.com/rh-hideout/pokeemerald-expansion/pull/5186) +* Added `I_REPEL_INCLUDE_FAINTED` config and behavior by @kittenchilly in [#5239](https://github.com/rh-hideout/pokeemerald-expansion/pull/5239) + +### Fixed +* Replace hardcoded flute check with consumability check by @Bassoonian in [#5508](https://github.com/rh-hideout/pokeemerald-expansion/pull/5508) + +## 🤖 Battle AI 🤖 +### Added +* Adds config to show target of ingame partner by @AlexOn1ine in [#5307](https://github.com/rh-hideout/pokeemerald-expansion/pull/5307) +* Switch AI refactor + considers free switches by @Pawkkie in [#5379](https://github.com/rh-hideout/pokeemerald-expansion/pull/5379) +* New AI flag for marking the two last Pokémon as Ace Pokémon by @GhoulMage in [#5587](https://github.com/rh-hideout/pokeemerald-expansion/pull/5587) + +### Changed +* Chilly Reception AI by @kittenchilly in [#5271](https://github.com/rh-hideout/pokeemerald-expansion/pull/5271) +* Shed Tail AI by @SarnPoke and @AlexOn1ine, @Pawkkie in [#5275](https://github.com/rh-hideout/pokeemerald-expansion/pull/5275) +* More missing AI logic by @kittenchilly in [#5279](https://github.com/rh-hideout/pokeemerald-expansion/pull/5279) +* Adds basic trainer and smart trainer flags by @AlexOn1ine in [#5298](https://github.com/rh-hideout/pokeemerald-expansion/pull/5298) +* `AI_FLAG_SETUP_FIRST_TURN` rename and clarifications by @Pawkkie in [#5310](https://github.com/rh-hideout/pokeemerald-expansion/pull/5310) +* Added Composite AI Flags to Docs by @Pawkkie in [#5349](https://github.com/rh-hideout/pokeemerald-expansion/pull/5349) +* AI frostbite score fixes and improvements by @Pawkkie and @kittenchilly for the suggestion! in [#5362](https://github.com/rh-hideout/pokeemerald-expansion/pull/5362) +* Switch AI `hitsToKO` considers one shot prevention by @Pawkkie in [#5371](https://github.com/rh-hideout/pokeemerald-expansion/pull/5371) +* Adds `CanEndureHit` AI function by @AlexOn1ine in [#5373](https://github.com/rh-hideout/pokeemerald-expansion/pull/5373) +* Switch AI `hitsToKO` considers Disguise by @Pawkkie in [#5375](https://github.com/rh-hideout/pokeemerald-expansion/pull/5375) +* Added `ShouldSwitch` result to `AiLogicData` by @Pawkkie and @AlexOn1ine had the idea! in [#5440](https://github.com/rh-hideout/pokeemerald-expansion/pull/5440) +* Removes duplicate code in AI functions by @AlexOn1ine in [#5457](https://github.com/rh-hideout/pokeemerald-expansion/pull/5457) +* Unify `GetBattlerAbility`/`TerrainAffected` to remove duplicate ai function by @AlexOn1ine in [#5497](https://github.com/rh-hideout/pokeemerald-expansion/pull/5497) +* `ShouldSwitchIfGameStatePrompt` Tests by @Pawkkie in [#5462](https://github.com/rh-hideout/pokeemerald-expansion/pull/5462) +* `AI_FLAG_ACE_POKEMON` takes into account separate trainers by @GhoulMage and @/uvula on Discord noted the weird behaviour. in [#5608](https://github.com/rh-hideout/pokeemerald-expansion/pull/5608) + - Fix for the AI not considering both trainers Ace Pokémons in double battles with `AI_FLAG_ACE_POKEMON`. +* Moves that deal a Fixed amount don't need AI handling by @AlexOn1ine in [#5614](https://github.com/rh-hideout/pokeemerald-expansion/pull/5614) +* Combines `CalculateMoveDamage` arguments into a struct by @AlexOn1ine in [#5570](https://github.com/rh-hideout/pokeemerald-expansion/pull/5570) + +### Fixed +* AI burn score fixes and improvements by @Pawkkie and @iriv24 and @AlexOn1ine in [#5356](https://github.com/rh-hideout/pokeemerald-expansion/pull/5356) +* Improve AI's Skill Swap handling in double battles by @Pawkkie in [#5360](https://github.com/rh-hideout/pokeemerald-expansion/pull/5360) +* Refactor `ShouldSwitchIfAllBadMoves` by @Pawkkie in [#5452](https://github.com/rh-hideout/pokeemerald-expansion/pull/5452) +* Should switch refactor to facilitate switch prediction by @Pawkkie in [#5466](https://github.com/rh-hideout/pokeemerald-expansion/pull/5466) +* Fixes Switch in flag not restoring mons properly with test by @Pawkkie and @iriv24 for finding, @AlexOn1ine for fixing in [#5746](https://github.com/rh-hideout/pokeemerald-expansion/pull/5746) + +## 🧹 Other Cleanup 🧹 +* Removed metadata in AIF files by @SombrAbsol in [#4958](https://github.com/rh-hideout/pokeemerald-expansion/pull/4958) +* Removed `gPaletteDecompressionBuffer` and unused palette functions/vars by @DizzyEggg in [#4841](https://github.com/rh-hideout/pokeemerald-expansion/pull/4841) +* Changes Evolution methods to `enum`s by @AlexOn1ine in [#4977](https://github.com/rh-hideout/pokeemerald-expansion/pull/4977) +* Doesn't compile on some compilers by @AlexOn1ine in [#5099](https://github.com/rh-hideout/pokeemerald-expansion/pull/5099) +* Update `event.inc` to accomodate new `gDecompressionBuffer` name by @Bassoonian in [#5100](https://github.com/rh-hideout/pokeemerald-expansion/pull/5100) +* Created `COMPOUND_STRING`s for default player names by @fdeblasio in [#5037](https://github.com/rh-hideout/pokeemerald-expansion/pull/5037) +* Changed single-use berry blender strings to be `COMPOUND_STRING`s by @fdeblasio in [#4963](https://github.com/rh-hideout/pokeemerald-expansion/pull/4963) +* Made perfect IV count into a granular setting by @AsparagusEduardo in [#5115](https://github.com/rh-hideout/pokeemerald-expansion/pull/5115) +* Dynamic move type clean up by @AlexOn1ine in [#5132](https://github.com/rh-hideout/pokeemerald-expansion/pull/5132) +* Refactor Frontier Brains by @fdeblasio in [#5027](https://github.com/rh-hideout/pokeemerald-expansion/pull/5027) +* Removed some hardcoding of move IDs + Gen4/5 Defog by @AsparagusEduardo in [#5156](https://github.com/rh-hideout/pokeemerald-expansion/pull/5156) +* Teatime animations use `B_WAIT_TIME_LONG` by @AsparagusEduardo in [#5173](https://github.com/rh-hideout/pokeemerald-expansion/pull/5173) +* Created PokeNav `COMPOUND_STRING`s by @fdeblasio in [#4983](https://github.com/rh-hideout/pokeemerald-expansion/pull/4983) +* Removed `gBitTable` usage again by @hedara90 in [#5193](https://github.com/rh-hideout/pokeemerald-expansion/pull/5193) +* Removed support for the original LCG random number generator by @tertu-m in [#5078](https://github.com/rh-hideout/pokeemerald-expansion/pull/5078) +* Deprecate MMBN Names by @pkmnsnfrn in [#5240](https://github.com/rh-hideout/pokeemerald-expansion/pull/5240) +* Convert 8 various to `callnatives` by @AsparagusEduardo in [#5172](https://github.com/rh-hideout/pokeemerald-expansion/pull/5172) +* Converted PC strings to `COMPOUND_STRING`s by @fdeblasio in [#5314](https://github.com/rh-hideout/pokeemerald-expansion/pull/5314) +* Cleaned up duplicate dynamic type functions by @AsparagusEduardo in [#5338](https://github.com/rh-hideout/pokeemerald-expansion/pull/5338) +* Removes redundant `moveTargetType` ai function by @AlexOn1ine in [#5354](https://github.com/rh-hideout/pokeemerald-expansion/pull/5354) +* Made `BuildColorMaps` redundant by using static tables by @pkmnsnfrn in [#5289](https://github.com/rh-hideout/pokeemerald-expansion/pull/5289) +* Some strings were switched by @AlexOn1ine in [#5374](https://github.com/rh-hideout/pokeemerald-expansion/pull/5374) +* Switch AI hitsToKO considers Disguise by @Pawkkie in [#5375](https://github.com/rh-hideout/pokeemerald-expansion/pull/5375) +* Cleaned up a bit of code with `GetBattlerPartyData` by @AlexOn1ine in [#5378](https://github.com/rh-hideout/pokeemerald-expansion/pull/5378) +* Minor Gem check optimazation by @AlexOn1ine in [#5401](https://github.com/rh-hideout/pokeemerald-expansion/pull/5401) +* Simplify HP Logic by @AreaZR in [#5403](https://github.com/rh-hideout/pokeemerald-expansion/pull/5403) +* Anger Shell use `saveattacker` by @ghoulslash in [#5409](https://github.com/rh-hideout/pokeemerald-expansion/pull/5409) +* Converted berry and PokeBlock strings to `COMPOUND_STRING`s by @fdeblasio in [#5324](https://github.com/rh-hideout/pokeemerald-expansion/pull/5324) +* Merge item description branch history by @Bassoonian in [#5419](https://github.com/rh-hideout/pokeemerald-expansion/pull/5419) +* Clean up Unseen Fist Check by @AlexOn1ine in [#5420](https://github.com/rh-hideout/pokeemerald-expansion/pull/5420) +* Merge level_caps and ev_caps into one caps file by @kittenchilly in [#5429](https://github.com/rh-hideout/pokeemerald-expansion/pull/5429) +* Removed trailing whitespace pass 10-2-2024 (Upcoming) by @kittenchilly in [#5456](https://github.com/rh-hideout/pokeemerald-expansion/pull/5456) +* Fixed Commander test name by @Bassoonian in [#5458](https://github.com/rh-hideout/pokeemerald-expansion/pull/5458) +* Updated species defines by @pkmnsnfrn in [#5075](https://github.com/rh-hideout/pokeemerald-expansion/pull/5075) +* Adds padding in `AiLogicData` by @AlexOn1ine in [#5468](https://github.com/rh-hideout/pokeemerald-expansion/pull/5468) +* Simplify `BS_FAINTED_MULTIPLE_1` double battle logic in openpartyscreen by @ghoulslash in [#5435](https://github.com/rh-hideout/pokeemerald-expansion/pull/5435) +* Removes duplicate code in AI functions by @AlexOn1ine in [#5457](https://github.com/rh-hideout/pokeemerald-expansion/pull/5457) +* `ShouldPivot` type cleanup by @Pawkkie in [#5441](https://github.com/rh-hideout/pokeemerald-expansion/pull/5441) +* Turn item hold effects into an enum by @Bassoonian in [#5498](https://github.com/rh-hideout/pokeemerald-expansion/pull/5498) +* Unify `GetBattlerAbility`/`TerrainAffected` to remove duplicate ai function by @AlexOn1ine in [#5497](https://github.com/rh-hideout/pokeemerald-expansion/pull/5497) +* Clean up Shedinja code by @Bassoonian in [#5501](https://github.com/rh-hideout/pokeemerald-expansion/pull/5501) +* Clean up `scrcmd` PR by @Bassoonian in [#5511](https://github.com/rh-hideout/pokeemerald-expansion/pull/5511) +* Removes Crit Chance preproc by @AlexOn1ine in [#5520](https://github.com/rh-hideout/pokeemerald-expansion/pull/5520) +* Removed agbcc screenshots from gitignore by @Bassoonian in [#5538](https://github.com/rh-hideout/pokeemerald-expansion/pull/5538) +* Removed unnecessary `gBattlerAttacker` usage by @AlexOn1ine in [#5554](https://github.com/rh-hideout/pokeemerald-expansion/pull/5554) +* Removed remaining line breaks from #3240 + Prefix wrap fix by @AsparagusEduardo in [#5556](https://github.com/rh-hideout/pokeemerald-expansion/pull/5556) +* More post-#3240 cleanup by @kittenchilly in [#5593](https://github.com/rh-hideout/pokeemerald-expansion/pull/5593) +* Renamed folders and symbols to match species defines by @AsparagusEduardo in [#5581](https://github.com/rh-hideout/pokeemerald-expansion/pull/5581) + - Also: + - Burmy and Wormadam footprints were in a `plant` subfolder. They have been moved to the species root folder + - Paldean Wooper's subfolder was named `wooper_paldean` instead of just `paldean`. This has been corrected. + - Zen Mode Galarian Darmanitan's folder was located in `darmanitan/galarian/zen_mode`. This has been corrected to `darmanitan/galar_zen`, alongside Galarian Standard Mode's `darmanitan/galar_standard`. + - Also updated Ogerpon's folders similarly. + - Renamed `SPECIES_PIKACHU_PARTNER_CAP` to `SPECIES_PIKACHU_PARTNER`. +* Minor `BattleStruct` clean up by @AlexOn1ine in [#5585](https://github.com/rh-hideout/pokeemerald-expansion/pull/5585) +* Fixed a ball update oversight by @Bassoonian in [#5609](https://github.com/rh-hideout/pokeemerald-expansion/pull/5609) +* `AI_FLAG_ACE_POKEMON` takes into account separate trainers by @GhoulMage and @/uvula on Discord noted the weird behaviour in [#5608](https://github.com/rh-hideout/pokeemerald-expansion/pull/5608) + - Fix for the AI not considering both trainers Ace Pokémons in double battles with `AI_FLAG_ACE_POKEMON`. +* Moves that deal a Fixed amount don't need AI handling by @AlexOn1ine in [#5614](https://github.com/rh-hideout/pokeemerald-expansion/pull/5614) +* Combines `CalculateMoveDamage` arguments into a struct by @AlexOn1ine in [#5570](https://github.com/rh-hideout/pokeemerald-expansion/pull/5570) +* Follow up for #5570 by @AlexOn1ine in [#5625](https://github.com/rh-hideout/pokeemerald-expansion/pull/5625) +* `AI_CalcDamage` clean up by @AlexOn1ine in [#5629](https://github.com/rh-hideout/pokeemerald-expansion/pull/5629) +* Convert 3 variouses to `callnatives` by @AlexOn1ine in [#5646](https://github.com/rh-hideout/pokeemerald-expansion/pull/5646) +* Convert `gBattleStringsTable` to `COMPOUND_STRING`s by @AsparagusEduardo in [#5649](https://github.com/rh-hideout/pokeemerald-expansion/pull/5649) +* Added merged placeholder text for trainer name with class by @kittenchilly in [#5622](https://github.com/rh-hideout/pokeemerald-expansion/pull/5622) +* Cleans up Primal Reversion code by @AlexOn1ine in [#5659](https://github.com/rh-hideout/pokeemerald-expansion/pull/5659) +* Critical Hit documentation and distorted match up struct switch by @AlexOn1ine in [#5665](https://github.com/rh-hideout/pokeemerald-expansion/pull/5665) +* Changes name of `B_SCR_NAME_WITH_PREFIX` by @AlexOn1ine in [#5675](https://github.com/rh-hideout/pokeemerald-expansion/pull/5675) +* Removes redundant Decorate check by @AlexOn1ine in [#5696](https://github.com/rh-hideout/pokeemerald-expansion/pull/5696) +* Changes taget bit of Flower Shield by @AlexOn1ine in [#5698](https://github.com/rh-hideout/pokeemerald-expansion/pull/5698) +* Changing `EVO_NONE` from `0xFFFE` to `0` by @GhoulMage in [#5547](https://github.com/rh-hideout/pokeemerald-expansion/pull/5547) + - There could be a case for out of bounds errors if arrays or iterations are happening where you're using + 1 or - 1, as `EVO_FRIENDSHIP` used to be the first index although it started with 1. + +## 🧪 Test Runner 🧪 +### Changed +* Fixed Commander test name by @Bassoonian in [#5458](https://github.com/rh-hideout/pokeemerald-expansion/pull/5458) +* `ShouldSwitchIfGameStatePrompt` Tests by @Pawkkie in [#5462](https://github.com/rh-hideout/pokeemerald-expansion/pull/5462) +* Added various tests, add `RNG_RANDOM_TARGET` by @ghoulslash in [#5438](https://github.com/rh-hideout/pokeemerald-expansion/pull/5438) +* Added Costar Tests, Download Test for Doubles by @ghoulslash in [#5526](https://github.com/rh-hideout/pokeemerald-expansion/pull/5526) +* Updated Wring Out effects to match Eruption effects by @AsparagusEduardo in [#5549](https://github.com/rh-hideout/pokeemerald-expansion/pull/5549) + - Changed Wring Out/Crush Grip/Hard Press to use `power` instead of `argument` to determine its max power, just like how Eruption/Water Spout/Dragon Energy do it. Also: + - Renamed `EFFECT_VARY_POWER_BASED_ON_HP` to `EFFECT_POWER_BASED_ON_TARGET_HP` + - Renamed `EFFECT_ERUPTION` to `EFFECT_POWER_BASED_ON_USER_HP` +* Healer ability tests by @Pawkkie in [#5559](https://github.com/rh-hideout/pokeemerald-expansion/pull/5559) +* Mark all tests as used by @mrgriffin in [#5531](https://github.com/rh-hideout/pokeemerald-expansion/pull/5531) + +### Fixed +* Should switch refactor to facilitate switch prediction by @Pawkkie in [#5466](https://github.com/rh-hideout/pokeemerald-expansion/pull/5466) + +## 📚 Documentation 📚 +* `DoBattleIntro` state documentation by @AsparagusEduardo and @ShinyDragonHunter in [#5231](https://github.com/rh-hideout/pokeemerald-expansion/pull/5231) +* Deprecate MMBN Names by @pkmnsnfrn in [#5240](https://github.com/rh-hideout/pokeemerald-expansion/pull/5240) +* `AI_FLAG_SETUP_FIRST_TURN` Rename and Clarifications by @Pawkkie in [#5310](https://github.com/rh-hideout/pokeemerald-expansion/pull/5310) +* Added Composite AI Flags to Docs by @Pawkkie in [#5349](https://github.com/rh-hideout/pokeemerald-expansion/pull/5349) +* Updated the new pokemon tutorial for 1.10 by @hedara90 in [#5721](https://github.com/rh-hideout/pokeemerald-expansion/pull/5721) + - Some changes compared to previous. + +## New Contributors +* @SombrAbsol made their first contribution in [#4958](https://github.com/rh-hideout/pokeemerald-expansion/pull/4958) +* @Galaxeeh made their first contribution in [#5084](https://github.com/rh-hideout/pokeemerald-expansion/pull/5084) +* @Flash1Lucky made their first contribution in [#5269](https://github.com/rh-hideout/pokeemerald-expansion/pull/5269) +* @GhoulMage made their first contribution in [#5547](https://github.com/rh-hideout/pokeemerald-expansion/pull/5547) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.9.4...expansion/1.10.0 + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 6e6ce7f0eec..c24fbeec800 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.9.4 +// Last version: 1.10.0 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 10 #define EXPANSION_VERSION_PATCH 0 From 1dde42c0cc9d13c853e215c81f9ecc53ae9cffea Mon Sep 17 00:00:00 2001 From: iriv24 <40581123+iriv24@users.noreply.github.com> Date: Sun, 1 Dec 2024 14:37:46 -0500 Subject: [PATCH 54/56] Cant't knock off Rusted Shield/Sword from Zamazenta/Zacian (#5750) --- src/battle_util.c | 1 + test/battle/move_effect/knock_off.c | 122 +++++++++++++++++++++++++++- 2 files changed, 122 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 6f0b2af880f..4dd236a6954 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10672,6 +10672,7 @@ bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) case FORM_CHANGE_BATTLE_PRIMAL_REVERSION: case FORM_CHANGE_BATTLE_ULTRA_BURST: case FORM_CHANGE_ITEM_HOLD: + case FORM_CHANGE_BEGIN_BATTLE: if (formChanges[i].param1 == heldItemId) return TRUE; break; diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index 50d8aaa7730..b03432e6953 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -202,6 +202,126 @@ SINGLE_BATTLE_TEST("Knock Off doesn't knock off items from Pokemon behind substi } WHEN { TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_KNOCK_OFF); } } SCENE { - NOT MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Poké Ball"); + NOT MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Poké Ball!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off does knock off Mega Stones from Pokemon that don't actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ABSOLITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Absolite!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off doesn't knock off Mega Stones from Pokemon that actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ABSOL) { Item(ITEM_ABSOLITE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NOT MESSAGE("Wobbuffet knocked off Foe Absol's Absolite!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off does knock off Orbs for Primal Reversion from Pokemon that don't actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Red Orb!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off doesn't knock off Orbs for Primal Reversion from Pokemon that actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NOT MESSAGE("Wobbuffet knocked off Foe Groudon's Red Orb!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off doesn't knock off Z-Crystals") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIUM_Z); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NOT MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Electrium Z!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off doesn't knock off Ultranecrozium Z from Pokemon that actually use it") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NOT MESSAGE("Wobbuffet knocked off Foe Necrozma's Ultranecrozium Z!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off does knock off other form-change hold items from Pokemon that don't actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SKY_PLATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Sky Plate!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off doesn't knock off other form-change hold items from Pokemon that actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ARCEUS) { Item(ITEM_SKY_PLATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NOT MESSAGE("Wobbuffet knocked off Foe Arceus's Sky Plate!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off does knock off begin-battle form-change hold items from Pokemon that don't actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RUSTED_SHIELD); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + MESSAGE("Wobbuffet knocked off Foe Wobbuffet's Rusted Shield!"); + } +} + +SINGLE_BATTLE_TEST("Knock Off doesn't knock off begin-battle form-change hold items from Pokemon that actually use them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZAMAZENTA_HERO_OF_MANY_BATTLES) { Item(ITEM_RUSTED_SHIELD); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NOT MESSAGE("Wobbuffet knocked off Foe Zamazenta's Rusted Shield!"); } } From 2e30e66e1518f2e25b27421e21036d914dbc4484 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Dec 2024 15:33:42 -0300 Subject: [PATCH 55/56] Begin 1.11.0 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 c24fbeec800..59f0928fcb6 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,9 +1,9 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.10.0 +// Last version: 1.10.1 #define EXPANSION_VERSION_MAJOR 1 -#define EXPANSION_VERSION_MINOR 10 +#define EXPANSION_VERSION_MINOR 11 #define EXPANSION_VERSION_PATCH 0 // FALSE if this this version of Expansion is not a tagged commit, i.e. From 00cb7b36e105016c6aa468af8a6c09039165589f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 1 Dec 2024 15:36:39 -0300 Subject: [PATCH 56/56] Actually start 1.11.0 cycle --- include/constants/expansion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 59f0928fcb6..6b3a5ace78d 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -8,6 +8,6 @@ // 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