From c64453efe50959e6286e984a2a7dda47a1d86831 Mon Sep 17 00:00:00 2001 From: NT_x86 Date: Sat, 13 Apr 2024 10:14:31 +0300 Subject: [PATCH 01/34] Fix poison projectile array being incorrectly combined into three seperate arrays --- src/battle_anim_poison.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/battle_anim_poison.c b/src/battle_anim_poison.c index d9a15c835c..bfe1fc835f 100644 --- a/src/battle_anim_poison.c +++ b/src/battle_anim_poison.c @@ -59,15 +59,7 @@ static const union AnimCmd sAnim_SludgeBombHit[] = static const union AnimCmd *const sAnims_PoisonProjectile[] = { sAnim_PoisonProjectile, -}; - -static const union AnimCmd *const sAnims_AcidPoisonDroplet[] = -{ sAnim_AcidPoisonDroplet, -}; - -static const union AnimCmd *const sAnims_SludgeBombHit[] = -{ sAnim_SludgeBombHit, }; @@ -122,7 +114,7 @@ const struct SpriteTemplate gSludgeBombHitParticleSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, - .anims = sAnims_SludgeBombHit, + .anims = &sAnims_PoisonProjectile[2], .images = NULL, .affineAnims = sAffineAnims_SludgeBombHit, .callback = AnimSludgeBombHitParticle, @@ -145,7 +137,7 @@ const struct SpriteTemplate gAcidPoisonDropletSpriteTemplate = .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sAnims_AcidPoisonDroplet, + .anims = &sAnims_PoisonProjectile[1], .images = NULL, .affineAnims = gAffineAnims_Droplet, .callback = AnimAcidPoisonDroplet, From 2b78a85828eb40b68a0973615665fd22b961bfd9 Mon Sep 17 00:00:00 2001 From: NT_x86 Date: Sat, 13 Apr 2024 13:09:24 +0300 Subject: [PATCH 02/34] Fix hoenn pokedex palette being split in two --- graphics/pokedex/bg_hoenn.pal | 50 ++++++++++++++++++++++++++++- graphics/pokedex/caught_screen.pal | 51 ------------------------------ src/graphics.c | 1 - src/pokedex.c | 2 +- 4 files changed, 50 insertions(+), 54 deletions(-) delete mode 100644 graphics/pokedex/caught_screen.pal diff --git a/graphics/pokedex/bg_hoenn.pal b/graphics/pokedex/bg_hoenn.pal index 569c7821a9..01bd8a3a3d 100644 --- a/graphics/pokedex/bg_hoenn.pal +++ b/graphics/pokedex/bg_hoenn.pal @@ -1,6 +1,6 @@ JASC-PAL 0100 -48 +96 123 131 0 255 255 255 222 222 222 @@ -49,3 +49,51 @@ JASC-PAL 49 139 255 189 156 90 0 0 0 +123 131 0 +255 255 255 +255 238 0 +255 189 0 +255 115 0 +98 98 115 +41 57 65 +41 57 106 +0 0 41 +255 255 255 +238 246 57 +255 0 189 +49 213 74 +24 131 32 +189 156 90 +0 0 0 +123 131 0 +255 255 255 +197 32 32 +189 189 189 +164 164 164 +98 98 115 +41 57 65 +41 57 106 +0 0 41 +255 255 255 +238 246 57 +189 0 0 +74 148 180 +8 90 131 +189 156 90 +0 0 0 +123 131 0 +255 255 255 +197 32 32 +189 189 189 +164 164 164 +98 98 115 +41 57 65 +41 57 106 +0 0 41 +255 255 255 +238 246 57 +255 0 189 +180 205 246 +49 139 255 +189 156 90 +0 0 0 diff --git a/graphics/pokedex/caught_screen.pal b/graphics/pokedex/caught_screen.pal deleted file mode 100644 index 26da98a84c..0000000000 --- a/graphics/pokedex/caught_screen.pal +++ /dev/null @@ -1,51 +0,0 @@ -JASC-PAL -0100 -48 -123 131 0 -255 255 255 -255 238 0 -255 189 0 -255 115 0 -98 98 115 -41 57 65 -41 57 106 -0 0 41 -255 255 255 -238 246 57 -255 0 189 -49 213 74 -24 131 32 -189 156 90 -0 0 0 -123 131 0 -255 255 255 -197 32 32 -189 189 189 -164 164 164 -98 98 115 -41 57 65 -41 57 106 -0 0 41 -255 255 255 -238 246 57 -189 0 0 -74 148 180 -8 90 131 -189 156 90 -0 0 0 -123 131 0 -255 255 255 -197 32 32 -189 189 189 -164 164 164 -98 98 115 -41 57 65 -41 57 106 -0 0 41 -255 255 255 -238 246 57 -255 0 189 -180 205 246 -49 139 255 -189 156 90 -0 0 0 diff --git a/src/graphics.c b/src/graphics.c index 8f1bc89ea6..2612022695 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1230,7 +1230,6 @@ const u16 gFrontierPassMedalsGold_Pal[] = INCBIN_U16("graphics/frontier_pass/gol // Pokédex const u16 gPokedexBgHoenn_Pal[] = INCBIN_U16("graphics/pokedex/bg_hoenn.gbapal"); -const u16 gPokedexCaughtScreen_Pal[] = INCBIN_U16("graphics/pokedex/caught_screen.gbapal"); const u16 gPokedexSearchResults_Pal[] = INCBIN_U16("graphics/pokedex/search_results_bg.gbapal"); const u16 gPokedexBgNational_Pal[] = INCBIN_U16("graphics/pokedex/bg_national.gbapal"); const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.lz"); diff --git a/src/pokedex.c b/src/pokedex.c index 0d1520a490..09a25b872b 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4036,7 +4036,7 @@ static void Task_HandleCaughtMonPageInput(u8 taskId) } else { - LoadPalette(gPokedexCaughtScreen_Pal + 1, BG_PLTT_ID(3) + 1, PLTT_SIZEOF(7)); + LoadPalette(gPokedexBgHoenn_Pal + 49, BG_PLTT_ID(3) + 1, PLTT_SIZEOF(7)); } } From 5dbd90b917c2474cd89b45b2c2e33e1544c43b0e Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Fri, 19 Apr 2024 14:17:12 -0400 Subject: [PATCH 03/34] Use Only One Loop in RandomlyGivePartyPokerus (#1991) --- src/pokemon.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 6ee052fda5..2b8f4fc95f 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6038,14 +6038,10 @@ void RandomlyGivePartyPokerus(struct Pokemon *party) do { - do - { - rnd = Random() % PARTY_SIZE; - mon = &party[rnd]; - } - while (!GetMonData(mon, MON_DATA_SPECIES, 0)); + rnd = Random() % PARTY_SIZE; + mon = &party[rnd]; } - while (GetMonData(mon, MON_DATA_IS_EGG, 0)); + while (!GetMonData(mon, MON_DATA_SPECIES, 0) || GetMonData(mon, MON_DATA_IS_EGG, 0)); if (!(CheckPartyHasHadPokerus(party, gBitTable[rnd]))) { From 411d7e617777a3a7e7c60fdaf5d73d39a2695599 Mon Sep 17 00:00:00 2001 From: Jaizu Date: Tue, 14 May 2024 12:48:20 +0200 Subject: [PATCH 04/34] Make AdjustFriendship more readable --- src/pokemon.c | 60 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 2b8f4fc95f..ef8e7e9e05 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5877,16 +5877,11 @@ u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex) return retVal; } -#define IS_LEAGUE_BATTLE \ - ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ - && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR \ - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER \ - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) \ - void AdjustFriendship(struct Pokemon *mon, u8 event) { u16 species, heldItem; u8 holdEffect; + s8 mod; if (ShouldSkipFriendshipChange()) return; @@ -5916,26 +5911,43 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (friendship > 199) friendshipLevel++; - if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) - && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE)) + if (event == FRIENDSHIP_EVENT_WALKING) { - s8 mod = sFriendshipEventModifiers[event][friendshipLevel]; - if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) - mod = (150 * mod) / 100; - friendship += mod; - if (mod > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > MAX_FRIENDSHIP) - friendship = MAX_FRIENDSHIP; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); + // 50% chance every 128 steps + if (Random() & 1) + return; } + if (event == FRIENDSHIP_EVENT_LEAGUE_BATTLE) + { + // Only if it's a trainer battle with league progression significance + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + return; + if (!(gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR + || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)) + return; + } + + mod = sFriendshipEventModifiers[event][friendshipLevel]; + if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) + // 50% increase, rounding down + mod = (150 * mod) / 100; + + friendship += mod; + if (mod > 0) + { + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) + friendship++; + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + friendship++; + } + + if (friendship < 0) + friendship = 0; + if (friendship > MAX_FRIENDSHIP) + friendship = MAX_FRIENDSHIP; + + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } } From e5b33a04347c92964ec081b11f2e5ac570b2f7f7 Mon Sep 17 00:00:00 2001 From: Isaac Rivera <40581123+iriv24@users.noreply.github.com> Date: Wed, 15 May 2024 09:40:40 -0400 Subject: [PATCH 05/34] Add check for Magic Guard to avoid taking recoil damage (#4578) * Add check for Magic Guard to avoid taking recoil damage * add test to verify a mon with magic guard does not take recoil damage followed format from "Steel Beam hp loss is prevented by Magic Guard" test * update format of tests with magic guard and some form of recoil damage --- data/battle_scripts_1.s | 1 + test/battle/ability/magic_guard.c | 17 +++++++++++++++++ test/battle/move_effect/max_hp_50_recoil.c | 3 ++- test/battle/move_effect/mind_blown.c | 3 ++- 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 test/battle/ability/magic_guard.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f20e13e8ae..a0f1e81ae3 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7467,6 +7467,7 @@ BattleScript_MoveEffectConfusion:: BattleScript_MoveEffectRecoil:: jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd + jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_RecoilEnd BattleScript_DoRecoil:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_IGNORE_DISGUISE healthbarupdate BS_ATTACKER diff --git a/test/battle/ability/magic_guard.c b/test/battle/ability/magic_guard.c new file mode 100644 index 0000000000..69e8bac9c7 --- /dev/null +++ b/test/battle/ability/magic_guard.c @@ -0,0 +1,17 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Magic Guard prevents recoil damage to the user") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_DOUBLE_EDGE].recoil == 33); + PLAYER(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DOUBLE_EDGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_EDGE, player); + HP_BAR(opponent); + NOT HP_BAR(player); + } +} diff --git a/test/battle/move_effect/max_hp_50_recoil.c b/test/battle/move_effect/max_hp_50_recoil.c index 8d5cbdaed2..1ac98854e0 100644 --- a/test/battle/move_effect/max_hp_50_recoil.c +++ b/test/battle/move_effect/max_hp_50_recoil.c @@ -91,8 +91,9 @@ SINGLE_BATTLE_TEST("Steel Beam hp loss is prevented by Magic Guard") } WHEN { TURN { MOVE(player, MOVE_STEEL_BEAM); } } SCENE { - NOT HP_BAR(player); ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_BEAM, player); + HP_BAR(opponent); + NOT HP_BAR(player); } } diff --git a/test/battle/move_effect/mind_blown.c b/test/battle/move_effect/mind_blown.c index f1b7d8b98a..da39cf18d7 100644 --- a/test/battle/move_effect/mind_blown.c +++ b/test/battle/move_effect/mind_blown.c @@ -114,8 +114,9 @@ SINGLE_BATTLE_TEST("Mind Blown hp loss is prevented by Magic Guard") } WHEN { TURN { MOVE(player, MOVE_MIND_BLOWN); } } SCENE { - NOT HP_BAR(player); ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, player); + HP_BAR(opponent); + NOT HP_BAR(player); } } From 00fc5b94f2c5f03c57e6eafa33c1af67eeb243e5 Mon Sep 17 00:00:00 2001 From: sneed <56992013+Sneed69@users.noreply.github.com> Date: Wed, 15 May 2024 18:51:47 +0300 Subject: [PATCH 06/34] Various AI switching logic fixes Part 2 (#4572) * AI can calc hail and sandstorm damage again * reverse weatherImpact hp calculation sign * add missing toxic damage calculation --- src/battle_ai_switch_items.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 6e1cf45d64..093db185d9 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -1326,12 +1326,11 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon // Gets damage / healing from weather static s32 GetSwitchinWeatherImpact(void) { - s32 weatherDamage = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; + s32 weatherImpact = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; u32 holdEffect = gItemsInfo[AI_DATA->switchinCandidate.battleMon.item].holdEffect; if (WEATHER_HAS_EFFECT) { - s32 weatherImpact = 0; // Damage if (holdEffect != HOLD_EFFECT_SAFETY_GOGGLES && ability != ABILITY_MAGIC_GUARD && ability != ABILITY_OVERCOAT) { @@ -1362,34 +1361,30 @@ static s32 GetSwitchinWeatherImpact(void) weatherImpact = 1; } - weatherDamage += weatherImpact; - // Healing if (gBattleWeather & B_WEATHER_RAIN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) { if (ability == ABILITY_DRY_SKIN) { - weatherImpact = maxHP / 8; + weatherImpact = -(maxHP / 8); if (weatherImpact == 0) - weatherImpact = 1; + weatherImpact = -1; } else if (ability == ABILITY_RAIN_DISH) { - weatherImpact = maxHP / 16; + weatherImpact = -(maxHP / 16); if (weatherImpact == 0) - weatherImpact = 1; + weatherImpact = -1; } } if (((gBattleWeather & B_WEATHER_HAIL) || (gBattleWeather & B_WEATHER_SNOW)) && ability == ABILITY_ICE_BODY) { - weatherImpact = maxHP / 16; + weatherImpact = -(maxHP / 16); if (weatherImpact == 0) - weatherImpact = 1; + weatherImpact = -1; } - - weatherDamage -= weatherImpact; } - return weatherDamage; + return weatherImpact; } // Gets one turn of recurring healing @@ -1499,6 +1494,7 @@ static u32 GetSwitchinStatusDamage(u32 battler) { if ((status & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns AI_DATA->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); + statusDamage = maxHP / 16; statusDamage *= AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8; if (statusDamage == 0) statusDamage = 1; @@ -1566,7 +1562,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) // If mon is still alive, apply weather impact first, as it might KO the mon before it can heal with its item (order is weather -> item -> status) if (currentHP != 0) - currentHP = currentHP + weatherImpact; + currentHP = currentHP - weatherImpact; // Check if we're at a single use healing item threshold if (AI_DATA->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE From 3a1b4951c61bddd5be77bfc3116712dc0a2916d0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 15 May 2024 14:48:10 -0400 Subject: [PATCH 07/34] Added missing Move Effect TODO tests - Volume A (#4569) * Added missing TODO tests - Volume A * Update test/battle/move_effect/autotomize.c --------- Co-authored-by: Bassoonian --- test/battle/move_effect/absorb.c | 3 + test/battle/move_effect/accuracy_down.c | 2 +- test/battle/move_effect/accuracy_down_2.c | 4 ++ test/battle/move_effect/accuracy_up.c | 4 ++ test/battle/move_effect/accuracy_up_2.c | 4 ++ test/battle/move_effect/acrobatics.c | 5 ++ test/battle/move_effect/acupressure.c | 59 +++++++++++++++++++ test/battle/move_effect/after_you.c | 3 + test/battle/move_effect/ally_switch.c | 31 ++-------- test/battle/move_effect/aqua_ring.c | 6 ++ test/battle/move_effect/aromatic_mist.c | 5 ++ test/battle/move_effect/assist.c | 12 ++++ test/battle/move_effect/assurance.c | 8 +++ test/battle/move_effect/attack_accuracy_up.c | 4 ++ test/battle/move_effect/attack_down.c | 2 +- test/battle/move_effect/attack_down_2.c | 32 ++++++++++ test/battle/move_effect/attack_spatk_up.c | 39 ++++++++++++ test/battle/move_effect/attack_up.c | 2 +- test/battle/move_effect/attack_up_2.c | 32 ++++++++++ test/battle/move_effect/attack_up_user_ally.c | 4 +- test/battle/move_effect/attract.c | 7 +++ test/battle/move_effect/aura_wheel.c | 2 + test/battle/move_effect/autotomize.c | 12 ++++ 23 files changed, 250 insertions(+), 32 deletions(-) create mode 100644 test/battle/move_effect/accuracy_down_2.c create mode 100644 test/battle/move_effect/accuracy_up.c create mode 100644 test/battle/move_effect/accuracy_up_2.c create mode 100644 test/battle/move_effect/acrobatics.c create mode 100644 test/battle/move_effect/acupressure.c create mode 100644 test/battle/move_effect/aqua_ring.c create mode 100644 test/battle/move_effect/aromatic_mist.c create mode 100644 test/battle/move_effect/assurance.c create mode 100644 test/battle/move_effect/attack_accuracy_up.c create mode 100644 test/battle/move_effect/attack_down_2.c create mode 100644 test/battle/move_effect/attack_spatk_up.c create mode 100644 test/battle/move_effect/attack_up_2.c create mode 100644 test/battle/move_effect/attract.c create mode 100644 test/battle/move_effect/autotomize.c diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 9ef63079f3..b0140a7a65 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -68,3 +68,6 @@ DOUBLE_BATTLE_TEST("Matcha Gatcha recovers 50% of the damage dealt from both tar EXPECT_MUL_EQ(damageRight, Q_4_12(-0.5), healedRight); } } + +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 diff --git a/test/battle/move_effect/accuracy_down.c b/test/battle/move_effect/accuracy_down.c index 0eccd65f22..a4a8ad49bf 100644 --- a/test/battle/move_effect/accuracy_down.c +++ b/test/battle/move_effect/accuracy_down.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(gMovesInfo[MOVE_SAND_ATTACK].effect == EFFECT_ACCURACY_DOWN); } -SINGLE_BATTLE_TEST("Sand Attack lowers Accuracy") +SINGLE_BATTLE_TEST("Sand Attack lowers Accuracy by 1 stage") { ASSUME(gMovesInfo[MOVE_SCRATCH].accuracy == 100); PASSES_RANDOMLY(gMovesInfo[MOVE_SCRATCH].accuracy * 3 / 4, 100, RNG_ACCURACY); diff --git a/test/battle/move_effect/accuracy_down_2.c b/test/battle/move_effect/accuracy_down_2.c new file mode 100644 index 0000000000..fe680af286 --- /dev/null +++ b/test/battle/move_effect/accuracy_down_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// There are no moves with EFFECT_ACCURACY_DOWN_2's effect ^^; diff --git a/test/battle/move_effect/accuracy_up.c b/test/battle/move_effect/accuracy_up.c new file mode 100644 index 0000000000..535f18c6cf --- /dev/null +++ b/test/battle/move_effect/accuracy_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// There are no moves with EFFECT_ACCURACY_UP's effect ^^; diff --git a/test/battle/move_effect/accuracy_up_2.c b/test/battle/move_effect/accuracy_up_2.c new file mode 100644 index 0000000000..9a2e66bd03 --- /dev/null +++ b/test/battle/move_effect/accuracy_up_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// There are no moves with EFFECT_ACCURACY_UP_2's effect ^^; diff --git a/test/battle/move_effect/acrobatics.c b/test/battle/move_effect/acrobatics.c new file mode 100644 index 0000000000..bc34719a42 --- /dev/null +++ b/test/battle/move_effect/acrobatics.c @@ -0,0 +1,5 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Acrobatics doubles in power if the user has no held item"); +TO_DO_BATTLE_TEST("Acrobatics still doubles in power when Flying Gem is consumed"); diff --git a/test/battle/move_effect/acupressure.c b/test/battle/move_effect/acupressure.c new file mode 100644 index 0000000000..e7254485fc --- /dev/null +++ b/test/battle/move_effect/acupressure.c @@ -0,0 +1,59 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Acupressure increases one of two stats by 2 stages at random"); +TO_DO_BATTLE_TEST("Acupressure doesn't try to increase a stat that has been maximized"); +TO_DO_BATTLE_TEST("Acupressure fails on the user if all of its stats are maximized"); +TO_DO_BATTLE_TEST("Acupressure fails on the ally if all of its stats are maximized"); +TO_DO_BATTLE_TEST("Acupressure works on the user if it's behind a Substitute (Gen5+)"); +TO_DO_BATTLE_TEST("Acupressure fails on its ally if it's behind a Substitute"); + +DOUBLE_BATTLE_TEST("Acupressure works on the ally if the user targeted itself but switched positions via Ally Switch") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_KADABRA); + OPPONENT(SPECIES_ABRA); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(playerRight, MOVE_ACUPRESSURE, target:playerRight); } + } SCENE { + MESSAGE("Wobbuffet used Ally Switch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); + MESSAGE("Wobbuffet and Wynaut switched places!"); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ACUPRESSURE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + NOT MESSAGE("But it failed!"); + } +} + +DOUBLE_BATTLE_TEST("Acupressure fails on the user if it targeted its ally but switched positions via Ally Switch") +{ + KNOWN_FAILING; // Tested in Gen 5, Acupressure fails here + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_KADABRA); + OPPONENT(SPECIES_ABRA); + } WHEN { + TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(playerRight, MOVE_ACUPRESSURE, target:playerLeft); } + } SCENE { + MESSAGE("Wobbuffet used Ally Switch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); + MESSAGE("Wobbuffet and Wynaut switched places!"); + + MESSAGE("But it failed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ACUPRESSURE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + } + } +} + +TO_DO_BATTLE_TEST("Acupressure works on the user if its side is protected by Crafty Shield"); +TO_DO_BATTLE_TEST("Acupressure fails on the ally if its side is protected by Crafty Shield"); + +// Triple Battles required to test +//TO_DO_BATTLE_TEST("Acupressure works on the ally if the user targeted itself but switched positions via Triple Battle shift before execution"); +//TO_DO_BATTLE_TEST("Acupressure fails on the user if it targeted its ally but switched positions via Triple Battle shift before execution"); diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index 91830abffd..fa6e47e0e2 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -51,3 +51,6 @@ DOUBLE_BATTLE_TEST("After You does nothing if the target has already moved") ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); } } + +TO_DO_BATTLE_TEST("After You doesn't fail if the turner remains the same after After You (Gen8+)"); +TO_DO_BATTLE_TEST("After You ignores the effects of Quash"); diff --git a/test/battle/move_effect/ally_switch.c b/test/battle/move_effect/ally_switch.c index 1f07859c82..b3e902fc79 100644 --- a/test/battle/move_effect/ally_switch.c +++ b/test/battle/move_effect/ally_switch.c @@ -115,7 +115,7 @@ DOUBLE_BATTLE_TEST("Ally Switch does not redirect moves done by pokemon with Sta } } -DOUBLE_BATTLE_TEST("Ally Switch has no effect on parnter's chosen move") +DOUBLE_BATTLE_TEST("Ally Switch has no effect on partner's chosen move") { u16 chosenMove; struct BattlePokemon *chosenTarget = NULL; @@ -167,32 +167,6 @@ DOUBLE_BATTLE_TEST("Ally Switch - move fails if the target was ally which change } } -// Verified on Showdown, even though Bulbapedia says otherwise. -DOUBLE_BATTLE_TEST("Acupressure works after ally used Ally Switch") -{ - struct BattlePokemon *battlerTarget = NULL; - - PARAMETRIZE { battlerTarget = playerLeft; } - PARAMETRIZE { battlerTarget = playerRight; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_KADABRA); - OPPONENT(SPECIES_ABRA); - } WHEN { - TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); MOVE(playerRight, MOVE_ACUPRESSURE, target:battlerTarget); } - } SCENE { - MESSAGE("Wobbuffet used Ally Switch!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_ALLY_SWITCH, playerLeft); - MESSAGE("Wobbuffet and Wynaut switched places!"); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_ACUPRESSURE); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, battlerTarget); - NOT MESSAGE("But it failed!"); - } -} - DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter") { GIVEN { @@ -228,3 +202,6 @@ DOUBLE_BATTLE_TEST("Ally Switch works if ally used two-turn move like Dig") HP_BAR(opponentRight); } } + +// Triple Battles required to test +//TO_DO_BATTLE_TEST("Ally Switch fails if the user is in the middle of the field in a Triple Battle"); diff --git a/test/battle/move_effect/aqua_ring.c b/test/battle/move_effect/aqua_ring.c new file mode 100644 index 0000000000..c31bfbd8df --- /dev/null +++ b/test/battle/move_effect/aqua_ring.c @@ -0,0 +1,6 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Aqua Ring recovers 1/16th HP at end of turn"); +TO_DO_BATTLE_TEST("Aqua Ring can be used under Heal Block but will not heal the user"); +TO_DO_BATTLE_TEST("Aqua Ring can be Baton Passed"); diff --git a/test/battle/move_effect/aromatic_mist.c b/test/battle/move_effect/aromatic_mist.c new file mode 100644 index 0000000000..516ed14f16 --- /dev/null +++ b/test/battle/move_effect/aromatic_mist.c @@ -0,0 +1,5 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Aromatic Mist raises Sp. Defense of a target ally by 1 stage"); +TO_DO_BATTLE_TEST("Aromatic Mist fails in Single Battles"); diff --git a/test/battle/move_effect/assist.c b/test/battle/move_effect/assist.c index cbd73b2857..0c9a0b6128 100644 --- a/test/battle/move_effect/assist.c +++ b/test/battle/move_effect/assist.c @@ -6,6 +6,18 @@ ASSUMPTIONS ASSUME(gMovesInfo[MOVE_ASSIST].effect == EFFECT_ASSIST); } +TO_DO_BATTLE_TEST("Assist randomly calls a move from any party member"); +TO_DO_BATTLE_TEST("Assist counts all instances of the same move as separate"); +TO_DO_BATTLE_TEST("Assist can call moves with no PP left"); +TO_DO_BATTLE_TEST("Assist can call moves from a fainted party member"); +TO_DO_BATTLE_TEST("Assist can call moves that are blocked to its partners"); // Eg. double battle parter blocked by Disable +TO_DO_BATTLE_TEST("Assist can only call the original moves of a Transformed partner (Gen4 only)"); +TO_DO_BATTLE_TEST("Assist can only call the current moves of a Transformed partner (Gen5+)"); +TO_DO_BATTLE_TEST("Assist cannot call a Mimicked move (Gen4 only)"); +TO_DO_BATTLE_TEST("Assist can call a Mimicked move but not the original Mimic (Gen5+)"); +TO_DO_BATTLE_TEST("Assist can call moves in unhatched Eggs (Gen5 only)"); +TO_DO_BATTLE_TEST("Assist can be used by wild Pokémon in Wild Double Battles, even if the partner faints"); + SINGLE_BATTLE_TEST("Assist fails if there are no valid moves to choose from") { GIVEN { diff --git a/test/battle/move_effect/assurance.c b/test/battle/move_effect/assurance.c new file mode 100644 index 0000000000..e6cbf72b9f --- /dev/null +++ b/test/battle/move_effect/assurance.c @@ -0,0 +1,8 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Recoil"); +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Life Orb"); +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Crash"); +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Confusion"); +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Rocky Helmet"); diff --git a/test/battle/move_effect/attack_accuracy_up.c b/test/battle/move_effect/attack_accuracy_up.c new file mode 100644 index 0000000000..025a0cb86f --- /dev/null +++ b/test/battle/move_effect/attack_accuracy_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Hone Claws increases Attack and Accuracy by one stage each"); diff --git a/test/battle/move_effect/attack_down.c b/test/battle/move_effect/attack_down.c index e9b3a7c23e..457d122281 100644 --- a/test/battle/move_effect/attack_down.c +++ b/test/battle/move_effect/attack_down.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); } -SINGLE_BATTLE_TEST("Growl lowers Attack", s16 damage) +SINGLE_BATTLE_TEST("Growl lowers Attack by 1 stage", s16 damage) { bool32 lowerAttack; PARAMETRIZE { lowerAttack = FALSE; } diff --git a/test/battle/move_effect/attack_down_2.c b/test/battle/move_effect/attack_down_2.c new file mode 100644 index 0000000000..7b62294a76 --- /dev/null +++ b/test/battle/move_effect/attack_down_2.c @@ -0,0 +1,32 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_CHARM].effect == EFFECT_ATTACK_DOWN_2); +} + +SINGLE_BATTLE_TEST("Charm lowers Attack by 2 stages", s16 damage) +{ + bool32 lowerAttack; + PARAMETRIZE { lowerAttack = FALSE; } + PARAMETRIZE { lowerAttack = TRUE; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (lowerAttack) TURN { MOVE(player, MOVE_CHARM); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + if (lowerAttack) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHARM, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("Foe Wobbuffet's Attack harshly fell!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[1].damage, Q_4_12(2.0), results[0].damage); + } +} diff --git a/test/battle/move_effect/attack_spatk_up.c b/test/battle/move_effect/attack_spatk_up.c new file mode 100644 index 0000000000..b5aa2418a2 --- /dev/null +++ b/test/battle/move_effect/attack_spatk_up.c @@ -0,0 +1,39 @@ +#include "global.h" +#include "test/battle.h" + + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_WORK_UP].effect == EFFECT_ATTACK_SPATK_UP); +} + +SINGLE_BATTLE_TEST("Work Up raises Attack and Sp. Attack by 1 stage each", s16 damage) +{ + bool32 raiseStats; + u32 move; + PARAMETRIZE { raiseStats = FALSE; move = MOVE_TACKLE; } + PARAMETRIZE { raiseStats = TRUE; move = MOVE_TACKLE; } + PARAMETRIZE { raiseStats = FALSE; move = MOVE_SWIFT; } + PARAMETRIZE { raiseStats = TRUE; move = MOVE_SWIFT; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(gMovesInfo[MOVE_SWIFT].category == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (raiseStats) TURN { MOVE(player, MOVE_WORK_UP); } + TURN { MOVE(player, move); } + } SCENE { + if (raiseStats) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORK_UP, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Attack rose!"); + MESSAGE("Wobbuffet's Sp. Atk rose!"); + } + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[3].damage); + } +} diff --git a/test/battle/move_effect/attack_up.c b/test/battle/move_effect/attack_up.c index bf4b830370..da878fb60d 100644 --- a/test/battle/move_effect/attack_up.c +++ b/test/battle/move_effect/attack_up.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(gMovesInfo[MOVE_MEDITATE].effect == EFFECT_ATTACK_UP); } -SINGLE_BATTLE_TEST("Meditate raises Attack", s16 damage) +SINGLE_BATTLE_TEST("Meditate raises Attack by 1 stage", s16 damage) { bool32 raiseAttack; PARAMETRIZE { raiseAttack = FALSE; } diff --git a/test/battle/move_effect/attack_up_2.c b/test/battle/move_effect/attack_up_2.c new file mode 100644 index 0000000000..1f44efe9e3 --- /dev/null +++ b/test/battle/move_effect/attack_up_2.c @@ -0,0 +1,32 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); +} + +SINGLE_BATTLE_TEST("Swords Dance raises Attack by 2 stages", s16 damage) +{ + bool32 raiseAttack; + PARAMETRIZE { raiseAttack = FALSE; } + PARAMETRIZE { raiseAttack = TRUE; } + GIVEN { + ASSUME(gMovesInfo[MOVE_TACKLE].category == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (raiseAttack) TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + if (raiseAttack) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Attack sharply rose!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} diff --git a/test/battle/move_effect/attack_up_user_ally.c b/test/battle/move_effect/attack_up_user_ally.c index 706b6311a3..1d623c2bbd 100644 --- a/test/battle/move_effect/attack_up_user_ally.c +++ b/test/battle/move_effect/attack_up_user_ally.c @@ -6,7 +6,7 @@ ASSUMPTIONS ASSUME(gMovesInfo[MOVE_HOWL].effect == EFFECT_ATTACK_UP_USER_ALLY); } -SINGLE_BATTLE_TEST("Howl raises user's Attack", s16 damage) +SINGLE_BATTLE_TEST("Howl raises user's Attack by 1 stage", s16 damage) { bool32 raiseAttack; PARAMETRIZE { raiseAttack = FALSE; } @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Howl raises user's Attack", s16 damage) } } -DOUBLE_BATTLE_TEST("Howl raises user's and partner's Attack", s16 damageLeft, s16 damageRight) +DOUBLE_BATTLE_TEST("Howl raises user's and partner's Attack by 1 stage", s16 damageLeft, s16 damageRight) { bool32 raiseAttack; PARAMETRIZE { raiseAttack = FALSE; } diff --git a/test/battle/move_effect/attract.c b/test/battle/move_effect/attract.c new file mode 100644 index 0000000000..748a88a950 --- /dev/null +++ b/test/battle/move_effect/attract.c @@ -0,0 +1,7 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Attract causes the target to become infatuated with the user if they have opposite genders"); +TO_DO_BATTLE_TEST("Attract ignores type immunity"); +TO_DO_BATTLE_TEST("Attract bypasses Substitute"); +TO_DO_BATTLE_TEST("Attract fails if the target is already infatuated"); diff --git a/test/battle/move_effect/aura_wheel.c b/test/battle/move_effect/aura_wheel.c index 154065c281..fa4190dbdf 100644 --- a/test/battle/move_effect/aura_wheel.c +++ b/test/battle/move_effect/aura_wheel.c @@ -49,3 +49,5 @@ SINGLE_BATTLE_TEST("Aura Wheel changes type depending on Morpeko's form") MESSAGE("It's super effective!"); } } + +TO_DO_BATTLE_TEST("Aura Wheel can be used by Pokémon transformed into Morpeko"); diff --git a/test/battle/move_effect/autotomize.c b/test/battle/move_effect/autotomize.c new file mode 100644 index 0000000000..79a71ecbc7 --- /dev/null +++ b/test/battle/move_effect/autotomize.c @@ -0,0 +1,12 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Autotomize increases Speed by 2 stages"); +TO_DO_BATTLE_TEST("Autotomize decreases weight by 100kg (220 lbs.)"); +TO_DO_BATTLE_TEST("Autotomize can be used multiple times to decrease weight each time"); +TO_DO_BATTLE_TEST("Autotomize cannot decrease weight below 0.1kg (0.2 lbs)"); +TO_DO_BATTLE_TEST("Autotomize's weight reduction cannot be Baton Passed"); +TO_DO_BATTLE_TEST("Autotomize's weight reduction cannot be removed by Haze"); +TO_DO_BATTLE_TEST("Autotomize's weight reduction is reset upon form change (Gen6+)"); +TO_DO_BATTLE_TEST("Autotomize's weight reduction is reset upon switch"); +TO_DO_BATTLE_TEST("Autotomize's weight reduction is reset upon fainting"); From d235a716fe5c046c248ccb4f04a38ea31836a36d Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 15 May 2024 21:11:30 +0200 Subject: [PATCH 08/34] Add missing EOF newlines to species_info files (#4584) --- src/data/pokemon/species_info/gen_1_families.h | 2 +- src/data/pokemon/species_info/gen_2_families.h | 2 +- src/data/pokemon/species_info/gen_3_families.h | 2 +- src/data/pokemon/species_info/gen_4_families.h | 2 +- src/data/pokemon/species_info/gen_5_families.h | 2 +- src/data/pokemon/species_info/gen_6_families.h | 2 +- src/data/pokemon/species_info/gen_7_families.h | 2 +- src/data/pokemon/species_info/gen_8_families.h | 2 +- src/data/pokemon/species_info/shared_dex_text.h | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 9a553fee5e..5272aab860 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -15653,4 +15653,4 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index e9922c28ee..9a2b019cd1 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -6460,4 +6460,4 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index fb34fdc4af..2147acb002 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -9936,4 +9936,4 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index 8cdd112e7b..3b5e3a4189 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -5669,4 +5669,4 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 9de120bcd7..9a1b19c258 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -10404,4 +10404,4 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index ce1f1da228..d02992df66 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -5343,4 +5343,4 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index 13bba7cd01..fef7f30e2e 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -6160,4 +6160,4 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 4a09a672ff..3039b21702 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -6789,4 +6789,4 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = #ifdef __INTELLISENSE__ }; -#endif \ No newline at end of file +#endif diff --git a/src/data/pokemon/species_info/shared_dex_text.h b/src/data/pokemon/species_info/shared_dex_text.h index 0e48051537..dbfef82d74 100644 --- a/src/data/pokemon/species_info/shared_dex_text.h +++ b/src/data/pokemon/species_info/shared_dex_text.h @@ -279,4 +279,4 @@ const u8 gOgerponCornerstoneMaskPokedexText[] = _( "In this form, it draws on the power\n" "of stone. Its body is rock-solid,\n" "protecting it from all manner of\n" - "attacks."); \ No newline at end of file + "attacks."); From 6f12da0a67c13d2bfa5c522965ad30895e0cc294 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Thu, 16 May 2024 22:45:08 +0200 Subject: [PATCH 09/34] Fix special evolution triggering twice in certain situations (#4553) --- src/battle_main.c | 55 +++++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 38 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 46b633d3e8..413d50c585 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -115,7 +115,6 @@ static void HandleEndTurn_MonFled(void); static void HandleEndTurn_FinishBattle(void); static void SpriteCB_UnusedBattleInit(struct Sprite *sprite); static void SpriteCB_UnusedBattleInit_Main(struct Sprite *sprite); -static void TrySpecialEvolution(void); static u32 Crc32B (const u8 *data, u32 size); static u32 GeneratePartyHash(const struct Trainer *trainer, u32 i); @@ -5808,7 +5807,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) || gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT)) { - gBattleMainFunc = TrySpecialEvolution; + gBattleMainFunc = TryEvolvePokemon; } else { @@ -5826,61 +5825,41 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) } } -static void TrySpecialEvolution(void) // Attempts to perform non-level related battle evolutions (not the script command). +static void TryEvolvePokemon(void) { s32 i; for (i = 0; i < PARTY_SIZE; i++) { - u16 species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_SPECIAL, i, NULL); - if (species != SPECIES_NONE && !(sTriedEvolving & gBitTable[i])) + if (!(sTriedEvolving & gBitTable[i])) { + u16 species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_SPECIAL, i, NULL); sTriedEvolving |= gBitTable[i]; - FreeAllWindowBuffers(); - gBattleMainFunc = WaitForEvoSceneToFinish; - EvolutionScene(&gPlayerParty[i], species, TRUE, i); - return; - } - } - sTriedEvolving = 0; - gBattleMainFunc = TryEvolvePokemon; -} -static void TryEvolvePokemon(void) -{ - s32 i; + if (species == SPECIES_NONE && (gLeveledUpInBattle & gBitTable[i])) + { + gLeveledUpInBattle &= ~(gBitTable[i]); + species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_NORMAL, gLeveledUpInBattle, NULL); + } - while (gLeveledUpInBattle != 0) - { - for (i = 0; i < PARTY_SIZE; i++) - { - if (gLeveledUpInBattle & gBitTable[i]) + if (species != SPECIES_NONE) { - u16 species; - u8 levelUpBits = gLeveledUpInBattle; - - levelUpBits &= ~(gBitTable[i]); - gLeveledUpInBattle = levelUpBits; - - species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_NORMAL, levelUpBits, NULL); - if (species != SPECIES_NONE) - { - FreeAllWindowBuffers(); - gBattleMainFunc = WaitForEvoSceneToFinish; - EvolutionScene(&gPlayerParty[i], species, TRUE, i); - return; - } + FreeAllWindowBuffers(); + gBattleMainFunc = WaitForEvoSceneToFinish; + EvolutionScene(&gPlayerParty[i], species, TRUE, i); + return; } } } - + sTriedEvolving = 0; + gLeveledUpInBattle = 0; gBattleMainFunc = ReturnFromBattleToOverworld; } static void WaitForEvoSceneToFinish(void) { if (gMain.callback2 == BattleMainCB2) - gBattleMainFunc = TrySpecialEvolution; + gBattleMainFunc = TryEvolvePokemon; } static void ReturnFromBattleToOverworld(void) From 635db6312c6ae59ff36fd86c8ee1d680f81cf567 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 17 May 2024 00:41:55 +0200 Subject: [PATCH 10/34] AI respects partner when using spread moves in double battles (#4518) * Fixes Earthquake AI in double battles * earthquake_ai_fix * Use CompareDamagingMoves to fix spread damage issue --- include/constants/battle_move_effects.h | 1 - src/battle_ai_main.c | 37 +++++++------ src/battle_ai_util.c | 10 ++-- src/battle_util.c | 1 - src/data/battle_move_effects.h | 6 -- src/data/moves_info.h | 2 +- test/battle/ai.c | 73 +++++++++++++++++++++++++ test/battle/terrain/grassy.c | 2 +- 8 files changed, 101 insertions(+), 31 deletions(-) diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index d2ad1afdbc..b19bc0f7b1 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -191,7 +191,6 @@ enum { EFFECT_ROUND, EFFECT_BRINE, EFFECT_RETALIATE, - EFFECT_BULLDOZE, EFFECT_FOUL_PLAY, EFFECT_PSYSHOCK, EFFECT_ROOST, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 6f79042a0b..6d9a7cacde 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -423,7 +423,7 @@ static void SetBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u3 // Simulate dmg for both ai controlled mons and for player controlled mons. for (battlerDef = 0; battlerDef < battlersCount; battlerDef++) { - if (battlerAtk == battlerDef) + if (battlerAtk == battlerDef || !IsBattlerAlive(battlerDef)) continue; SaveBattlerData(battlerDef); @@ -3028,21 +3028,6 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (IsAbilityOfRating(aiData->abilities[battlerAtk], 0) || IsAbilityOfRating(aiData->abilities[battlerDef], 10)) ADJUST_SCORE(DECENT_EFFECT); // we want to transfer our bad ability or take their awesome ability break; - case EFFECT_EARTHQUAKE: - case EFFECT_MAGNITUDE: - if (!IsBattlerGrounded(battlerAtkPartner) - || (IsBattlerGrounded(battlerAtkPartner) - && AI_WhoStrikesFirst(battlerAtk, battlerAtkPartner, move) == AI_IS_SLOWER - && IsUngroundingEffect(gMovesInfo[aiData->partnerMove].effect))) - ADJUST_SCORE(DECENT_EFFECT); - else if (IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_FIRE) - || IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_ELECTRIC) - || IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_POISON) - || IS_BATTLER_OF_TYPE(battlerAtkPartner, TYPE_ROCK)) - ADJUST_SCORE(-10); // partner will be hit by earthquake and is weak to it - else if (IsBattlerAlive(battlerAtkPartner)) - ADJUST_SCORE(-3); - break; } // lightning rod, flash fire against enemy handled in AI_CheckBadMove @@ -3082,6 +3067,18 @@ static s32 CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, return 0; } +static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 moveIndex, u32 hitsToFaintOpposingBattler) +{ + u32 partnerBattler = BATTLE_PARTNER(battlerAtk); + u32 noOfHitsToFaintPartner = GetNoOfHitsToKOBattler(battlerAtk, partnerBattler, moveIndex); + return (IsDoubleBattle() + && noOfHitsToFaintPartner != 0 // Immunity check + && IsBattlerAlive(partnerBattler) + && gMovesInfo[move].target == MOVE_TARGET_FOES_AND_ALLY + && !(noOfHitsToFaintPartner < 4 && hitsToFaintOpposingBattler == 1) + && noOfHitsToFaintPartner < 7); +} + static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) { u32 i; @@ -3099,7 +3096,13 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) if (moves[i] != MOVE_NONE && gMovesInfo[moves[i]].power) { noOfHits[i] = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, i); - if (noOfHits[i] < leastHits && noOfHits[i] != 0) + if (ShouldUseSpreadDamageMove(battlerAtk,moves[i], i, noOfHits[i])) + { + noOfHits[i] = -1; + viableMoveScores[i] = 0; + isTwoTurnNotSemiInvulnerableMove[i] = FALSE; + } + else if (noOfHits[i] < leastHits && noOfHits[i] != 0) { leastHits = noOfHits[i]; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 02e6c6151b..b99339d16e 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -371,14 +371,17 @@ bool32 IsDamageMoveUnusable(u32 move, u32 battlerAtk, u32 battlerDef) s32 moveType; struct AiLogicData *aiData = AI_DATA; u32 battlerDefAbility; + GET_MOVE_TYPE(move, moveType); if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) battlerDefAbility = ABILITY_NONE; else battlerDefAbility = aiData->abilities[battlerDef]; - SetTypeBeforeUsingMove(move, battlerAtk); - GET_MOVE_TYPE(move, moveType); + // Battler doesn't see partners Ability for some reason. + // This is a small hack to avoid the issue but should be investigated + if (battlerDef == BATTLE_PARTNER(battlerAtk)) + battlerDefAbility = GetBattlerAbility(battlerDef); switch (battlerDefAbility) { @@ -472,14 +475,13 @@ s32 AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectivenes gBattleStruct->dynamicMoveType = 0; - SetTypeBeforeUsingMove(move, battlerAtk); GET_MOVE_TYPE(move, moveType); + effectivenessMultiplier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, aiData->abilities[battlerDef], FALSE); if (gMovesInfo[move].power) isDamageMoveUnusable = IsDamageMoveUnusable(move, battlerAtk, battlerDef); - effectivenessMultiplier = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, aiData->abilities[battlerDef], FALSE); if (gMovesInfo[move].power && !isDamageMoveUnusable) { s32 critChanceIndex, normalDmg, fixedBasePower, n; diff --git a/src/battle_util.c b/src/battle_util.c index 64cba43782..8cda4c4ecc 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8846,7 +8846,6 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 if (gBattleStruct->lastMoveFailed & gBitTable[battlerAtk]) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; - case EFFECT_BULLDOZE: case EFFECT_MAGNITUDE: case EFFECT_EARTHQUAKE: if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !(gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)) diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index d0dc94afff..9c53f50396 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1228,12 +1228,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_BULLDOZE] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_FOUL_PLAY] = { .battleScript = BattleScript_EffectHit, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 87edd20d9e..fa11b510e1 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -12504,7 +12504,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_DYNAMAX] = .description = COMPOUND_STRING( "Stomps down on the ground.\n" "Lowers Speed."), - .effect = EFFECT_BULLDOZE, + .effect = EFFECT_EARTHQUAKE, .power = 60, .type = TYPE_GROUND, .accuracy = 100, diff --git a/test/battle/ai.c b/test/battle/ai.c index 11702a0c5a..28e541befd 100644 --- a/test/battle/ai.c +++ b/test/battle/ai.c @@ -882,3 +882,76 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") } } } + +AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner") +{ + u32 species; + + PARAMETRIZE { species = SPECIES_CHARIZARD; } + PARAMETRIZE { species = SPECIES_CHARMANDER; } + PARAMETRIZE { species = SPECIES_CHIKORITA; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PHANPY) { Moves(MOVE_EARTHQUAKE, MOVE_TACKLE); } + OPPONENT(species) { Moves(MOVE_CELEBRATE); } + } WHEN { + if (species == SPECIES_CHARIZARD) + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_TACKLE, target: playerLeft); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if partner is not alive") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_TACKLE); } + OPPONENT(SPECIES_PIKACHU) { HP(1); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentRight); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kill an opposing mon and does 1/3 of damage to AI") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_EARTHQUAKE].target == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_TACKLE); } + OPPONENT(SPECIES_PARAS) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will the see a corresponding absorbing ability on partner to one of its moves") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; } + PARAMETRIZE { ability = ABILITY_STATIC; } + + GIVEN { + ASSUME(gMovesInfo[MOVE_DISCHARGE].target == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_DISCHARGE, MOVE_TACKLE); } + OPPONENT(SPECIES_PIKACHU) { HP(1); Ability(ability); Moves(MOVE_CELEBRATE); } + } WHEN { + if (ability == ABILITY_LIGHTNING_ROD) + TURN { EXPECT_MOVE(opponentLeft, MOVE_DISCHARGE); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_TACKLE); } + } +} diff --git a/test/battle/terrain/grassy.c b/test/battle/terrain/grassy.c index 1cb846dd41..af0776d3df 100644 --- a/test/battle/terrain/grassy.c +++ b/test/battle/terrain/grassy.c @@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("Grassy Terrain decreases power of Earthquake and Bulldoze by PARAMETRIZE { terrain = TRUE; move = MOVE_BULLDOZE; } // 3 GIVEN { ASSUME(gMovesInfo[MOVE_EARTHQUAKE].effect == EFFECT_EARTHQUAKE); - ASSUME(gMovesInfo[MOVE_BULLDOZE].effect == EFFECT_BULLDOZE); + ASSUME(gMovesInfo[MOVE_BULLDOZE].effect == EFFECT_EARTHQUAKE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { From 982934c4aad64c75468e2ae6642cb74e50aa0944 Mon Sep 17 00:00:00 2001 From: sneed <56992013+Sneed69@users.noreply.github.com> Date: Sat, 18 May 2024 11:53:01 +0300 Subject: [PATCH 11/34] Pokedex Plus fixes (#4514) * Pokedex plus no longer allows browsing unseen evos * Restore "has no evolutions" printing * only print "has no evolution" text at 0 depth * Revert config changes * fix duplicate icons and removed eevee hardcodes * add new scope and indentation fixes * actually introduce new scope --- src/pokedex_plus_hgss.c | 198 +++++++++++++++++++++------------------- 1 file changed, 102 insertions(+), 96 deletions(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index abc1ba410a..15cfbc87a2 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -302,6 +302,7 @@ static const u32 sPokedexPlusHGSS_ScreenSearchNational_Tilemap[] = INCBIN_U32("g #define MAX_SEARCH_PARAM_CURSOR_POS (MAX_SEARCH_PARAM_ON_SCREEN - 1) #define MAX_MONS_ON_SCREEN 4 +#define MAX_EVOLUTION_ICONS 8 #define LIST_SCROLL_STEP 16 @@ -596,7 +597,7 @@ static void Task_LoadEvolutionScreen(u8 taskId); static void Task_HandleEvolutionScreenInput(u8 taskId); static void Task_SwitchScreensFromEvolutionScreen(u8 taskId); static void Task_ExitEvolutionScreen(u8 taskId); -static u8 PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, u8 depth_i); +static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, u32 *depth_i, u32 alreadyPrintedIcons[], u32 *icon_depth_i); static u8 PrintPreEvolutions(u8 taskId, u16 species); //Stat bars on scrolling screens static void TryDestroyStatBars(void); @@ -3874,18 +3875,18 @@ static void Task_LoadInfoScreen(u8 taskId) gMain.state++; break; case 6: - { - u32 preservedPalettes = 0; + { + u32 preservedPalettes = 0; - if (gTasks[taskId].tBgLoaded) - preservedPalettes = 0x14; // each bit represents a palette index - if (gTasks[taskId].tMonSpriteDone) - preservedPalettes |= (1 << (gSprites[gTasks[taskId].tMonSpriteId].oam.paletteNum + 16)); - BeginNormalPaletteFade(~preservedPalettes, 0, 16, 0, RGB_BLACK); - SetVBlankCallback(gPokedexVBlankCB); - gMain.state++; - } + if (gTasks[taskId].tBgLoaded) + preservedPalettes = 0x14; // each bit represents a palette index + if (gTasks[taskId].tMonSpriteDone) + preservedPalettes |= (1 << (gSprites[gTasks[taskId].tMonSpriteId].oam.paletteNum + 16)); + BeginNormalPaletteFade(~preservedPalettes, 0, 16, 0, RGB_BLACK); + SetVBlankCallback(gPokedexVBlankCB); + gMain.state++; break; + } case 7: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); @@ -4951,7 +4952,7 @@ static void Task_LoadStatsScreen(u8 taskId) gMain.state++; break; case 7: - { + { u32 preservedPalettes = 0; if (gTasks[taskId].data[2] != 0) @@ -4961,8 +4962,8 @@ static void Task_LoadStatsScreen(u8 taskId) BeginNormalPaletteFade(~preservedPalettes, 0, 16, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); gMain.state++; - } break; + } case 8: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); @@ -6078,20 +6079,29 @@ static void Task_LoadEvolutionScreen(u8 taskId) gMain.state++; break; case 4: + { + u32 alreadyPrintedIcons[MAX_EVOLUTION_ICONS] = {0}; + u32 depth = sPokedexView->numPreEvolutions; + u32 iconDepth = depth; //Print evo info and icons gTasks[taskId].data[3] = 0; - PrintEvolutionTargetSpeciesAndMethod(taskId, NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum), 0, sPokedexView->numPreEvolutions); + PrintEvolutionTargetSpeciesAndMethod(taskId, NationalPokedexNumToSpeciesHGSS(sPokedexListItem->dexNum), 0, &depth, alreadyPrintedIcons, &iconDepth); LoadSpritePalette(&gSpritePalette_Arrow); GetSeenFlagTargetSpecies(); - if (sPokedexView->sEvoScreenData.numAllEvolutions != 0 && sPokedexView->sEvoScreenData.numSeen != 0) + if (sPokedexView->sEvoScreenData.numAllEvolutions > 0 && sPokedexView->sEvoScreenData.numSeen > 0) { - sPokedexView->sEvoScreenData.arrowSpriteId = CreateSprite(&gSpriteTemplate_Arrow, 7, 58, 0); + u32 pos; + for (pos = 0; !sPokedexView->sEvoScreenData.seen[pos]; pos++) + ; + sPokedexView->sEvoScreenData.menuPos = pos; + sPokedexView->sEvoScreenData.arrowSpriteId = CreateSprite(&gSpriteTemplate_Arrow, 7, 58 + 9 * pos, 0); gSprites[sPokedexView->sEvoScreenData.arrowSpriteId].animNum = 2; } gMain.state++; break; + } case 5: - { + { u32 preservedPalettes = 0; if (gTasks[taskId].data[2] != 0) @@ -6101,8 +6111,8 @@ static void Task_LoadEvolutionScreen(u8 taskId) BeginNormalPaletteFade(~preservedPalettes, 0, 16, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); gMain.state++; - } break; + } case 6: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); @@ -6144,34 +6154,36 @@ static void Task_HandleEvolutionScreenInput(u8 taskId) PlaySE(SE_PIN); } - if (sPokedexView->sEvoScreenData.numAllEvolutions != 0 && sPokedexView->sEvoScreenData.numSeen != 0) + if (sPokedexView->sEvoScreenData.numAllEvolutions > 0 && sPokedexView->sEvoScreenData.numSeen > 0) { u8 base_y = 58; u8 base_y_offset = 9; u8 pos = sPokedexView->sEvoScreenData.menuPos; - u8 max = sPokedexView->sEvoScreenData.numAllEvolutions; + u8 max = sPokedexView->sEvoScreenData.numAllEvolutions - 1; if (JOY_NEW(DPAD_DOWN)) { - while (TRUE) + do { - pos += 1; - if (pos >= max) + if (pos < max) + pos++; + else pos = 0; - - if (sPokedexView->sEvoScreenData.seen[pos] == TRUE) - break; - } + } while (!sPokedexView->sEvoScreenData.seen[pos]); gSprites[sPokedexView->sEvoScreenData.arrowSpriteId].y = base_y + base_y_offset * pos; sPokedexView->sEvoScreenData.menuPos = pos; } else if (JOY_NEW(DPAD_UP)) { - if (sPokedexView->sEvoScreenData.menuPos == 0) - sPokedexView->sEvoScreenData.menuPos = sPokedexView->sEvoScreenData.numAllEvolutions - 1; - else - sPokedexView->sEvoScreenData.menuPos -= 1; + do + { + if (pos > 0) + pos--; + else + pos = max; + } while (!sPokedexView->sEvoScreenData.seen[pos]); - gSprites[sPokedexView->sEvoScreenData.arrowSpriteId].y = base_y + base_y_offset * sPokedexView->sEvoScreenData.menuPos; + gSprites[sPokedexView->sEvoScreenData.arrowSpriteId].y = base_y + base_y_offset * pos; + sPokedexView->sEvoScreenData.menuPos = pos; } if (JOY_NEW(A_BUTTON)) @@ -6227,10 +6239,9 @@ static void Task_HandleEvolutionScreenInput(u8 taskId) } } -static void HandleTargetSpeciesPrint(u8 taskId, u16 targetSpecies, u16 previousTargetSpecies, u8 base_x, u8 base_y, u8 base_y_offset, u8 base_i, bool8 isEevee) +static void HandleTargetSpeciesPrintText(u32 targetSpecies, u32 base_x, u32 base_y, u32 base_y_offset, u32 base_i) { - u8 iterations = 6; - bool8 seen = GetSetPokedexFlag(SpeciesToNationalPokedexNum(targetSpecies), FLAG_GET_SEEN); + bool32 seen = GetSetPokedexFlag(SpeciesToNationalPokedexNum(targetSpecies), FLAG_GET_SEEN); if (seen || !HGSS_HIDE_UNSEEN_EVOLUTION_NAMES) StringCopy(gStringVar3, GetSpeciesName(targetSpecies)); //evolution mon name @@ -6238,29 +6249,17 @@ static void HandleTargetSpeciesPrint(u8 taskId, u16 targetSpecies, u16 previousT StringCopy(gStringVar3, gText_ThreeQuestionMarks); //show questionmarks instead of name StringExpandPlaceholders(gStringVar3, sText_EVO_Name); //evolution mon name PrintInfoScreenTextSmall(gStringVar3, base_x, base_y + base_y_offset*base_i); //evolution mon name +} - //Print mon icon in the top row - if (isEevee) - { - iterations = 9; - if (targetSpecies == previousTargetSpecies) - return; - else if (targetSpecies == SPECIES_GLACEON) - base_i -= 1; - else if (targetSpecies == SPECIES_SYLVEON) - base_i -= 2; - } - - if (base_i < iterations) - { - u32 personality = GetPokedexMonPersonality(targetSpecies); - LoadMonIconPalettePersonality(targetSpecies, personality); //Loads pallete for current mon - if (isEevee) - gTasks[taskId].data[4+base_i] = CreateMonIcon(targetSpecies, SpriteCB_MonIcon, 45 + 26*base_i, 31, 4, personality); //Create pokemon sprite - else - gTasks[taskId].data[4+base_i] = CreateMonIcon(targetSpecies, SpriteCB_MonIcon, 50 + 32*base_i, 31, 4, personality); //Create pokemon sprite - gSprites[gTasks[taskId].data[4+base_i]].oam.priority = 0; - } +static void HandleTargetSpeciesPrintIcon(u8 taskId, u16 targetSpecies, u8 base_i, u8 iterations) +{ + u32 personality = GetPokedexMonPersonality(targetSpecies); + LoadMonIconPalettePersonality(targetSpecies, personality); //Loads pallete for current mon + if (iterations > 6) // Print icons closer to each other if there are many evolutions + gTasks[taskId].data[4+base_i] = CreateMonIcon(targetSpecies, SpriteCB_MonIcon, 45 + 26*base_i, 31, 4, personality); + else + gTasks[taskId].data[4+base_i] = CreateMonIcon(targetSpecies, SpriteCB_MonIcon, 50 + 32*base_i, 31, 4, personality); + gSprites[gTasks[taskId].data[4+base_i]].oam.priority = 0; } static void CreateCaughtBallEvolutionScreen(u16 targetSpecies, u8 x, u8 y, u16 unused) @@ -6417,12 +6416,11 @@ static u8 PrintPreEvolutions(u8 taskId, u16 species) #define EVO_SCREEN_CRITS_DIGITS 1 #define EVO_SCREEN_DMG_DIGITS 2 -static u8 PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, u8 depth_i) +static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, u32 *depth_i, u32 alreadyPrintedIcons[], u32 *icon_depth_i) { - u16 i; + int i; const struct MapHeader *mapHeader; u16 targetSpecies = 0; - u16 previousTargetSpecies = 0; u16 item; @@ -6431,21 +6429,25 @@ static u8 PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, u8 base_x_offset = 54+8; u8 base_y = 51; u8 base_y_offset = 9; - u8 base_i = 0; u8 times = 0; u8 depth_x = 16; - bool8 isEevee = FALSE; const struct Evolution *evolutions = GetSpeciesEvolutions(species); if (sPokedexView->sEvoScreenData.isMega) - return 0; - if (evolutions == NULL) - return 0; + return; StringCopy(gStringVar1, GetSpeciesName(species)); - if (species == SPECIES_EEVEE) - isEevee = TRUE; + //If there are no evolutions print text and return + if (evolutions == NULL) + { + if (depth == 0) + { + StringExpandPlaceholders(gStringVar4, sText_EVO_NONE); + PrintInfoScreenTextSmall(gStringVar4, base_x-7-7, base_y + base_y_offset*(*depth_i)); + } + return; + } //Calculate number of possible direct evolutions (e.g. Eevee has 5 but torchic has 1) for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) @@ -6456,24 +6458,29 @@ static u8 PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, gTasks[taskId].data[3] = times; sPokedexView->sEvoScreenData.numAllEvolutions += times; - //If there are no evolutions print text - if (times == 0 && depth == 0) - { - StringExpandPlaceholders(gStringVar4, sText_EVO_NONE); - PrintInfoScreenTextSmall(gStringVar4, base_x-7-7, base_y + base_y_offset*depth_i); - } - //If there are evolutions find out which and print them 1 by 1 for (i = 0; i < times; i++) { - base_i = i + depth_i; + int j; left = !left; - previousTargetSpecies = targetSpecies; targetSpecies = evolutions[i].targetSpecies; - sPokedexView->sEvoScreenData.targetSpecies[base_i] = targetSpecies; - CreateCaughtBallEvolutionScreen(targetSpecies, base_x + depth_x*depth-9, base_y + base_y_offset*base_i, 0); - HandleTargetSpeciesPrint(taskId, targetSpecies, previousTargetSpecies, base_x + depth_x*depth, base_y, base_y_offset, base_i, isEevee); //evolution mon name + sPokedexView->sEvoScreenData.targetSpecies[*depth_i] = targetSpecies; + CreateCaughtBallEvolutionScreen(targetSpecies, base_x + depth_x*depth-9, base_y + base_y_offset*(*depth_i), 0); + HandleTargetSpeciesPrintText(targetSpecies, base_x + depth_x*depth, base_y, base_y_offset, *depth_i); //evolution mon name + + for (j = 0; j < MAX_EVOLUTION_ICONS; j++) + { + if (alreadyPrintedIcons[j] == targetSpecies) + break; + if (alreadyPrintedIcons[j] == SPECIES_NONE) + { + HandleTargetSpeciesPrintIcon(taskId, targetSpecies, *icon_depth_i, times); + alreadyPrintedIcons[j] = targetSpecies; + (*icon_depth_i)++; + break; + } + } switch (evolutions[i].method) { @@ -6665,12 +6672,11 @@ static u8 PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, StringExpandPlaceholders(gStringVar4, sText_EVO_UNKNOWN ); break; }//Switch end - PrintInfoScreenTextSmall(gStringVar4, base_x + depth_x*depth+base_x_offset, base_y + base_y_offset*base_i); //Print actual instructions + PrintInfoScreenTextSmall(gStringVar4, base_x + depth_x*depth+base_x_offset, base_y + base_y_offset*(*depth_i)); //Print actual instructions - depth_i += PrintEvolutionTargetSpeciesAndMethod(taskId, targetSpecies, depth+1, base_i+1); + (*depth_i)++; + PrintEvolutionTargetSpeciesAndMethod(taskId, targetSpecies, depth+1, depth_i, alreadyPrintedIcons, icon_depth_i); }//For loop end - - return times; } static void Task_SwitchScreensFromEvolutionScreen(u8 taskId) @@ -6792,7 +6798,7 @@ static void Task_LoadFormsScreen(u8 taskId) gMain.state++; break; case 5: - { + { u32 preservedPalettes = 0; if (gTasks[taskId].data[2] != 0) @@ -6802,8 +6808,8 @@ static void Task_LoadFormsScreen(u8 taskId) BeginNormalPaletteFade(~preservedPalettes, 0, 16, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); gMain.state++; - } break; + } case 6: SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); @@ -7082,7 +7088,7 @@ static void Task_LoadCryScreen(u8 taskId) gMain.state++; break; case 6: - { + { struct CryScreenWindow waveformWindow; waveformWindow.unk0 = 0x4020; @@ -7095,10 +7101,10 @@ static void Task_LoadCryScreen(u8 taskId) gMain.state++; gDexCryScreenState = 0; } - } break; + } case 7: - { + { struct CryScreenWindow cryMeter; cryMeter.paletteNo = 9; @@ -7112,8 +7118,8 @@ static void Task_LoadCryScreen(u8 taskId) CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); - } break; + } case 8: BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); @@ -7252,15 +7258,15 @@ static void Task_LoadSizeScreen(u8 taskId) gMain.state++; break; case 3: - { - u8 string[64]; + { + u8 string[64]; - StringCopy(string, gText_SizeComparedTo); - StringAppend(string, gSaveBlock2Ptr->playerName); - PrintInfoScreenText(string, GetStringCenterAlignXOffset(FONT_NORMAL, string, 0xF0), 0x79); - gMain.state++; - } + StringCopy(string, gText_SizeComparedTo); + StringAppend(string, gSaveBlock2Ptr->playerName); + PrintInfoScreenText(string, GetStringCenterAlignXOffset(FONT_NORMAL, string, 0xF0), 0x79); + gMain.state++; break; + } case 4: ResetPaletteFade(); gMain.state++; From a28ee83b06ac80a53b1476880ceecd148029eaf6 Mon Sep 17 00:00:00 2001 From: Cafei <46283144+cafei-uh@users.noreply.github.com> Date: Sat, 18 May 2024 19:07:27 +0400 Subject: [PATCH 12/34] sawsbuck sprites (#4592) --- graphics/pokemon/sawsbuck/autumn/anim_front.png | Bin 0 -> 1407 bytes graphics/pokemon/sawsbuck/autumn/front.png | Bin 914 -> 0 bytes graphics/pokemon/sawsbuck/summer/anim_front.png | Bin 0 -> 1254 bytes graphics/pokemon/sawsbuck/summer/front.png | Bin 842 -> 0 bytes graphics/pokemon/sawsbuck/winter/anim_front.png | Bin 0 -> 1187 bytes graphics/pokemon/sawsbuck/winter/front.png | Bin 766 -> 0 bytes src/data/graphics/pokemon.h | 6 +++--- 7 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 graphics/pokemon/sawsbuck/autumn/anim_front.png delete mode 100644 graphics/pokemon/sawsbuck/autumn/front.png create mode 100644 graphics/pokemon/sawsbuck/summer/anim_front.png delete mode 100644 graphics/pokemon/sawsbuck/summer/front.png create mode 100644 graphics/pokemon/sawsbuck/winter/anim_front.png delete mode 100644 graphics/pokemon/sawsbuck/winter/front.png diff --git a/graphics/pokemon/sawsbuck/autumn/anim_front.png b/graphics/pokemon/sawsbuck/autumn/anim_front.png new file mode 100644 index 0000000000000000000000000000000000000000..91d0c0ef30b12ed1d06d6b78ac5b0964da8422bd GIT binary patch literal 1407 zcmV-_1%UdAP)Px#Fi=cXMVQc_fFLkf7#I)`5V$xvNDv6vz-TZK5MVeUKp+r!STH~!7@&Aa*pMjL z*x0D3sPfqP;Q#;x{YgYYRA_8p#Btr!FYKGJr=}(!p5eR4N#AO zc>|PA02l%$1QokUA14v;>h-D{q0}fm&mW8d8h%5dB7T@cR=p4o*miv!6+pi1AgXx0 z=^z3aICRax$<`yN#OGX@K#A}o;MT|ZE+I@o{0e^2>H~}=h^MQE40sWQQ92BEVgwMa z?BYqhurcsp1hoRJg|d@+!;sdH5DdlwCt=ND7y#Kc8;m25vwZ2OVl2)Y-w&ZLsT1}w zU=Jx!^l`|aP$4X&pk&{37lxYqGQ@#&!?YWC8}mD_GZKH>10eriqPqkiFU3&;zv0ha zCE$k>pdCrsMj^%96ApWu8Zc^s%G-wV#++CfV2^MMC8&6BZifMAl>NpJ4mjM$rxZMf z=5l8sl`JEgx(87Bh4Y!`f`#HXMX%0k;PI196Rz_D@X<_wtQwjsLqKd0@LV!SLVyQw znw?Rgxmtf<&y!mrxj5%|mMr{4`f_16;wu0GgK|ZJyq^@D2vYLS&>G_`5Q=%T_%jwr z0Hby6m3n*{!o|^7N#HC3f%dIw56EnyJtYT(EbzBuPOwxvz8q~Uy#mI$$&W3^WBn&C z?Ga#B|7LhWzzJ~YEx5B$?M|nHfzgyjOu%6LeaFk^`Gi$aI}+fwSJop76B1W8c4Uaa z{}&ZMtkWKd00&nDz;)$-r4>O02m}JqLUgd200R&a031yp&{AImFaczjg>=2ad=hpE zKH$XwBDl9wi1Qu(I|)@5XOMep29%b zY$Uuu=m9E)0Lecj#5)3^^bf%v#7y0jL1_I$G!XRspH4x8>U;hn7zi&QX6L59f5;7l zoc*;`%^9RQ^B|!fFCNe?SJ|Lje&E@3@qHKtMoD89oyb z&=nBNDZsxZAim-cS^@EJNz1`~fO*(vak0M}@In23er&8qlHXZHFCp3@Iki z)BXf^At)^j45P%m1;W_!2b8g$_IC{So}C}I>Sga>$$FoB-w#O+A+Z&bp%Om@F|1N1 z%!+4rnF>NXhX24Sm6>ZD0cn>U$sH3Qwq-L{x<{7uN>X;1cVbG|C09!6*-};jkd8F7 zD8agvRiHc=5#||x0o}20V}=4V0N3yrOu&r5V!%lQ*+Lm+b>5e@e7A{VrTtd&8~?QW zyuSumIz~YzDKxqV=iOZlo(+IYJ$^EL?W_U&I9o%i04l{ZQ?+jkU zrq=TjWWli#ubcs@pxD$O-{@Wd3)E;fZ1!=76u;@4uUhkMXLt&5;T#vo)1NmVMe>fv zs*?%<$CVWI^!Fbf!~h&lDMU&Dn=;pv+WmM9Fqsj+ct!0ibwAdx0C1uGUS$gi)&Zc^ zQ0nqAN%9C7&)U_=I&f2Jb#>*Bb({o>Fl)CN4llrUTP_+JEzXU3@-z*^kvP?(n1EL% zQdJPTnKYHJr&`Y<0>>hIt`l2cDg?BSJ`qO{cxFv2rTSw8ZeK=$j`S=`JX2^*1f~+7 z&2>pzyHn~)_2W|X?F*=Q>Sq&Kf#vuGDg%=Xz_6D0_(~OBD>pX&@^= zhS#bt9%I+N#z=wrojL5+)eQaPAHPt@C<08h)c}E;JDm^EP<;o-Os`f87>7@RsEt6d zN`Rd0Xoc-L0t?Y<>S-Pjg$M`{MMC>I0FA;TO2bGRc>qZ8IZD3|3H8H#-~o4_1dyrr oHhoz4N91kyMrEJPx#Fi=cXMVQc_7&s^p5D*B6Kp0ps*uZE=5C~v6Ab40XKp+^Pcu3fgDA?H8sHmtg z5D)+W08HD%xc~qJWJyFpRA_WOW0+m3w zT0%IemqpjQu6p9bQduAeC@-w5U{_=Gv@YwmmRQ(;;D!%yry(R`{R!x>B?N+H*tTtS z%>W78DLetm;NY7QK)hU0ktyJG zR;~m`7raUEUc?jL%h+;M11?Xu)W8ZF=%N?6#7Px6E_X%2+7uuRkpf=Ipyvif!H`rL zUb`^7N`iHbQF4X_!X3u!yR?q-+~6v7tyCfOvlI@9ff^{s>x0?0{6&eabQPYlE9_87 zK^Q7;q;hC{jm|O>4d6Q(Ds7yKpaNKHK?wZKzIEkYt`#q*pvc4l9G)P~frb_6L-1sQ z-6c33oZYPl4MF`v4onLjQw_rs35?!%JpdEV;qf4-JrBz~fN0$;fmQtJcFkor3uFQR zz`v)Ifqo`aV2pdg?oP`Dh?5fNersQ}guvO^6aYcs9!~_52~hhm{Gfhzz8NNK2*>LH z@MvLZ5nzjfdlp=>YMUq*tHq#qI4?p^h9I zf)3nE$jWdg3H2F7!s`-X34fkABLP^$MR2+!smRFoE*b)Y&Id35mh{?435ekc1aKTF z!N@yK1l0I}feHA348o`YWk3i7f)-BR^u~4>(V)95T)!{SZR3)`1KzsD4>aHrksBp z4g!yGg@I6kw;hDKfl%~C%Rwk-&q@V-sj3db@ciCz5c1k~7)Bg~U;xx|7;q3S10aVB zMF`P$5FQPHAqU~n0H`>%(VcG#G9E8Uavx1ke;nYExHUQ|;{&NR`4S>`En0FA=0QlTNSY*;+ z1L4_0cqlA4VLGf;74!;wV{k#6ZxCw)1kS193|v7zii= zIu;1O5U0DZ%RrD%-4O?(@DGB4z#d(9e6RTjK?MwaDpNl_`3F5XzY~xC!N~Mp`UmHX zf8ZU6Wc;U!e9J%J`G3|wNXCD3#|QpFHvX#vFe;!n{<8t_p?{E!|9`G8ju-v99UALGE^8vlcYP{Xh9j{jd@|BwG4ukRB~DxO`x09>R)8pjiU QssI2007*qoM6N<$f)!;Y{r~^~ literal 0 HcmV?d00001 diff --git a/graphics/pokemon/sawsbuck/summer/front.png b/graphics/pokemon/sawsbuck/summer/front.png deleted file mode 100644 index 96a0c150c48733c8a7165fd4b95aa0fadfebee02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmV-Q1GW5#P)8S%5XbknL2l4Fz6V&=Ir}a}BzqzRWe&fBQGm|Hg*ruiQMyFr#-xed z*rtpW0pS4>LC0&*(eW0{`s*Bj1V*~^?apui|JhmJGRD|QXG~`!R)=6*)B{}~k3eU} zcrq>~IO7X$3Mos*07nPVO~)G-i%qfZnIHj5U z!dixwB_x_IF-%I<4t^X+ORf(o#k*M*@eDCN4tjHW%<$qpF3(szkk`K8>1V`wayA64 z*56MrB%&AsaQ*WaMi>oQr1-(QTt!hjV4-2?`-#@rRTn#x`Q~zzaLX3ts z!Edf@RMAw>nuHWQ2e3Xx&eE%gDl@WJlS@_(McOLZzRLl`?22WQrFPT;o_tf=q&R<> z5f$N4t5EIWz5v#szU@%96g1VTBF<4(90}j!QYHN-X1vqs5=cU-eojd{>Gcp? z9ijr}{Y7j5-V0D7c?@`}ypNR7e*xWIv*f4*2-JoE`tVpOo%EcR+CdJ`Jtj|juDT=< zN_khMc#i|KV*(Pf`i_@%07*qoM6N<$g0c8@_y7O^ diff --git a/graphics/pokemon/sawsbuck/winter/anim_front.png b/graphics/pokemon/sawsbuck/winter/anim_front.png new file mode 100644 index 0000000000000000000000000000000000000000..2682758814924976a99e7b1ab77342d6087af45e GIT binary patch literal 1187 zcmV;U1YG-xP)Px#Fi=cXMVQc_XlQ6aNI)T>s5lY4zZ}qhGL7H%Q68`b1tPKr(mkw@k?qAP+G-+cG5fkSR9E0 zpa$(#!5EnmV|*Zt$VZ`pA$3WT^7{^P**FGz99qHqW%3EoZGnf*pq(P!>=f?=>@ANd zFr_*w>;As#Zk^<4y(TiP?NPiro`kYf0p-;dO z9B;JC0AAUY!d*e1j!Wy&%5KkT>zwZ`IyVE>Rt3*g4}k&vx{0_NKmib<1F$ZJ^458n z!xsY9T^7%}!rL^yCNu#Q0287pgpv1H0Yr%FooF!^0aac7Oi3?}Bhs;T05nxw2x)1P zH7+_n_r?k+RVHW~*S2ZHsbfZirlwN65(og=Ci?=w#TP{tGyr|S*M$Jr-VoTT1Mp1v z0MG+X1hi{_F6aOa2KfO2+OGLPFb+KnMuPxojOLTHXTsB6g7qFtz;&M=+aU5kw0%6q z8vY(%`#vJZdK7&af_6~mGjpsFpSMBL@eNlaexm%1Tw2WYS8fYC051n3Y4q#>=pF@~ zt>o8lJtY}m#pRc$dCKjEUd>njt=k(L7bjpR0Vcv8z)wER4#0oS4#Mgod6Z!xR0lz7 zAT$f%bP&V_0*zbCgW@1;twTHkn~Qj|Aoc+Nlm!6*&yv?NTMz&thylfdpoYPcJo_vM zsK^bM^KB-ST(63}TM#<|umzEi@64Q?0AjBCBY61~sOBJK3&n!i=>Y4k1s{&Q1AquQ zm-9dY$Snx)U?+VELAIv=-<4dZQmzRBWCnyP*$=thGByl|>OesDZ9fwm5bq8|mA@Gf z@y_aATAAv$2E335VHYsguG7Z4n$XEl84iPSXkyz9f$#710je2 z5!iuff>`|r2MzbE=bJV=5UovU`nKUOZB&KO9SEp}(x(Kl42TfVmBSB!UmEvW^hyBr z4p2{N_(6aXG8O<6;u_)CfcP~at^mIV#D8o+`~k}3KrX}IhwA_U002ovPDHLkV1h>x B0HXi^ literal 0 HcmV?d00001 diff --git a/graphics/pokemon/sawsbuck/winter/front.png b/graphics/pokemon/sawsbuck/winter/front.png deleted file mode 100644 index d97aa2a90d051bb39f34446fcceb9a0724b3e81d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmVF}5;Nne56y_*&-;;?mlwwVlU0tbr<-5G0ED)q zmWMnvgs^R;SY0Df36;XTu44eKAXnTcCV(}MbHJ2=vG?I7lSzLtBIy~kjV0744m%iG zP&W`3Q1*kd8^FjALeOnm0ffSogPpjJ6@*4vWeGX#(NjUYXx;?IE~QX_xdbnfU2p^% z0e(9au9#k$t4Q03^V^}hh&En*z+`OHtKV_`1I;C{>T3FXePw9K9KdP#7R?#h94Fpv zwWkD>0J9aoGXZ`F;Otjkq`o6O7b3aBv0ydO9w{I6JBVW!Y5<@;GjYms=>iM@qM8mM z-!|zHeFoabbiqD{t%aFj+2>*rxp!`n@H4~=uZx8J&;27HS$k(+w?LiFeR4*(G?j%? zD);`%Tg4blxhw*k8rpboove7cZnO<>2NVL(eJEg%2bkfCuH)VA5CaH&rLTVenJb{Q zSwtKuVEqa808gU}60R|h`?N00K-PMrJmU@ElmOVKWyFsr7E{T^E__oo Date: Sat, 18 May 2024 19:55:31 +0200 Subject: [PATCH 13/34] Fixed Elixir only being useable if the first move was missing PP (#4594) * Fixed Elixir only being useable is the first move was missing PP * Update restore_pp.c Commented out the test that doesn't actually test what it's supposed to due to current test system. --------- Co-authored-by: Hedara --- src/item_use.c | 4 ++-- test/battle/item_effect/restore_pp.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/item_use.c b/src/item_use.c index e711f8cd22..824b308524 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1254,11 +1254,11 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) cannotUse = TRUE; break; case EFFECT_ITEM_RESTORE_PP: - if (ItemId_GetEffect(itemId)[6] == ITEM4_HEAL_PP) + if (ItemId_GetEffect(itemId)[4] == ITEM4_HEAL_PP) { for (i = 0; i < MAX_MON_MOVES; i++) { - if (GetMonData(mon, MON_DATA_PP1 + i) < CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + i), GetMonData(mon, MON_DATA_PP_BONUSES), i)); + if (GetMonData(mon, MON_DATA_PP1 + i) < CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + i), GetMonData(mon, MON_DATA_PP_BONUSES), i)) break; } if (i == MAX_MON_MOVES) diff --git a/test/battle/item_effect/restore_pp.c b/test/battle/item_effect/restore_pp.c index 8691dcf1ed..5f2a50cd52 100644 --- a/test/battle/item_effect/restore_pp.c +++ b/test/battle/item_effect/restore_pp.c @@ -66,3 +66,30 @@ SINGLE_BATTLE_TEST("Max Elixir restores the PP of all of a battler's moves fully } TO_DO_BATTLE_TEST("Ether won't work if the selected move has all its PP") + +TO_DO_BATTLE_TEST("Elixir can be used if at least one move is missing PP in any slot") // The test system can't currently test this, in a test the item is used without running useability checks +/* +{ + u8 move1PP; + u8 move2PP; + u8 move3PP; + u8 move4PP; + PARAMETRIZE { move1PP = 30; move2PP = 30; move3PP = 20; move4PP = 10; } + PARAMETRIZE { move1PP = 40; move2PP = 20; move3PP = 20; move4PP = 10; } + PARAMETRIZE { move1PP = 40; move2PP = 30; move3PP = 10; move4PP = 10; } + PARAMETRIZE { move1PP = 40; move2PP = 30; move3PP = 20; move4PP = 0; } + GIVEN { + ASSUME(gItemsInfo[ITEM_ELIXIR].battleUsage == EFFECT_ITEM_RESTORE_PP); + ASSUME(gItemsInfo[ITEM_ELIXIR].type == ITEM_USE_PARTY_MENU); + PLAYER(SPECIES_WOBBUFFET) { MovesWithPP({MOVE_MEDITATE, move1PP}, {MOVE_AGILITY, move2PP}, {MOVE_PSYBEAM, move3PP}, {MOVE_TRICK, move4PP}); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_ELIXIR, partyIndex: 0); } + } THEN { + EXPECT_EQ(player->pp[0], 40); + EXPECT_EQ(player->pp[1], 30); + EXPECT_EQ(player->pp[2], 20); + EXPECT_EQ(player->pp[3], 10); + } +} +*/ From b7fc2b447a12844e67d80afd0ffe48418344a0c1 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sat, 18 May 2024 15:20:47 -0500 Subject: [PATCH 14/34] Add Stellar Tera Shard sprite (#4595) * Add Stellar Tera Shard sprite * Update items.h --- .../icon_palettes/stellar_tera_shard.pal | 18 ++++++++++++++++++ graphics/items/icons/stellar_tera_shard.png | Bin 0 -> 259 bytes include/graphics.h | 3 +++ src/data/graphics/items.h | 3 +++ src/data/item_icon_table.h | 2 +- 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 graphics/items/icon_palettes/stellar_tera_shard.pal create mode 100644 graphics/items/icons/stellar_tera_shard.png diff --git a/graphics/items/icon_palettes/stellar_tera_shard.pal b/graphics/items/icon_palettes/stellar_tera_shard.pal new file mode 100644 index 0000000000..8afcf6cab2 --- /dev/null +++ b/graphics/items/icon_palettes/stellar_tera_shard.pal @@ -0,0 +1,18 @@ +JASC-PAL +0100 +15 +0 255 92 +147 87 0 +0 161 79 +0 0 0 +209 155 7 +57 67 189 +167 25 135 +217 120 165 +189 109 220 +167 219 139 +255 239 132 +246 240 183 +171 225 199 +137 195 227 +233 240 241 diff --git a/graphics/items/icons/stellar_tera_shard.png b/graphics/items/icons/stellar_tera_shard.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bdfa3f2c6c6fa4947c20aa3780cad73d3a782d GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAF%}28J29*~C-V}>(GBnkab@@) zGdY}rVWB@z;Nom{OXt1ICEIUSEZv)XXZh{!|LGjLk2H_i!PatP?uPe3_b_<6`njxg HN@xNA5VmU- literal 0 HcmV?d00001 diff --git a/include/graphics.h b/include/graphics.h index e7e884e194..2ec513bf91 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -1681,6 +1681,9 @@ extern const u32 gItemIconPalette_DragonTeraShard[]; extern const u32 gItemIconPalette_SteelTeraShard[]; extern const u32 gItemIconPalette_FairyTeraShard[]; +extern const u32 gItemIcon_StellarTeraShard[]; +extern const u32 gItemIconPalette_StellarTeraShard[]; + extern const u32 gItemIcon_AdamantCrystal[]; extern const u32 gItemIconPalette_AdamantCrystal[]; extern const u32 gItemIcon_GriseousCore[]; diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index 6506ba402e..45e3ec0e2c 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -2025,6 +2025,9 @@ const u32 gItemIconPalette_DragonTeraShard[] = INCBIN_U32("graphics/items/icon_p const u32 gItemIconPalette_SteelTeraShard[] = INCBIN_U32("graphics/items/icon_palettes/steel_tera_shard.gbapal.lz"); const u32 gItemIconPalette_FairyTeraShard[] = INCBIN_U32("graphics/items/icon_palettes/fairy_tera_shard.gbapal.lz"); +const u32 gItemIcon_StellarTeraShard[] = INCBIN_U32("graphics/items/icons/stellar_tera_shard.4bpp.lz"); +const u32 gItemIconPalette_StellarTeraShard[] = INCBIN_U32("graphics/items/icon_palettes/stellar_tera_shard.gbapal.lz"); + // Mochi const u32 gItemIcon_Mochi[] = INCBIN_U32("graphics/items/icons/mochi.4bpp.lz"); diff --git a/src/data/item_icon_table.h b/src/data/item_icon_table.h index 9d3caea9d9..d452612c1b 100644 --- a/src/data/item_icon_table.h +++ b/src/data/item_icon_table.h @@ -860,7 +860,7 @@ const u32 *const gItemIconTable[ITEMS_COUNT + 1][2] = [ITEM_FRESH_START_MOCHI] = {gItemIcon_Mochi, gItemIconPalette_FreshStartMochi}, [ITEM_GLIMMERING_CHARM] = {gItemIcon_GlimmeringCharm, gItemIconPalette_GlimmeringCharm}, [ITEM_METAL_ALLOY] = {gItemIcon_MetalAlloy, gItemIconPalette_MetalAlloy}, - [ITEM_STELLAR_TERA_SHARD] = {gItemIcon_QuestionMark, gItemIconPalette_QuestionMark}, //{gItemIcon_TeraShard, gItemIconPalette_StellarTeraShard}, + [ITEM_STELLAR_TERA_SHARD] = {gItemIcon_StellarTeraShard, gItemIconPalette_StellarTeraShard}, [ITEM_JUBILIFE_MUFFIN] = {gItemIcon_JubilifeMuffin, gItemIconPalette_JubilifeMuffin}, [ITEM_REMEDY] = {gItemIcon_Remedy, gItemIconPalette_Remedy}, [ITEM_FINE_REMEDY] = {gItemIcon_FineRemedy, gItemIconPalette_FineRemedy}, From 35e90b896d222077fdd285d4b73a8bfd1af96658 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 19 May 2024 04:13:14 -0400 Subject: [PATCH 15/34] Adjust description of FREE_MATCH_CALL (#4590) * Adjust description of FREE_MATCH_CALL * Shorten comment --- include/config/save.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/config/save.h b/include/config/save.h index bf89bae9fb..11836396af 100644 --- a/include/config/save.h +++ b/include/config/save.h @@ -5,7 +5,7 @@ #define FREE_EXTRA_SEEN_FLAGS_SAVEBLOCK1 FALSE // Free up unused Pokédex seen flags (52 bytes). #define FREE_TRAINER_HILL FALSE // Frees up Trainer Hill data (28 bytes). #define FREE_MYSTERY_EVENT_BUFFERS FALSE // Frees up ramScript (1104 bytes). -#define FREE_MATCH_CALL FALSE // Frees up match call and rematch data. (104 bytes). +#define FREE_MATCH_CALL FALSE // Frees up match call and rematch / VS Seeker data. (104 bytes). #define FREE_UNION_ROOM_CHAT FALSE // Frees up union room chat (212 bytes). #define FREE_ENIGMA_BERRY FALSE // Frees up E-Reader Enigma Berry data (52 bytes). #define FREE_LINK_BATTLE_RECORDS FALSE // Frees up link battle record data (88 bytes). From ef03daf6d4798e450d1bb3cfab1267738d3d0a92 Mon Sep 17 00:00:00 2001 From: Jaizu Date: Sun, 19 May 2024 12:52:04 +0200 Subject: [PATCH 16/34] Fix Pokeblock script missing a releaseall --- data/scripts/safari_zone.inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/scripts/safari_zone.inc b/data/scripts/safari_zone.inc index eb6a90abdf..77e795a0eb 100644 --- a/data/scripts/safari_zone.inc +++ b/data/scripts/safari_zone.inc @@ -53,6 +53,9 @@ SafariZone_EventScript_ChoosePokeblock:: special OpenPokeblockCaseOnFeeder waitstate goto_if_ne VAR_RESULT, 0xFFFF, SafariZone_EventScript_PokeblockPlaced +#ifdef BUGFIX + releaseall @ Only gets called from EventScript_PokeBlockFeeder which uses lockall. +#endif end SafariZone_EventScript_PokeblockPlaced:: From 57ec87387d7880aa37737c89a78ae14706753f58 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 19 May 2024 21:29:54 +0200 Subject: [PATCH 17/34] Fixes freeze on Galvanize Explosion against Volt Absorb (#4601) --- data/battle_scripts_1.s | 3 --- test/battle/move_effect/explosion.c | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a0f1e81ae3..b8a4a20922 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8097,7 +8097,6 @@ BattleScript_MoveStatDrain:: .endif BattleScript_MoveStatDrain_Cont: clearsemiinvulnerablebit - tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_MonMadeMoveUseless_PPLoss:: @@ -8108,7 +8107,6 @@ BattleScript_MonMadeMoveUseless:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYUSELESS waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_ATTACKER orhalfword gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE goto BattleScript_MoveEnd @@ -8120,7 +8118,6 @@ BattleScript_FlashFireBoost:: call BattleScript_AbilityPopUp printfromtable gFlashFireStringIds waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd BattleScript_AbilityPreventsPhasingOut:: diff --git a/test/battle/move_effect/explosion.c b/test/battle/move_effect/explosion.c index 10e9feaa80..a45a465ba2 100644 --- a/test/battle/move_effect/explosion.c +++ b/test/battle/move_effect/explosion.c @@ -123,3 +123,25 @@ SINGLE_BATTLE_TEST("Explosion does not trigger Destiny Bond") NOT HP_BAR(opponent); } } + +DOUBLE_BATTLE_TEST("Explosion boosted by Galvanize is correctly blocked by Volt Absorb") +{ + GIVEN { + PLAYER(SPECIES_GEODUDE_ALOLAN) { Ability(ABILITY_GALVANIZE); } + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPLOSION); } + } SCENE { + MESSAGE("Geodude used Explosion!"); + HP_BAR(playerLeft, hp: 0); + ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB); + NOT HP_BAR(opponentLeft, hp: 0); + HP_BAR(playerRight, hp: 0); + MESSAGE("Wynaut fainted!"); + HP_BAR(opponentRight, hp: 0); + MESSAGE("Foe Wobbuffet fainted!"); + MESSAGE("Geodude fainted!"); + } +} From b73e33618d3f0d42b46468ed4299bfce49d3fa51 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 20 May 2024 00:25:03 +0200 Subject: [PATCH 18/34] Fix status curing of full restore when used on party member (#4603) * fix getboxmondata for evolutiontracker if compiled with agbcc * fixed full restore curing status condition when used in battle on party member with missing hp added more full restore tests * formatting, removed unused --- asm/macros/battle_script.inc | 3 +- data/battle_scripts_2.s | 15 ++++- include/battle_scripts.h | 1 - src/battle_script_commands.c | 6 +- .../battle/item_effect/heal_and_cure_status.c | 56 ++++++++++++++++++- 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index eb25849356..ce73e6ae8f 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1387,9 +1387,10 @@ .4byte \jumpInstr .endm - .macro itemrestorehp jumpInstr:req + .macro itemrestorehp jumpInstr:req, restoreBattlerInstr:req callnative BS_ItemRestoreHP .4byte \jumpInstr + .4byte \restoreBattlerInstr .endm .macro itemcurestatus jumpInstr:req diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index db30a69322..a84336e088 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -57,7 +57,11 @@ BattleScript_ItemRestoreHPRet: BattleScript_ItemRestoreHP:: call BattleScript_UseItemMessage - itemrestorehp BattleScript_ItemRestoreHPEnd + itemrestorehp BattleScript_ItemRestoreHPEnd, BattleScript_ItemRestoreHP_Battler + call BattleScript_ItemRestoreHP_Party + goto BattleScript_ItemRestoreHPEnd + +BattleScript_ItemRestoreHP_Battler:: call BattleScript_ItemRestoreHPRet BattleScript_ItemRestoreHPEnd: end @@ -67,7 +71,7 @@ BattleScript_ItemRestoreHP_Party:: bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT printstring STRINGID_ITEMRESTOREDSPECIESHEALTH waitmessage B_WAIT_TIME_LONG - end + return BattleScript_ItemRestoreHP_SendOutRevivedBattler: switchinanim BS_SCRIPTING, FALSE @@ -87,8 +91,13 @@ BattleScript_ItemCureStatusEnd: BattleScript_ItemHealAndCureStatus:: call BattleScript_UseItemMessage - itemrestorehp BattleScript_ItemCureStatusAfterItemMsg + itemrestorehp BattleScript_ItemCureStatusAfterItemMsg, BattleScript_ItemHealAndCureStatus_Battler + call BattleScript_ItemRestoreHP_Party + goto BattleScript_ItemHealAndCureStatusEnd + +BattleScript_ItemHealAndCureStatus_Battler:: call BattleScript_ItemRestoreHPRet +BattleScript_ItemHealAndCureStatusEnd:: goto BattleScript_ItemCureStatusAfterItemMsg BattleScript_ItemIncreaseStat:: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 30f7f76425..8674ee252f 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -496,7 +496,6 @@ extern const u8 BattleScript_TheRainbowDisappeared[]; extern const u8 BattleScript_HurtByTheSeaOfFire[]; extern const u8 BattleScript_TheSeaOfFireDisappeared[]; extern const u8 BattleScript_TheSwampDisappeared[]; -extern const u8 BattleScript_ItemRestoreHP_Party[]; extern const u8 BattleScript_EffectPsychicNoise[]; extern const u8 BattleScript_AromaVeilProtectsRet[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fda62541d7..6e56ce0338 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16021,7 +16021,7 @@ void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBat void BS_ItemRestoreHP(void) { - NATIVE_ARGS(const u8 *alreadyMaxHpInstr); + NATIVE_ARGS(const u8 *alreadyMaxHpInstr, const u8 *restoreBattlerInstr); u16 healAmount; u32 battler = MAX_BATTLERS_COUNT; u32 healParam = ItemId_GetEffect(gLastUsedItem)[6]; @@ -16074,7 +16074,7 @@ void BS_ItemRestoreHP(void) if (battler != MAX_BATTLERS_COUNT && hp != 0) { gBattleMoveDamage = -healAmount; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->restoreBattlerInstr; } else { @@ -16087,7 +16087,7 @@ void BS_ItemRestoreHP(void) gAbsentBattlerFlags &= ~gBitTable[battler]; gBattleCommunication[MULTIUSE_STATE] = TRUE; } - gBattlescriptCurrInstr = BattleScript_ItemRestoreHP_Party; + gBattlescriptCurrInstr = cmd->nextInstr; } } } diff --git a/test/battle/item_effect/heal_and_cure_status.c b/test/battle/item_effect/heal_and_cure_status.c index cde726e9ce..80719cf231 100644 --- a/test/battle/item_effect/heal_and_cure_status.c +++ b/test/battle/item_effect/heal_and_cure_status.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Full Restore restores a battler's HP and cures any primary s PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); Status1(status); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN{ USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 0); } + TURN { USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 0); } } SCENE { MESSAGE("Wobbuffet had its HP restored!"); if (status != STATUS1_NONE) { @@ -32,6 +32,35 @@ SINGLE_BATTLE_TEST("Full Restore restores a battler's HP and cures any primary s } } +SINGLE_BATTLE_TEST("Full Restore restores a party members HP and cures any primary status") +{ + u16 status; + PARAMETRIZE{ status = STATUS1_BURN; } + PARAMETRIZE{ status = STATUS1_FREEZE; } + PARAMETRIZE{ status = STATUS1_PARALYSIS; } + PARAMETRIZE{ status = STATUS1_POISON; } + PARAMETRIZE{ status = STATUS1_TOXIC_POISON; } + PARAMETRIZE{ status = STATUS1_SLEEP; } + PARAMETRIZE{ status = STATUS1_NONE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); Status1(status); } + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(300); Status1(status); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 1); } + TURN { SWITCH(player, 1); } + } SCENE { + MESSAGE("Wynaut had its HP restored!"); + if (status != STATUS1_NONE) { + MESSAGE("Wynaut had its status healed!"); // The message is not printed if status wasn't healed. + } + } THEN { + EXPECT_EQ(player->hp, player->maxHP); + EXPECT_EQ(player->species, SPECIES_WYNAUT); + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Full Restore heals a battler from any primary status") { u16 status; @@ -54,6 +83,31 @@ SINGLE_BATTLE_TEST("Full Restore heals a battler from any primary status") } } +SINGLE_BATTLE_TEST("Full Restore heals a party member from any primary status") +{ + u16 status; + PARAMETRIZE{ status = STATUS1_BURN; } + PARAMETRIZE{ status = STATUS1_FREEZE; } + PARAMETRIZE{ status = STATUS1_PARALYSIS; } + PARAMETRIZE{ status = STATUS1_POISON; } + PARAMETRIZE{ status = STATUS1_TOXIC_POISON; } + PARAMETRIZE{ status = STATUS1_SLEEP; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { Status1(status); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 1); } + TURN { SWITCH(player, 1); } + } SCENE { + NOT MESSAGE("Wynaut had its HP restored!"); // The message is not printed if mon has max HP. + MESSAGE("Wynaut had its status healed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_WYNAUT); + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Full Restore restores a battler's HP and cures confusion") { GIVEN { From 973146c725fd54413ce22df18abe2c259237ebbf Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 22 May 2024 00:55:20 +0200 Subject: [PATCH 19/34] BS_SetGlaiveRush formatting (#4610) Please merge my OCD induced change. --- src/battle_script_commands.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6e56ce0338..84db1e01c5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -16470,9 +16470,7 @@ void BS_TrySetOctolock(void) void BS_SetGlaiveRush(void) { NATIVE_ARGS(); - gStatuses4[gBattlerAttacker] |= STATUS4_GLAIVE_RUSH; - gBattlescriptCurrInstr = cmd->nextInstr; } From edab81b658774a61045e60b24a69a6877658d42b Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Wed, 22 May 2024 15:20:44 -0500 Subject: [PATCH 20/34] Fix Inner Focus, Scrappy, etc granting immunity to all stat drops if the attacker has Intimidate (#4606) * Fix Inner Focus, Scrappy, etc granting immunity to all stat drops if the attacker has Intimidate * Formatting * Test * Update own_tempo.c --- data/battle_scripts_1.s | 12 ++++++++++++ src/battle_script_commands.c | 14 +++----------- test/battle/ability/own_tempo.c | 21 ++++++++------------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index b8a4a20922..a2810db205 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7726,6 +7726,12 @@ BattleScript_IntimidateLoop: jumpiftargetally BattleScript_IntimidateLoopIncrement jumpifabsent BS_TARGET, BattleScript_IntimidateLoopIncrement jumpifstatus2 BS_TARGET, STATUS2_SUBSTITUTE, BattleScript_IntimidateLoopIncrement +.if B_UPDATED_INTIMIDATE >= GEN_8 @These abilties specifically prevent just intimidate, without blocking stat decreases + jumpifability BS_TARGET, ABILITY_INNER_FOCUS, BattleScript_IntimidatePrevented + jumpifability BS_TARGET, ABILITY_SCRAPPY, BattleScript_IntimidatePrevented + jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_IntimidatePrevented + jumpifability BS_TARGET, ABILITY_OBLIVIOUS, BattleScript_IntimidatePrevented +.endif jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_IntimidateInReverse BattleScript_IntimidateEffect: copybyte sBATTLER, gBattlerAttacker @@ -7750,6 +7756,12 @@ BattleScript_IntimidateEnd: pause B_WAIT_TIME_MED end3 +BattleScript_IntimidatePrevented: + copybyte sBATTLER, gBattlerTarget + call BattleScript_AbilityPopUp + printstring STRINGID_PKMNPREVENTSSTATLOSSWITH + goto BattleScript_IntimidateEffect_WaitString + BattleScript_IntimidateWontDecrease: printstring STRINGID_STATSWONTDECREASE goto BattleScript_IntimidateEffect_WaitString diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 84db1e01c5..0b0b2eda96 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -362,7 +362,7 @@ static void TryUpdateRoundTurnOrder(void); static bool32 ChangeOrderTargetAfterAttacker(void); void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); static void RemoveAllTerrains(void); -static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 isIntimidate); +static bool8 CanAbilityPreventStatLoss(u16 abilityDef); static bool8 CanBurnHitThaw(u16 move); static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove); @@ -11568,8 +11568,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattlescriptCurrInstr = BattleScript_ButItFailed; return STAT_CHANGE_DIDNT_WORK; } - else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET - || CanAbilityPreventStatLoss(battlerAbility, GetBattlerAbility(gBattlerAttacker) == ABILITY_INTIMIDATE)) + else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET || CanAbilityPreventStatLoss(battlerAbility)) && (!affectsUser || mirrorArmored) && !certain && gCurrentMove != MOVE_CURSE) { if (flags == STAT_CHANGE_ALLOW_PTR) @@ -15817,7 +15816,7 @@ static bool8 IsFinalStrikeEffect(u16 move) return FALSE; } -static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 byIntimidate) +static bool8 CanAbilityPreventStatLoss(u16 abilityDef) { switch (abilityDef) { @@ -15825,13 +15824,6 @@ static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 byIntimidate) case ABILITY_FULL_METAL_BODY: case ABILITY_WHITE_SMOKE: return TRUE; - case ABILITY_INNER_FOCUS: - case ABILITY_SCRAPPY: - case ABILITY_OWN_TEMPO: - case ABILITY_OBLIVIOUS: - if (byIntimidate && (B_UPDATED_INTIMIDATE >= GEN_8)) - return TRUE; - break; } return FALSE; } diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index 04697aad32..d5a6f58a72 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -1,29 +1,24 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Own Tempo prevents intimidate") +SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes") { - s16 turnOneHit; - s16 turnTwoHit; - GIVEN { ASSUME(B_UPDATED_INTIMIDATE >= GEN_8); - PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; + ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; } WHEN { - TURN { MOVE(opponent, MOVE_TACKLE); } - TURN { SWITCH(player, 1); MOVE(opponent, MOVE_TACKLE); } - + TURN { MOVE(player, MOVE_SCARY_FACE); } } SCENE { - HP_BAR(player, captureDamage: &turnOneHit); ABILITY_POPUP(player, ABILITY_INTIMIDATE); - NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); } ABILITY_POPUP(opponent, ABILITY_OWN_TEMPO); MESSAGE("Foe Slowpoke's Own Tempo prevents stat loss!"); - HP_BAR(player, captureDamage: &turnTwoHit); - } THEN { - EXPECT_EQ(turnOneHit, turnTwoHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_OWN_TEMPO); + MESSAGE("Foe Slowpoke's Own Tempo prevents stat loss!"); + } } } From b592c6eae5015e6b01198212444a3b852bda27d0 Mon Sep 17 00:00:00 2001 From: sneed Date: Thu, 23 May 2024 02:45:22 +0300 Subject: [PATCH 21/34] Add POKE_ICON_BASE_PAL_TAG to a header --- include/constants/pokemon_icon.h | 6 ++++++ src/pokemon_icon.c | 3 +-- src/pokemon_storage_system.c | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 include/constants/pokemon_icon.h diff --git a/include/constants/pokemon_icon.h b/include/constants/pokemon_icon.h new file mode 100644 index 0000000000..d57d5111a9 --- /dev/null +++ b/include/constants/pokemon_icon.h @@ -0,0 +1,6 @@ +#ifndef GUARD_CONSTANTS_POKEMON_ICON_H +#define GUARD_CONSTANTS_POKEMON_ICON_H + +#define POKE_ICON_BASE_PAL_TAG 56000 + +#endif // GUARD_CONSTANTS_POKEMON_ICON_H diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index e659eebe21..caed0bcdc3 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -4,8 +4,7 @@ #include "palette.h" #include "pokemon_icon.h" #include "sprite.h" - -#define POKE_ICON_BASE_PAL_TAG 56000 +#include "constants/pokemon_icon.h" #define INVALID_ICON_SPECIES SPECIES_OLD_UNOWN_J // Oddly specific, used when an icon should be a ?. Any of the 'old unown' would work diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index c8c87961c8..b398b88752 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -40,6 +40,7 @@ #include "constants/moves.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/pokemon_icon.h" /* NOTE: This file is large. Some general groups of functions have @@ -215,7 +216,7 @@ enum { #define BOXID_CANCELED 201 enum { - PALTAG_MON_ICON_0 = 56000, + PALTAG_MON_ICON_0 = POKE_ICON_BASE_PAL_TAG, PALTAG_MON_ICON_1, // Used implicitly in CreateMonIconSprite PALTAG_MON_ICON_2, // Used implicitly in CreateMonIconSprite PALTAG_3, // Unused From 312dcbb8a8f9ec3b08be7c3ae1d32389c0bc92d9 Mon Sep 17 00:00:00 2001 From: sneed <56992013+Sneed69@users.noreply.github.com> Date: Fri, 24 May 2024 12:21:35 +0300 Subject: [PATCH 22/34] Speed Ignoring effect fixes (#4613) * Custap ties with Quick Draw, Stall with Mycelium * add a test --- src/battle_main.c | 26 +++++++++++--------------- test/battle/ability/mycelium_might.c | 24 ++++++++++++++++++++++++ test/battle/hold_effect/quick_claw.c | 3 ++- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/battle_main.c b/src/battle_main.c index 413d50c585..0332214b9d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5071,29 +5071,25 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov if (priority1 == priority2) { - // QUICK CLAW / CUSTAP - always first - // LAGGING TAIL - always last - // STALL - always last + // Quick Claw / Quick Draw / Custap Berry - always first + // Stall / Mycelium Might - last but before Lagging Tail + // Lagging Tail - always last + bool32 battler1HasQuickEffect = gProtectStructs[battler1].quickDraw || gProtectStructs[battler1].usedCustapBerry; + bool32 battler2HasQuickEffect = gProtectStructs[battler2].quickDraw || gProtectStructs[battler2].usedCustapBerry; + bool32 battler1HasStallingAbility = ability1 == ABILITY_STALL || (ability1 == ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gChosenMoveByBattler[battler1])); + bool32 battler2HasStallingAbility = ability2 == ABILITY_STALL || (ability2 == ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gChosenMoveByBattler[battler2])); - if (gProtectStructs[battler1].quickDraw && !gProtectStructs[battler2].quickDraw) + if (battler1HasQuickEffect && !battler2HasQuickEffect) strikesFirst = 1; - else if (!gProtectStructs[battler1].quickDraw && gProtectStructs[battler2].quickDraw) - strikesFirst = -1; - else if (gProtectStructs[battler1].usedCustapBerry && !gProtectStructs[battler2].usedCustapBerry) - strikesFirst = 1; - else if (gProtectStructs[battler2].usedCustapBerry && !gProtectStructs[battler1].usedCustapBerry) + else if (battler2HasQuickEffect && !battler1HasQuickEffect) strikesFirst = -1; else if (holdEffectBattler1 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler2 != HOLD_EFFECT_LAGGING_TAIL) strikesFirst = -1; else if (holdEffectBattler2 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler1 != HOLD_EFFECT_LAGGING_TAIL) strikesFirst = 1; - else if (ability1 == ABILITY_STALL && ability2 != ABILITY_STALL) + else if (battler1HasStallingAbility && !battler2HasStallingAbility) strikesFirst = -1; - else if (ability2 == ABILITY_STALL && ability1 != ABILITY_STALL) - strikesFirst = 1; - else if (ability1 == ABILITY_MYCELIUM_MIGHT && ability2 != ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gChosenMoveByBattler[battler1])) - strikesFirst = -1; - else if (ability2 == ABILITY_MYCELIUM_MIGHT && ability1 != ABILITY_MYCELIUM_MIGHT && IS_MOVE_STATUS(gChosenMoveByBattler[battler2])) + else if (battler2HasStallingAbility && !battler1HasStallingAbility) strikesFirst = 1; else { diff --git a/test/battle/ability/mycelium_might.c b/test/battle/ability/mycelium_might.c index 1039fca34f..8491aede51 100644 --- a/test/battle/ability/mycelium_might.c +++ b/test/battle/ability/mycelium_might.c @@ -43,3 +43,27 @@ SINGLE_BATTLE_TEST("Mycelium Might ignores opposing abilities") NOT ABILITY_POPUP(opponent, ABILITY_CLEAR_BODY); } } + +SINGLE_BATTLE_TEST("Mycelium Might vs Stall action order depends on speed") +{ + u32 speed; + PARAMETRIZE { speed = 99; } + PARAMETRIZE { speed = 101; } + GIVEN { + PLAYER(SPECIES_TOEDSCOOL) { Speed(100); Ability(ABILITY_MYCELIUM_MIGHT); } + OPPONENT(SPECIES_SABLEYE) { Speed(speed); Ability(ABILITY_STALL);} + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + if (speed < 100) + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } + else + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } + } +} diff --git a/test/battle/hold_effect/quick_claw.c b/test/battle/hold_effect/quick_claw.c index 3e8cd4d652..b8b845ec25 100644 --- a/test/battle/hold_effect/quick_claw.c +++ b/test/battle/hold_effect/quick_claw.c @@ -4,9 +4,10 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_QUICK_CLAW].holdEffect == HOLD_EFFECT_QUICK_CLAW); + ASSUME(gItemsInfo[ITEM_QUICK_CLAW].holdEffectParam == 20); } -SINGLE_BATTLE_TEST("Quick Claw activates 10% of the time") +SINGLE_BATTLE_TEST("Quick Claw activates 20% of the time") { PASSES_RANDOMLY(2, 10, RNG_QUICK_CLAW); GIVEN { From a507af300e27ae85840f04223d6834b79b50dedc Mon Sep 17 00:00:00 2001 From: BlueAnthem37510 <137793234+BlueAnthem37510@users.noreply.github.com> Date: Fri, 24 May 2024 10:28:35 +0100 Subject: [PATCH 23/34] Sceptilite & Salandit sprite fixes (#4614) Co-authored-by: BlueAnthem37510 --- graphics/items/icon_palettes/sceptilite.pal | 30 ++++++++++---------- graphics/items/icons/sceptilite.png | Bin 235 -> 336 bytes graphics/pokemon/salandit/anim_front.png | Bin 766 -> 766 bytes graphics/pokemon/salandit/back.png | Bin 442 -> 541 bytes graphics/pokemon/salandit/normal.pal | 12 ++++---- graphics/pokemon/salandit/shiny.pal | 10 +++---- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/graphics/items/icon_palettes/sceptilite.pal b/graphics/items/icon_palettes/sceptilite.pal index 579e9c4198..9c8978d4b5 100644 --- a/graphics/items/icon_palettes/sceptilite.pal +++ b/graphics/items/icon_palettes/sceptilite.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 255 0 128 -48 48 48 -80 96 80 -184 40 48 -248 32 32 -128 160 104 -168 192 160 -248 160 152 -192 96 64 -248 248 248 -64 64 64 -96 120 88 -192 208 120 -0 0 0 -0 0 0 -0 0 0 +115 57 41 +197 148 123 +255 255 255 +197 148 115 +82 131 74 +172 197 164 +189 115 82 +148 115 74 +65 106 65 +164 139 90 +115 189 115 +222 98 82 +41 74 41 +49 49 49 +189 246 213 diff --git a/graphics/items/icons/sceptilite.png b/graphics/items/icons/sceptilite.png index ba61c74aac5ef06efac52f6e0f0258591d0298b7..d68d90aebdf9417f3dc451a689c1fe0928ad53ab 100644 GIT binary patch delta 293 zcmV+=0owlS0nh@FBu58yNliru=mi!L5eg-_w>1C&02g#cSaefwW^{L9a%BKVOhiyl zM<8}(av(DEZ}y>s4TQYlI)F)=Z{_SMd1g}eX&00Cl4M@0Xn z2lB-L0004WQchCNXU&-taL(`TXU^Qc4>j&JP)ZhN+WXzx&j|j5 rS^9tX5qX%U4DbFsB0CO=O$h)1xOg^2Ar9_a00000NkvXXu0mjf>+5*o delta 207 zcmV;=05Jd10_y>gB!2{FK}|sb0I`n?{9y$E001XYOjJex0Dv$sFi>DnxF|6AARvIC zXsE!T_@J1;U_kiz_&`8FV0c)-(0GOu_f!A?00DGTPE!Ct=GbNc003f1L_t&-(_>(u z3J?@TVk#sB~S0b)x>M3{Eb20pRGIs#ZJAV&ZI delta 87 zcmV-d0I2`|1^xw)DhlTV5(*9k?pz2Tku*|1C?FsZ5C{+u5b#h4XlP(FC?7yLFmPB{ txR}V;$lzE|h(JIL;#2d9Z0dnIs)SB9aI1S diff --git a/graphics/pokemon/salandit/back.png b/graphics/pokemon/salandit/back.png index 461f7015a3ad7a51ea8252a1a7257f7b949ffa05..1563a0d0c18c9d44d3dcaec9279bf2d36b7cc12d 100644 GIT binary patch delta 515 zcmV+e0{s2D1DynrB!35VNliru=mi%I3L|5^*|Got02g#cSaefwW^{L9a%BKVOhiyl zM<8}(av(DOV1ZP1_K>z@;j|==^1poj5 zFi=cXMVQc_B_bhkU|7I-kl^6p|NsBQ z5)y+2b2I<|00Cl4M??UK1szBL00BWsL_t(|ob8jbj)O1^hT-x8jgZ2AtQ}fK$}N2v zWXYYYlgRtgH4k-m3dDiX8*aD-Phfxf{o8@6I^u}GM6I> zBVM+>J>}W~see2mA{2n{N^xn5jRcvyX#53m0@(CuJ;FOck#kt8eE}E*(3{)@@0Nj> zkMg-o#k*CUn>~P81Ku|hhz|*qHTPctFg-rR1k>roB)w%o#V57g0|J=4 z_-vGkRRN%LcPY^r?jbi#KC`c;xguDx=qQ&FwdHULV0@oGyK@yn=%PwvP4v0Cu^Rzl zv~fiZZ^{`1D}fi$pSUB5Tpg?hn3%FO7|3;hoF^c3Fpr)AYOYh0d2}l~d@ew+%ON@C zEdgCsh-4vzX9-9al7~GYJhwlt@Hk4BC6D8IN8*V8j~}ac{q-?@|DgZ?002ovPDHLk FV1m%~*dqV{ delta 416 zcmV;R0bl-|1iAx|B!4haOjJdf(4YVS01yxe5D*aXPzcDt$S5EfKsYdPSXj82$k@o> zSWt+Nh>+mm-~a#s#1ax;ZNXds00BiwL_t(YiS3iIj)O1^h7no%7$`_#tr{t}^l7l< z?mda@*X4%3RTqXl)Hxv#2SRVS;TAl#_Q&tvKW$YVb<|&~mVZ(=HAaiGlzW{~-n;o4+cn1h_4$HJJ00RShm7DO{ zdLZR)P9b|yaJ$%gj7XVa`cXmO1dNE1gGN3Y(YRUlt z)U9C>Doh!G#(&(nM63J`o-`?Dznb=fpjpsCE+cBKrPL+?-lxspxp2;X1(jB-;B)oH zt^~NT4H3~sl28g(0u#|Uej|xo46Fq_5xaC4@VHOU2)GB#r)Pke=Wf*V>6&l&UI3?; zhxnD(1U#xjB@52IN) diff --git a/graphics/pokemon/salandit/normal.pal b/graphics/pokemon/salandit/normal.pal index ba5c7e8bfe..02630e94b3 100644 --- a/graphics/pokemon/salandit/normal.pal +++ b/graphics/pokemon/salandit/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -40 32 32 -16 16 8 +37 34 33 +50 45 44 16 16 16 240 80 8 104 104 96 -40 32 24 -64 56 48 +55 50 50 +67 62 60 112 88 88 184 152 200 216 200 224 88 80 136 64 64 64 136 120 112 -0 0 0 -0 0 0 +255 255 255 +196 18 18 diff --git a/graphics/pokemon/salandit/shiny.pal b/graphics/pokemon/salandit/shiny.pal index 77e8261440..a24b6f5dfe 100644 --- a/graphics/pokemon/salandit/shiny.pal +++ b/graphics/pokemon/salandit/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 +37 34 33 112 96 96 -16 16 8 16 16 16 240 80 8 200 192 200 -40 32 24 -64 56 48 +55 50 50 +67 62 60 112 88 88 184 152 200 216 200 224 88 80 136 144 136 144 224 224 224 -0 0 0 -0 0 0 +255 255 255 +196 18 18 From 474f929c023254d068cce5256801cbb7a4c3d66a Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Sun, 26 May 2024 00:06:55 +0200 Subject: [PATCH 24/34] Fix dire hit being used on incorrect target (#4626) * fix getboxmondata for evolutiontracker if compiled with agbcc * fix dire hit being used on incorrect battler --- asm/macros/battle_script.inc | 3 ++- data/battle_scripts_1.s | 2 +- data/battle_scripts_2.s | 2 +- src/battle_script_commands.c | 13 +++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index ce73e6ae8f..031c950465 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -855,8 +855,9 @@ .byte 0x99 .endm - .macro setfocusenergy + .macro setfocusenergy battler:req .byte 0x9a + .byte \battler .endm .macro transformdataexecution diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a2810db205..89c4ad3ae7 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3451,7 +3451,7 @@ BattleScript_EffectFocusEnergy:: attackstring ppreduce jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY_ANY, BattleScript_ButItFailed - setfocusenergy + setfocusenergy BS_TARGET attackanimation waitanimation printfromtable gFocusEnergyUsedStringIds diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index a84336e088..3cee2d32ae 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -122,7 +122,7 @@ BattleScript_ItemSetMist:: BattleScript_ItemSetFocusEnergy:: call BattleScript_UseItemMessage jumpifstatus2 BS_ATTACKER, STATUS2_FOCUS_ENERGY_ANY, BattleScript_ButItFailed - setfocusenergy + setfocusenergy BS_ATTACKER playmoveanimation BS_ATTACKER, MOVE_FOCUS_ENERGY waitanimation copybyte sBATTLER, gBattlerAttacker diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0b0b2eda96..235c11d14d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12477,22 +12477,23 @@ static void Cmd_setmist(void) static void Cmd_setfocusenergy(void) { - CMD_ARGS(); + CMD_ARGS(u8 battler); + u8 battler = GetBattlerForBattleScript(cmd->battler); - if ((gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || (gAbsentBattlerFlags & gBitTable[gBattlerTarget]))) - || gBattleMons[gBattlerTarget].status2 & STATUS2_FOCUS_ENERGY_ANY) + if ((gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) || (gAbsentBattlerFlags & gBitTable[battler]))) + || gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY_ANY) { gMoveResultFlags |= MOVE_RESULT_FAILED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; } - else if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && !IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_DRAGON)) + else if (gMovesInfo[gCurrentMove].effect == EFFECT_DRAGON_CHEER && !IS_BATTLER_OF_TYPE(battler, TYPE_DRAGON)) { - gBattleMons[gBattlerTarget].status2 |= STATUS2_DRAGON_CHEER; + gBattleMons[battler].status2 |= STATUS2_DRAGON_CHEER; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } else { - gBattleMons[gBattlerTarget].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[battler].status2 |= STATUS2_FOCUS_ENERGY; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } gBattlescriptCurrInstr = cmd->nextInstr; From 487dc921197c72524879c15b9cf20407fb762347 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 26 May 2024 17:01:20 +0200 Subject: [PATCH 25/34] Fixing bugs with Moxie clones+Dynamax, Fling Flinch infinite loop and Focus Sash+foreseen moves (#4625) * Fixed Elixirs not being able to be used unless the first move was missing PP * Revert "Pokedex Plus fixes (#4514)" This reverts commit 982934c4aad64c75468e2ae6642cb74e50aa0944. * Pokedex Plus fixes (#4514) * Pokedex plus no longer allows browsing unseen evos * Restore "has no evolutions" printing * only print "has no evolution" text at 0 depth * Revert config changes * fix duplicate icons and removed eevee hardcodes * add new scope and indentation fixes * actually introduce new scope * Revert "Fixed Elixirs not being able to be used unless the first move was missing PP" This reverts commit 313f2e552672cae9506c6a647464c247b9b39928. * Initial Testing of Focus Sash+Future Sight * Fixed infinite loop when flinging Razor Fang on a mon that's already moved * Fixed Moxie clones not triggering on pokemon fainted by Max Moves * Fixed Focus Sash enduring another time if broken by foreseen moves * Update src/battle_script_commands.c Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Update src/battle_script_commands.c Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Added assumptions to tests --------- Co-authored-by: Hedara Co-authored-by: sneed <56992013+Sneed69@users.noreply.github.com> Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_script_commands.c | 10 +++++++++- test/battle/move_effect/future_sight.c | 21 +++++++++++++++++++++ test/dynamax.c | 16 ++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 235c11d14d..af1bcfe1aa 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2096,6 +2096,9 @@ static void Cmd_adjustdamage(void) { gMoveResultFlags |= MOVE_RESULT_FOE_HUNG_ON; gLastUsedItem = gBattleMons[gBattlerTarget].item; + gSpecialStatuses[gBattlerTarget].focusBanded = FALSE; + gSpecialStatuses[gBattlerTarget].focusSashed = FALSE; + } else if (gSpecialStatuses[gBattlerTarget].sturdied) { @@ -3212,6 +3215,10 @@ void SetMoveEffect(bool32 primary, bool32 certain) { gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; gBattlescriptCurrInstr++; + } + else + { + gBattlescriptCurrInstr++; } break; case MOVE_EFFECT_UPROAR: @@ -8406,7 +8413,7 @@ static bool32 HasAttackerFaintedTarget(void) && gBattleStruct->moveTarget[gBattlerAttacker] == gBattlerTarget && gBattlerTarget != gBattlerAttacker && gCurrentTurnActionNumber == GetBattlerTurnOrderNum(gBattlerAttacker) - && (gChosenMove == gChosenMoveByBattler[gBattlerAttacker] || gChosenMove == gBattleMons[gBattlerAttacker].moves[gChosenMovePos])) + && (gChosenMove == gChosenMoveByBattler[gBattlerAttacker] || gChosenMove == gBattleMons[gBattlerAttacker].moves[gChosenMovePos] || gChosenMove == GetMaxMove(gBattlerAttacker, gChosenMoveByBattler[gBattlerAttacker]))) return TRUE; else return FALSE; @@ -9486,6 +9493,7 @@ static void Cmd_various(void) case VARIOUS_TRY_ACTIVATE_BEAST_BOOST: { VARIOUS_ARGS(); + i = GetHighestStatId(battler); if (GetBattlerAbility(battler) == ABILITY_BEAST_BOOST && HasAttackerFaintedTarget() diff --git a/test/battle/move_effect/future_sight.c b/test/battle/move_effect/future_sight.c index 7ebac1ac97..fa78461a9d 100644 --- a/test/battle/move_effect/future_sight.c +++ b/test/battle/move_effect/future_sight.c @@ -5,6 +5,8 @@ ASSUMPTIONS { ASSUME(gMovesInfo[MOVE_SEED_FLARE].power == gMovesInfo[MOVE_FUTURE_SIGHT].power); ASSUME(gMovesInfo[MOVE_SEED_FLARE].category == gMovesInfo[MOVE_FUTURE_SIGHT].category); + ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].effect == EFFECT_FUTURE_SIGHT); + ASSUME(gMovesInfo[MOVE_FUTURE_SIGHT].power > 0); } SINGLE_BATTLE_TEST("Future Sight uses Sp. Atk stat of the original user without modifiers") @@ -153,3 +155,22 @@ SINGLE_BATTLE_TEST("Future Sight will miss timing if target faints by residual d NOT MESSAGE("Foe Wynaut took the Future Sight attack!"); } } + +SINGLE_BATTLE_TEST("Future Sight breaks Focus Sash and doesn't make the holder endure another move") +{ + ASSUME(gMovesInfo[MOVE_PSYCHIC].power > 0); + ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PIDGEY) { Level(1); Item(ITEM_FOCUS_SASH); } + } WHEN { + TURN { MOVE(player, MOVE_FUTURE_SIGHT); } + TURN { } + TURN { } + TURN { MOVE(player, MOVE_PSYCHIC); } + } SCENE { + MESSAGE("Foe Pidgey hung on using its Focus Sash!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHIC, player); + MESSAGE("Foe Pidgey fainted!"); + } +} diff --git a/test/dynamax.c b/test/dynamax.c index 2db55d87b6..03ff3c2ade 100644 --- a/test/dynamax.c +++ b/test/dynamax.c @@ -1470,3 +1470,19 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't execute effects on fainted battler NOT MESSAGE("Foe Wobbuffet's Speed fell!"); } } + +SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves fainting opponents") +{ + ASSUME(gMovesInfo[MOVE_WATERFALL].power > 0); + GIVEN { + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_MOXIE); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_WATERFALL, dynamax: TRUE); SEND_OUT(opponent, 1); } + } SCENE { + MESSAGE("Foe Wobbuffet fainted!"); + ABILITY_POPUP(player, ABILITY_MOXIE); + MESSAGE("Gyarados's Moxie raised its Attack!"); + } +} From ee1d0339f96f9f4d7e26c536b1374db6d52adc22 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 26 May 2024 13:37:58 -0400 Subject: [PATCH 26/34] Fixed HITMARKER_PASSIVE_DAMAGE whitespace (#4629) --- data/battle_scripts_1.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 89c4ad3ae7..8b2160cefc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -52,7 +52,7 @@ BattleScript_EffectShedTail:: jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed setsubstitute jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString - orword gHitMarker, HITMARKER_PASSIVE_DAMAGE + orword gHitMarker, HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation healthbarupdate BS_ATTACKER @@ -3750,7 +3750,7 @@ BattleScript_EffectSubstitute:: jumpifstatus2 BS_ATTACKER, STATUS2_SUBSTITUTE, BattleScript_AlreadyHasSubstitute setsubstitute jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SUBSTITUTE_FAILED, BattleScript_SubstituteString - orword gHitMarker, HITMARKER_PASSIVE_DAMAGE + orword gHitMarker, HITMARKER_PASSIVE_DAMAGE attackanimation waitanimation healthbarupdate BS_ATTACKER From 8f38089127eacf406d485399dc9a671c0a99c2d0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 26 May 2024 13:38:22 -0400 Subject: [PATCH 27/34] Added failsafe in HGSS dex for Egg Groups without text defined (#4628) * Added failsafe in HGSS dex for Egg Groups without text defined * Fixed stringvar --- src/pokedex_plus_hgss.c | 65 +++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 15cfbc87a2..41415053e7 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -193,6 +193,7 @@ static const u8 sText_Stats_eggGroup_WATER_2[] = _("WATER {CIRCLE_2}"); static const u8 sText_Stats_eggGroup_DITTO[] = _("DITTO"); static const u8 sText_Stats_eggGroup_DRAGON[] = _("DRAGON"); static const u8 sText_Stats_eggGroup_NO_EGGS_DISCOVERED[] = _("---"); +static const u8 sText_Stats_eggGroup_UNKNOWN[] = _("???"); static const u8 sText_Dex_SEEN[] = _("SEEN"); static const u8 sText_Dex_OWN[] = _("OWN"); @@ -5755,102 +5756,108 @@ static void PrintStatsScreen_Left(u8 taskId) //Egg group 1 switch (sPokedexView->sPokemonStats.eggGroup1) { - case EGG_GROUP_MONSTER : + case EGG_GROUP_MONSTER: StringCopy(gStringVar1, sText_Stats_eggGroup_MONSTER); break; - case EGG_GROUP_WATER_1 : + case EGG_GROUP_WATER_1: StringCopy(gStringVar1, sText_Stats_eggGroup_WATER_1); break; - case EGG_GROUP_BUG : + case EGG_GROUP_BUG: StringCopy(gStringVar1, sText_Stats_eggGroup_BUG); break; - case EGG_GROUP_FLYING : + case EGG_GROUP_FLYING: StringCopy(gStringVar1, sText_Stats_eggGroup_FLYING); break; - case EGG_GROUP_FIELD : + case EGG_GROUP_FIELD: StringCopy(gStringVar1, sText_Stats_eggGroup_FIELD); break; - case EGG_GROUP_FAIRY : + case EGG_GROUP_FAIRY: StringCopy(gStringVar1, sText_Stats_eggGroup_FAIRY); break; - case EGG_GROUP_GRASS : + case EGG_GROUP_GRASS: StringCopy(gStringVar1, sText_Stats_eggGroup_GRASS); break; - case EGG_GROUP_HUMAN_LIKE : + case EGG_GROUP_HUMAN_LIKE: StringCopy(gStringVar1, sText_Stats_eggGroup_HUMAN_LIKE); break; - case EGG_GROUP_WATER_3 : + case EGG_GROUP_WATER_3: StringCopy(gStringVar1, sText_Stats_eggGroup_WATER_3); break; - case EGG_GROUP_MINERAL : + case EGG_GROUP_MINERAL: StringCopy(gStringVar1, sText_Stats_eggGroup_MINERAL); break; - case EGG_GROUP_AMORPHOUS : + case EGG_GROUP_AMORPHOUS: StringCopy(gStringVar1, sText_Stats_eggGroup_AMORPHOUS); break; - case EGG_GROUP_WATER_2 : + case EGG_GROUP_WATER_2: StringCopy(gStringVar1, sText_Stats_eggGroup_WATER_2); break; - case EGG_GROUP_DITTO : + case EGG_GROUP_DITTO: StringCopy(gStringVar1, sText_Stats_eggGroup_DITTO); break; - case EGG_GROUP_DRAGON : + case EGG_GROUP_DRAGON: StringCopy(gStringVar1, sText_Stats_eggGroup_DRAGON); break; case EGG_GROUP_NO_EGGS_DISCOVERED: StringCopy(gStringVar1, sText_Stats_eggGroup_NO_EGGS_DISCOVERED); break; + default: + StringCopy(gStringVar1, sText_Stats_eggGroup_UNKNOWN); + break; } //Egg group 2 if (sPokedexView->sPokemonStats.eggGroup1 != sPokedexView->sPokemonStats.eggGroup2) { switch (sPokedexView->sPokemonStats.eggGroup2) { - case EGG_GROUP_MONSTER : + case EGG_GROUP_MONSTER: StringCopy(gStringVar2, sText_Stats_eggGroup_MONSTER); break; - case EGG_GROUP_WATER_1 : + case EGG_GROUP_WATER_1: StringCopy(gStringVar2, sText_Stats_eggGroup_WATER_1); break; - case EGG_GROUP_BUG : + case EGG_GROUP_BUG: StringCopy(gStringVar2, sText_Stats_eggGroup_BUG); break; - case EGG_GROUP_FLYING : + case EGG_GROUP_FLYING: StringCopy(gStringVar2, sText_Stats_eggGroup_FLYING); break; - case EGG_GROUP_FIELD : + case EGG_GROUP_FIELD: StringCopy(gStringVar2, sText_Stats_eggGroup_FIELD); break; - case EGG_GROUP_FAIRY : + case EGG_GROUP_FAIRY: StringCopy(gStringVar2, sText_Stats_eggGroup_FAIRY); break; - case EGG_GROUP_GRASS : + case EGG_GROUP_GRASS: StringCopy(gStringVar2, sText_Stats_eggGroup_GRASS); break; - case EGG_GROUP_HUMAN_LIKE : + case EGG_GROUP_HUMAN_LIKE: StringCopy(gStringVar2, sText_Stats_eggGroup_HUMAN_LIKE); break; - case EGG_GROUP_WATER_3 : + case EGG_GROUP_WATER_3: StringCopy(gStringVar2, sText_Stats_eggGroup_WATER_3); break; - case EGG_GROUP_MINERAL : + case EGG_GROUP_MINERAL: StringCopy(gStringVar2, sText_Stats_eggGroup_MINERAL); break; - case EGG_GROUP_AMORPHOUS : + case EGG_GROUP_AMORPHOUS: StringCopy(gStringVar2, sText_Stats_eggGroup_AMORPHOUS); break; - case EGG_GROUP_WATER_2 : + case EGG_GROUP_WATER_2: StringCopy(gStringVar2, sText_Stats_eggGroup_WATER_2); break; - case EGG_GROUP_DITTO : + case EGG_GROUP_DITTO: StringCopy(gStringVar2, sText_Stats_eggGroup_DITTO); break; - case EGG_GROUP_DRAGON : + case EGG_GROUP_DRAGON: StringCopy(gStringVar2, sText_Stats_eggGroup_DRAGON); break; case EGG_GROUP_NO_EGGS_DISCOVERED: StringCopy(gStringVar2, sText_Stats_eggGroup_NO_EGGS_DISCOVERED); break; + default: + StringCopy(gStringVar2, sText_Stats_eggGroup_UNKNOWN); + break; } StringExpandPlaceholders(gStringVar3, sText_Stats_eggGroup_Groups); align_x = GetStringRightAlignXOffset(0, gStringVar3, total_x); @@ -6669,7 +6676,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_RECOIL_DAMAGE_FEMALE); break; default: - StringExpandPlaceholders(gStringVar4, sText_EVO_UNKNOWN ); + StringExpandPlaceholders(gStringVar4, sText_EVO_UNKNOWN); break; }//Switch end PrintInfoScreenTextSmall(gStringVar4, base_x + depth_x*depth+base_x_offset, base_y + base_y_offset*(*depth_i)); //Print actual instructions From 2e07dbb0eeaee0fc376d22bdbc9834b941209714 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sun, 26 May 2024 15:20:51 -0500 Subject: [PATCH 28/34] Add Gen 9 and PLA footprints + update some footprints (#4621) * PLA footprints * Gen 9 Starters * Gen 9 Cross Gen Evos * Question mark * Gen 9 regular mons * Gen 9 Paradox mons * Gen 9 legendaries and mythicals * Past gen mon footprint changes --- graphics/pokemon/annihilape/footprint.png | Bin 0 -> 135 bytes graphics/pokemon/arboliva/footprint.png | Bin 0 -> 118 bytes graphics/pokemon/archaludon/footprint.png | Bin 0 -> 119 bytes graphics/pokemon/arctibax/footprint.png | Bin 0 -> 135 bytes graphics/pokemon/armarouge/footprint.png | Bin 0 -> 113 bytes graphics/pokemon/basculegion/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/baxcalibur/footprint.png | Bin 0 -> 131 bytes graphics/pokemon/bellibolt/footprint.png | Bin 0 -> 121 bytes graphics/pokemon/bombirdier/footprint.png | Bin 0 -> 146 bytes graphics/pokemon/brambleghast/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/bramblin/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/brute_bonnet/footprint.png | Bin 0 -> 119 bytes graphics/pokemon/capsakid/footprint.png | Bin 0 -> 116 bytes graphics/pokemon/ceruledge/footprint.png | Bin 0 -> 113 bytes graphics/pokemon/cetitan/footprint.png | Bin 0 -> 132 bytes graphics/pokemon/cetoddle/footprint.png | Bin 0 -> 119 bytes graphics/pokemon/charcadet/footprint.png | Bin 0 -> 113 bytes graphics/pokemon/chi_yu/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/chien_pao/footprint.png | Bin 0 -> 121 bytes graphics/pokemon/clodsire/footprint.png | Bin 0 -> 125 bytes graphics/pokemon/crocalor/footprint.png | Bin 0 -> 124 bytes graphics/pokemon/cyclizar/footprint.png | Bin 0 -> 135 bytes graphics/pokemon/dachsbun/footprint.png | Bin 0 -> 127 bytes graphics/pokemon/dipplin/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/dolliv/footprint.png | Bin 0 -> 112 bytes graphics/pokemon/dondozo/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/dudunsparce/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/enamorus/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/espathra/footprint.png | Bin 0 -> 131 bytes graphics/pokemon/farigiraf/footprint.png | Bin 0 -> 121 bytes graphics/pokemon/fezandipiti/footprint.png | Bin 0 -> 135 bytes graphics/pokemon/fidough/footprint.png | Bin 0 -> 121 bytes graphics/pokemon/finizen/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/flamigo/footprint.png | Bin 0 -> 133 bytes graphics/pokemon/flittle/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/floragato/footprint.png | Bin 0 -> 137 bytes graphics/pokemon/flutter_mane/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/frigibax/footprint.png | Bin 0 -> 136 bytes graphics/pokemon/fuecoco/footprint.png | Bin 0 -> 126 bytes graphics/pokemon/garganacl/footprint.png | Bin 0 -> 116 bytes graphics/pokemon/gholdengo/footprint.png | Bin 0 -> 148 bytes graphics/pokemon/gimmighoul/footprint.png | Bin 0 -> 101 bytes .../pokemon/gimmighoul/roaming/footprint.png | Bin 0 -> 113 bytes .../pokemon/giratina/origin/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/glimmet/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/glimmora/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/golem/footprint.png | Bin 114 -> 136 bytes graphics/pokemon/gouging_fire/footprint.png | Bin 0 -> 128 bytes graphics/pokemon/grafaiai/footprint.png | Bin 0 -> 123 bytes graphics/pokemon/great_tusk/footprint.png | Bin 0 -> 139 bytes graphics/pokemon/greavard/footprint.png | Bin 0 -> 137 bytes graphics/pokemon/houndstone/footprint.png | Bin 0 -> 144 bytes graphics/pokemon/hydrapple/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/iron_boulder/footprint.png | Bin 0 -> 122 bytes graphics/pokemon/iron_bundle/footprint.png | Bin 0 -> 122 bytes graphics/pokemon/iron_crown/footprint.png | Bin 0 -> 125 bytes graphics/pokemon/iron_hands/footprint.png | Bin 0 -> 131 bytes graphics/pokemon/iron_jugulis/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/iron_leaves/footprint.png | Bin 0 -> 120 bytes graphics/pokemon/iron_moth/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/iron_thorns/footprint.png | Bin 0 -> 2747 bytes graphics/pokemon/iron_treads/footprint.png | Bin 0 -> 125 bytes graphics/pokemon/iron_valiant/footprint.png | Bin 0 -> 127 bytes graphics/pokemon/kilowattrel/footprint.png | Bin 0 -> 141 bytes graphics/pokemon/kingambit/footprint.png | Bin 0 -> 125 bytes graphics/pokemon/klawf/footprint.png | Bin 0 -> 118 bytes graphics/pokemon/kleavor/footprint.png | Bin 0 -> 127 bytes graphics/pokemon/koraidon/footprint.png | Bin 0 -> 145 bytes graphics/pokemon/lechonk/footprint.png | Bin 0 -> 118 bytes graphics/pokemon/lokix/footprint.png | Bin 0 -> 117 bytes graphics/pokemon/ludicolo/footprint.png | Bin 111 -> 126 bytes graphics/pokemon/mabosstiff/footprint.png | Bin 0 -> 120 bytes graphics/pokemon/maschiff/footprint.png | Bin 0 -> 117 bytes graphics/pokemon/maushold/footprint.png | Bin 0 -> 120 bytes graphics/pokemon/maushold/four/footprint.png | Bin 0 -> 122 bytes graphics/pokemon/mawile/footprint.png | Bin 160 -> 129 bytes graphics/pokemon/meowscarada/footprint.png | Bin 0 -> 137 bytes graphics/pokemon/miraidon/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/munkidori/footprint.png | Bin 0 -> 135 bytes graphics/pokemon/nacli/footprint.png | Bin 0 -> 109 bytes graphics/pokemon/naclstack/footprint.png | Bin 0 -> 124 bytes graphics/pokemon/nymble/footprint.png | Bin 0 -> 113 bytes graphics/pokemon/ogerpon/footprint.png | Bin 0 -> 124 bytes graphics/pokemon/oinkologne/footprint.png | Bin 0 -> 129 bytes graphics/pokemon/okidogi/footprint.png | Bin 0 -> 125 bytes graphics/pokemon/orthworm/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/overqwil/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/palafin/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/pawmi/footprint.png | Bin 0 -> 114 bytes graphics/pokemon/pawmo/footprint.png | Bin 0 -> 117 bytes graphics/pokemon/pawmot/footprint.png | Bin 0 -> 118 bytes graphics/pokemon/pecharunt/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/poltchageist/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/quaquaval/footprint.png | Bin 0 -> 130 bytes graphics/pokemon/quaxly/footprint.png | Bin 0 -> 125 bytes graphics/pokemon/quaxwell/footprint.png | Bin 0 -> 124 bytes graphics/pokemon/question_mark/footprint.png | Bin 127 -> 124 bytes graphics/pokemon/rabsca/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/raging_bolt/footprint.png | Bin 0 -> 123 bytes graphics/pokemon/rellor/footprint.png | Bin 0 -> 113 bytes graphics/pokemon/revavroom/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/roaring_moon/footprint.png | Bin 0 -> 147 bytes graphics/pokemon/sandy_shocks/footprint.png | Bin 0 -> 135 bytes graphics/pokemon/scovillain/footprint.png | Bin 0 -> 122 bytes graphics/pokemon/scream_tail/footprint.png | Bin 0 -> 120 bytes graphics/pokemon/shroodle/footprint.png | Bin 0 -> 116 bytes graphics/pokemon/shroomish/footprint.png | Bin 104 -> 119 bytes graphics/pokemon/sinistcha/footprint.png | Bin 0 -> 112 bytes graphics/pokemon/skeledirge/footprint.png | Bin 0 -> 132 bytes graphics/pokemon/slither_wing/footprint.png | Bin 0 -> 125 bytes graphics/pokemon/smoliv/footprint.png | Bin 0 -> 106 bytes graphics/pokemon/sneasler/footprint.png | Bin 0 -> 134 bytes graphics/pokemon/spidops/footprint.png | Bin 0 -> 121 bytes graphics/pokemon/sprigatito/footprint.png | Bin 0 -> 131 bytes graphics/pokemon/squawkabilly/footprint.png | Bin 0 -> 137 bytes graphics/pokemon/tadbulb/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/tandemaus/footprint.png | Bin 0 -> 116 bytes graphics/pokemon/tarountula/footprint.png | Bin 0 -> 112 bytes graphics/pokemon/tatsugiri/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/terapagos/footprint.png | Bin 0 -> 118 bytes .../pokemon/terapagos/stellar/footprint.png | Bin 0 -> 101 bytes .../pokemon/terapagos/terastal/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/ting_lu/footprint.png | Bin 0 -> 124 bytes graphics/pokemon/tinkatink/footprint.png | Bin 0 -> 117 bytes graphics/pokemon/tinkaton/footprint.png | Bin 0 -> 126 bytes graphics/pokemon/tinkatuff/footprint.png | Bin 0 -> 122 bytes graphics/pokemon/toedscool/footprint.png | Bin 0 -> 114 bytes graphics/pokemon/toedscruel/footprint.png | Bin 0 -> 120 bytes graphics/pokemon/ursaluna/footprint.png | Bin 0 -> 139 bytes graphics/pokemon/varoom/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/veluza/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/walking_wake/footprint.png | Bin 0 -> 136 bytes graphics/pokemon/wattrel/footprint.png | Bin 0 -> 127 bytes graphics/pokemon/wiglett/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/wo_chien/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/wugtrio/footprint.png | Bin 0 -> 101 bytes graphics/pokemon/wyrdeer/footprint.png | Bin 0 -> 128 bytes src/data/graphics/pokemon.h | 275 +++++++++--------- src/data/pokemon/species_info.h | 3 +- .../pokemon/species_info/gen_1_families.h | 4 +- .../pokemon/species_info/gen_2_families.h | 18 +- .../pokemon/species_info/gen_4_families.h | 4 +- .../pokemon/species_info/gen_5_families.h | 6 +- .../pokemon/species_info/gen_8_families.h | 10 +- .../pokemon/species_info/gen_9_families.h | 250 ++++++++-------- 145 files changed, 293 insertions(+), 277 deletions(-) create mode 100644 graphics/pokemon/annihilape/footprint.png create mode 100644 graphics/pokemon/arboliva/footprint.png create mode 100644 graphics/pokemon/archaludon/footprint.png create mode 100644 graphics/pokemon/arctibax/footprint.png create mode 100644 graphics/pokemon/armarouge/footprint.png create mode 100644 graphics/pokemon/basculegion/footprint.png create mode 100644 graphics/pokemon/baxcalibur/footprint.png create mode 100644 graphics/pokemon/bellibolt/footprint.png create mode 100644 graphics/pokemon/bombirdier/footprint.png create mode 100644 graphics/pokemon/brambleghast/footprint.png create mode 100644 graphics/pokemon/bramblin/footprint.png create mode 100644 graphics/pokemon/brute_bonnet/footprint.png create mode 100644 graphics/pokemon/capsakid/footprint.png create mode 100644 graphics/pokemon/ceruledge/footprint.png create mode 100644 graphics/pokemon/cetitan/footprint.png create mode 100644 graphics/pokemon/cetoddle/footprint.png create mode 100644 graphics/pokemon/charcadet/footprint.png create mode 100644 graphics/pokemon/chi_yu/footprint.png create mode 100644 graphics/pokemon/chien_pao/footprint.png create mode 100644 graphics/pokemon/clodsire/footprint.png create mode 100644 graphics/pokemon/crocalor/footprint.png create mode 100644 graphics/pokemon/cyclizar/footprint.png create mode 100644 graphics/pokemon/dachsbun/footprint.png create mode 100644 graphics/pokemon/dipplin/footprint.png create mode 100644 graphics/pokemon/dolliv/footprint.png create mode 100644 graphics/pokemon/dondozo/footprint.png create mode 100644 graphics/pokemon/dudunsparce/footprint.png create mode 100644 graphics/pokemon/enamorus/footprint.png create mode 100644 graphics/pokemon/espathra/footprint.png create mode 100644 graphics/pokemon/farigiraf/footprint.png create mode 100644 graphics/pokemon/fezandipiti/footprint.png create mode 100644 graphics/pokemon/fidough/footprint.png create mode 100644 graphics/pokemon/finizen/footprint.png create mode 100644 graphics/pokemon/flamigo/footprint.png create mode 100644 graphics/pokemon/flittle/footprint.png create mode 100644 graphics/pokemon/floragato/footprint.png create mode 100644 graphics/pokemon/flutter_mane/footprint.png create mode 100644 graphics/pokemon/frigibax/footprint.png create mode 100644 graphics/pokemon/fuecoco/footprint.png create mode 100644 graphics/pokemon/garganacl/footprint.png create mode 100644 graphics/pokemon/gholdengo/footprint.png create mode 100644 graphics/pokemon/gimmighoul/footprint.png create mode 100644 graphics/pokemon/gimmighoul/roaming/footprint.png create mode 100644 graphics/pokemon/giratina/origin/footprint.png create mode 100644 graphics/pokemon/glimmet/footprint.png create mode 100644 graphics/pokemon/glimmora/footprint.png create mode 100644 graphics/pokemon/gouging_fire/footprint.png create mode 100644 graphics/pokemon/grafaiai/footprint.png create mode 100644 graphics/pokemon/great_tusk/footprint.png create mode 100644 graphics/pokemon/greavard/footprint.png create mode 100644 graphics/pokemon/houndstone/footprint.png create mode 100644 graphics/pokemon/hydrapple/footprint.png create mode 100644 graphics/pokemon/iron_boulder/footprint.png create mode 100644 graphics/pokemon/iron_bundle/footprint.png create mode 100644 graphics/pokemon/iron_crown/footprint.png create mode 100644 graphics/pokemon/iron_hands/footprint.png create mode 100644 graphics/pokemon/iron_jugulis/footprint.png create mode 100644 graphics/pokemon/iron_leaves/footprint.png create mode 100644 graphics/pokemon/iron_moth/footprint.png create mode 100644 graphics/pokemon/iron_thorns/footprint.png create mode 100644 graphics/pokemon/iron_treads/footprint.png create mode 100644 graphics/pokemon/iron_valiant/footprint.png create mode 100644 graphics/pokemon/kilowattrel/footprint.png create mode 100644 graphics/pokemon/kingambit/footprint.png create mode 100644 graphics/pokemon/klawf/footprint.png create mode 100644 graphics/pokemon/kleavor/footprint.png create mode 100644 graphics/pokemon/koraidon/footprint.png create mode 100644 graphics/pokemon/lechonk/footprint.png create mode 100644 graphics/pokemon/lokix/footprint.png create mode 100644 graphics/pokemon/mabosstiff/footprint.png create mode 100644 graphics/pokemon/maschiff/footprint.png create mode 100644 graphics/pokemon/maushold/footprint.png create mode 100644 graphics/pokemon/maushold/four/footprint.png create mode 100644 graphics/pokemon/meowscarada/footprint.png create mode 100644 graphics/pokemon/miraidon/footprint.png create mode 100644 graphics/pokemon/munkidori/footprint.png create mode 100644 graphics/pokemon/nacli/footprint.png create mode 100644 graphics/pokemon/naclstack/footprint.png create mode 100644 graphics/pokemon/nymble/footprint.png create mode 100644 graphics/pokemon/ogerpon/footprint.png create mode 100644 graphics/pokemon/oinkologne/footprint.png create mode 100644 graphics/pokemon/okidogi/footprint.png create mode 100644 graphics/pokemon/orthworm/footprint.png create mode 100644 graphics/pokemon/overqwil/footprint.png create mode 100644 graphics/pokemon/palafin/footprint.png create mode 100644 graphics/pokemon/pawmi/footprint.png create mode 100644 graphics/pokemon/pawmo/footprint.png create mode 100644 graphics/pokemon/pawmot/footprint.png create mode 100644 graphics/pokemon/pecharunt/footprint.png create mode 100644 graphics/pokemon/poltchageist/footprint.png create mode 100644 graphics/pokemon/quaquaval/footprint.png create mode 100644 graphics/pokemon/quaxly/footprint.png create mode 100644 graphics/pokemon/quaxwell/footprint.png create mode 100644 graphics/pokemon/rabsca/footprint.png create mode 100644 graphics/pokemon/raging_bolt/footprint.png create mode 100644 graphics/pokemon/rellor/footprint.png create mode 100644 graphics/pokemon/revavroom/footprint.png create mode 100644 graphics/pokemon/roaring_moon/footprint.png create mode 100644 graphics/pokemon/sandy_shocks/footprint.png create mode 100644 graphics/pokemon/scovillain/footprint.png create mode 100644 graphics/pokemon/scream_tail/footprint.png create mode 100644 graphics/pokemon/shroodle/footprint.png create mode 100644 graphics/pokemon/sinistcha/footprint.png create mode 100644 graphics/pokemon/skeledirge/footprint.png create mode 100644 graphics/pokemon/slither_wing/footprint.png create mode 100644 graphics/pokemon/smoliv/footprint.png create mode 100644 graphics/pokemon/sneasler/footprint.png create mode 100644 graphics/pokemon/spidops/footprint.png create mode 100644 graphics/pokemon/sprigatito/footprint.png create mode 100644 graphics/pokemon/squawkabilly/footprint.png create mode 100644 graphics/pokemon/tadbulb/footprint.png create mode 100644 graphics/pokemon/tandemaus/footprint.png create mode 100644 graphics/pokemon/tarountula/footprint.png create mode 100644 graphics/pokemon/tatsugiri/footprint.png create mode 100644 graphics/pokemon/terapagos/footprint.png create mode 100644 graphics/pokemon/terapagos/stellar/footprint.png create mode 100644 graphics/pokemon/terapagos/terastal/footprint.png create mode 100644 graphics/pokemon/ting_lu/footprint.png create mode 100644 graphics/pokemon/tinkatink/footprint.png create mode 100644 graphics/pokemon/tinkaton/footprint.png create mode 100644 graphics/pokemon/tinkatuff/footprint.png create mode 100644 graphics/pokemon/toedscool/footprint.png create mode 100644 graphics/pokemon/toedscruel/footprint.png create mode 100644 graphics/pokemon/ursaluna/footprint.png create mode 100644 graphics/pokemon/varoom/footprint.png create mode 100644 graphics/pokemon/veluza/footprint.png create mode 100644 graphics/pokemon/walking_wake/footprint.png create mode 100644 graphics/pokemon/wattrel/footprint.png create mode 100644 graphics/pokemon/wiglett/footprint.png create mode 100644 graphics/pokemon/wo_chien/footprint.png create mode 100644 graphics/pokemon/wugtrio/footprint.png create mode 100644 graphics/pokemon/wyrdeer/footprint.png diff --git a/graphics/pokemon/annihilape/footprint.png b/graphics/pokemon/annihilape/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..e97bb4b6183bf19e6864c2b28056bc0dfea0a300 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CG_;us<^H96q`t3)Hi+nfT4r>_v f+LJ#^2{AC3moTJisz-DKwK90R`njxgN@xNA&2J_D literal 0 HcmV?d00001 diff --git a/graphics/pokemon/arboliva/footprint.png b/graphics/pokemon/arboliva/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..a5932a9eaecbecd6c00f814d518a4d351fca002b GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?ezopr0DlP~2><{9 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/archaludon/footprint.png b/graphics/pokemon/archaludon/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..c526325d906c2809b6dc34ad60de4ed661e8d742 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?fCa;us<^H90|n-@wSI$#4^cawn6^O{Y~0CHRzi85m@5GnhZP@bnQ- ODTAl0pUXO@geCw@!XN_x literal 0 HcmV?d00001 diff --git a/graphics/pokemon/arctibax/footprint.png b/graphics/pokemon/arctibax/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e07ad6fd8985ef9e3e43ab5d2cffa54f782a57 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CG_;us<^H90|n-N4AnU=xS3gfjPnjt0ww1_S0$hII^{oXUEtJQ+$E ed5#Y!GcjlcG5EAE;EDihW$<+Mb6Mw<&;$SA%3TZ+55y8uT!a;!8#d?$2*%uV aVQ0`h%n+m#qTLGA#^CAd=d#Wzp$PyABO^Ni literal 0 HcmV?d00001 diff --git a/graphics/pokemon/bellibolt/footprint.png b/graphics/pokemon/bellibolt/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..32c340152b8087fbd870fcffdf7e04a7444af177 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B`;;us<^H90{++`!0a(dR(d3#<~77hN)x8ea18On=18prFOzut&ef Q0H~P3)78&qol`;+0H=N+L;wH) literal 0 HcmV?d00001 diff --git a/graphics/pokemon/bombirdier/footprint.png b/graphics/pokemon/bombirdier/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..2389712efb9a06fbbc84925e978da75faeaface5 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC}QR5;us<^HTO)k5Q74TQ{cOQ=CPN(kN(gTe~DWM4fz1lEh literal 0 HcmV?d00001 diff --git a/graphics/pokemon/brambleghast/footprint.png b/graphics/pokemon/brambleghast/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/bramblin/footprint.png b/graphics/pokemon/bramblin/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/brute_bonnet/footprint.png b/graphics/pokemon/brute_bonnet/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..5bafea57811831ba3fc92765e69727b8af7aeb9f GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?fCa;us<^H90{+*r18QO5U?&qM&b!6qCfZgk8-}KvPs1+-l9|r2&;P Nc)I$ztaD0e0st=#9vJ`t literal 0 HcmV?d00001 diff --git a/graphics/pokemon/capsakid/footprint.png b/graphics/pokemon/capsakid/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..9cdf12b7d960ab97dcc0dfa0413aade007e4e4e1 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?ezO;us<^H928{VnRxa%k#w@21%j^mNQ@W(PC!cFJ_SWc=pQ`pgIOm LS3j3^P6@b0rfF>y85}Sb4q9e08h#!O#lD@ literal 0 HcmV?d00001 diff --git a/graphics/pokemon/cetoddle/footprint.png b/graphics/pokemon/cetoddle/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..ede12242e3ce75f32c718761de719170ef6dcd97 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?fCa;us<^H928{SON=kid|C+N5fQu0JVlZjkc{KObikQ47$$O*B1ko OGI+ZBxvXFVdQ I&MBb@0L&~OD*ylh literal 0 HcmV?d00001 diff --git a/graphics/pokemon/chi_yu/footprint.png b/graphics/pokemon/chi_yu/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/chien_pao/footprint.png b/graphics/pokemon/chien_pao/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..d99c06cccc0d64abea55334b8b6b09a92a688a7f GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B`;;us<^H90{++@MKONS>*H+rVg1=LE%uOm1eY`9=&3Dpwes?$nvg Q0V-zjboFyt=akR{0A|G=_VJE{fYl#a#D;OE9A21Y8 TzajSusGh;o)z4*}Q$iB}-%24^ literal 0 HcmV?d00001 diff --git a/graphics/pokemon/cyclizar/footprint.png b/graphics/pokemon/cyclizar/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb669eee37981484f1a3612689ae9d7c1425ad8 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CG_;us<^H90|n%fQGeiNnB1f#sk~ilEyZr4zFf7@S#r*?m}*+r)U3 eB`*A2!pLCwks)^T_kvA8tqh*7elF{r5}E)$LL>+P literal 0 HcmV?d00001 diff --git a/graphics/pokemon/dachsbun/footprint.png b/graphics/pokemon/dachsbun/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..38c40c9b1f78d371d372a3bcec4a6f0cb378aacc GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CD^;us<^H90|n+rWrPkmK;rf(B>S7+x!RMW+ac!#qBWY$bM?3=G=8 W8T{1`lr{miFnGH9xvXgTe~ HDWM4frLG>K literal 0 HcmV?d00001 diff --git a/graphics/pokemon/dondozo/footprint.png b/graphics/pokemon/dondozo/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/dudunsparce/footprint.png b/graphics/pokemon/dudunsparce/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/enamorus/footprint.png b/graphics/pokemon/enamorus/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/espathra/footprint.png b/graphics/pokemon/espathra/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..79ef25cf423fb230f4ddb8f573ee056a789bdb04 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CA@;us<^H90{+*ucn0NGvhIWwL7+bK2qzrd909BE}baj&5O9^73f# aU|f&V@H8iCS6KyZY8!EN)k*GQ7d>Egmy3}`cGl# Q1S)3mboFyt=akR{0GcBoXaE2J literal 0 HcmV?d00001 diff --git a/graphics/pokemon/finizen/footprint.png b/graphics/pokemon/finizen/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/flamigo/footprint.png b/graphics/pokemon/flamigo/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0c280bfef177a04527e18689bac9c116fbb82a GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5C4>;us<^H928{TtbS=bLDP^n+c3FB$S;R1Q*JvafmlEq$mgW92H1# ccs`kpK|z?oS!>STzopr09Mr`OaK4? literal 0 HcmV?d00001 diff --git a/graphics/pokemon/flittle/footprint.png b/graphics/pokemon/flittle/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/floragato/footprint.png b/graphics/pokemon/floragato/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..058111ad280343b7df93ec9bbf9e4f07e635b7dd GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC}Qa8;us<^H90{++F;Q~2}#L`Mb@$pu;g hECD4Bt|z{UFevad*j}@0wE${n@O1TaS?83{1OOW9CbIwl literal 0 HcmV?d00001 diff --git a/graphics/pokemon/flutter_mane/footprint.png b/graphics/pokemon/flutter_mane/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/frigibax/footprint.png b/graphics/pokemon/frigibax/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..9f1c1ac9992b801b0d7552682cb165b38fcc65fb GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC}QC0;us<^H90{+*uZGf=SHOyO+5k)4~!RZ85kKo5;(Ay<#Grc8xJE0 dmDuGmFsLkL@VLpm{{zXK)?KLZ$72t){IF$D66 sH=H_{+cv8|jd#=58GMIJtl}6L3`!WHVw|o{0h+_$>FVdQ&MBb@0E%lVssI20 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/gimmighoul/footprint.png b/graphics/pokemon/gimmighoul/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/gimmighoul/roaming/footprint.png b/graphics/pokemon/gimmighoul/roaming/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..afbe34b8475b2451f804da2a8e2f6431723dfb13 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?e_U;us<^H928{VnRxa%k#xu0%8XYnvXFs@H}7;)Ay8f1S(?iboFyt I=akR{0J^9h`Tzg` literal 0 HcmV?d00001 diff --git a/graphics/pokemon/giratina/origin/footprint.png b/graphics/pokemon/giratina/origin/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/glimmet/footprint.png b/graphics/pokemon/glimmet/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/glimmora/footprint.png b/graphics/pokemon/glimmora/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/golem/footprint.png b/graphics/pokemon/golem/footprint.png index c9f61444290bb9d6885ca773eaedfafb624feaa0..0db6de32c769f4509b8fe6fa7ca641eb5e7ee469 100644 GIT binary patch delta 101 zcmXTwV4NT!#=*?Mz@VYa9}J`zi-X*q7}lMWc{x#0)YZV##W6%;YI4E>E{TI2Gmmq) z888a;3wkmfV)l;H3@*tLPtxq)#mf0>>lqXaX9As0jFx$qf!K$93eUHx3vIVCg! E047`-zyJUM delta 96 zcmeBRESew@#mLOSz@TcIs|2Lj0(?ST|NsA=l$7-9+0jIxh`OhXV+hC0FVdQ&MBb@0K8`(7ytkO diff --git a/graphics/pokemon/gouging_fire/footprint.png b/graphics/pokemon/gouging_fire/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..c8be58fdd12e8c0949e6a4a354c6aa38dec8c97c GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsq{`F9F+^f&a)JVzfl}fcrko*El~y(|ga}VO(>k*; hM^jmO)lm^f2FYg(h8;%i_ko%jJYD@<);T3K0RSL3Cc^*# literal 0 HcmV?d00001 diff --git a/graphics/pokemon/houndstone/footprint.png b/graphics/pokemon/houndstone/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c40f1b34866e526dddfa60c361773a71e68e95 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC}QF1;us<^wX~m+i$Q^dIsgCvk_Sy`PYWLKxwgzt(QXv-I4&#@YWyJc o8;kM*g-!j>x{kX3s<&+u)7Z=46IA&(0cZw;r>mdKI;Vst0NqF}^8f$< literal 0 HcmV?d00001 diff --git a/graphics/pokemon/hydrapple/footprint.png b/graphics/pokemon/hydrapple/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/iron_boulder/footprint.png b/graphics/pokemon/iron_boulder/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..47710dbb1885c65e0147fe6253b21890fab416b7 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B));us<^H90{+%)n?-p(DfGeu2ak7vY7S3~gIy@G0{$Fc{8eh;|j7 Ra0jTG!PC{xWt~$(69BDiANBwM literal 0 HcmV?d00001 diff --git a/graphics/pokemon/iron_bundle/footprint.png b/graphics/pokemon/iron_bundle/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..f457d282528445b5d2c03c37b90b68481d274b0b GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B));us<^H90|n-@wSI$uN_t=Lf5V#6pQs&Q>O#7d15u4DvY)R=(Yz Rl7XrjJYD@<);T3K0RWihAD{pL literal 0 HcmV?d00001 diff --git a/graphics/pokemon/iron_crown/footprint.png b/graphics/pokemon/iron_crown/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..a41a305317f18d3137023afee47b54060d8bbc2d GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5C1=;us<^H90{+%)m%UAR)y?G!cS@7q&69>CSkkz{$X%l*ZtApF3O| PsDZ)L)z4*}Q$iB}-b5c< literal 0 HcmV?d00001 diff --git a/graphics/pokemon/iron_hands/footprint.png b/graphics/pokemon/iron_hands/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..18671be158c951da4828531d15ceac3eb52c53f1 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CA@;us<^H96q`qlBbnpkHkS&_f<`7&xmW3|J&C{M2~o a#LQq>!jMyY>R%sF8-u5-pUXO@geCw8=Om^8 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/iron_jugulis/footprint.png b/graphics/pokemon/iron_jugulis/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/iron_leaves/footprint.png b/graphics/pokemon/iron_leaves/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..2850ad76c8a984d8a406d13d8cd40151c1983c67 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5Bu$;us<^H90{+%)n^T=Zh{ESS2Jcy1YuJ@VVD_U zC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1Q zpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X z6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv1)yUy0P^?0*fb9UASvow z`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q{wNRKos+;6rV8ldy0Owz z(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E` zvOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G41dM~{UdP z6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4Es0sQWIt5*Tu0n&*J!lk~ zf_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+AA{TB3-ERLHar49hi4Ih z5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=natP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+e zdD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVb znL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0WMyP6Wy582WNT#4$d1qu znl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8dZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iutvy=3T65Yu+7a4Yv^%sX zb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i^lS773}6Fm1Fpe-gF!>I zp{*g$u-szvGhed; zvo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*ZvFf(^Xl-N7w{EeXveC4O zv)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChY zI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_WICNY@+|jrX%s^&6b2i>5 zeqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!ql}XcFH*PieWwLj2ZSq`7 zV9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I-?$tAVKYn8-l({mqQ$Q8{ zO!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;cwT88(J6|n-WB%w`m$h~4 zpmp)YIh_3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dlbFb#!9eY1iCsp6Bajj|H zr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syTu9enWavU5N9)I?I-1m1* z_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$mU2Q)a|9JSc+Uc4zvS-T9 z63!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;;JuhGEb?H5K#o@~7t9DmU zU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX=)z6+o0o6-+`4{y+3mqQ z%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@>;2q1Vm)$Z)P1z?N$8UY zW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHsy69KwU-!MxeeuI@&cF4| zM9z%AgL5^0000gNkl>h>FVdQ&MBb@07J?lK>z>% literal 0 HcmV?d00001 diff --git a/graphics/pokemon/iron_valiant/footprint.png b/graphics/pokemon/iron_valiant/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..63d1f9d64a91e0d8ff54c80b6465773db9cfb6fc GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CD^;us<^H90{+*ucnuNl<9MV3z=sK*PEA?f_?o!(u+=2|Gme85p#m WGKBLVdv*(`g~8L+&t;ucLK6TuG9kMF literal 0 HcmV?d00001 diff --git a/graphics/pokemon/kilowattrel/footprint.png b/graphics/pokemon/kilowattrel/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..4240923c424e5f6a0c46c5e2bfad5ba4da8a6422 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC}QgA;us<^wfDRu7lQ&1^T9X&?RBRlIlC0*&kfcJ)i~73oRPrX%w|!- lby0Lmx%Z*uU-D=Eb8Gi9cqe#1^amQi;OXk;vd$@?2>|(FDm(xH literal 0 HcmV?d00001 diff --git a/graphics/pokemon/kingambit/footprint.png b/graphics/pokemon/kingambit/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..3d73465ed9ae94fbdaf7acdf109cf65de4c6d340 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5C1=;us<^H927cgMm@fC&`IB9T-(iEq<(EiukcZ)L_Bqg>94g8Dwo4 VEY&?9?g46G@O1TaS?83{1ORqsBmw{c literal 0 HcmV?d00001 diff --git a/graphics/pokemon/klawf/footprint.png b/graphics/pokemon/klawf/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3814bedd96476858707f41fe845aa0bbdeb360 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?e0z|j?&9bnvZi>3d71h21& pi7->zVc(^m57WaF_p{U&Gnidw$av8Axd3PggQu&X%Q~loCIHitEZ6`5 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/lechonk/footprint.png b/graphics/pokemon/lechonk/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7b5845f8afecccb43461daacf9592b7ca0399a GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?eXfeINs MUHx3vIVCg!03OdCj{pDw literal 0 HcmV?d00001 diff --git a/graphics/pokemon/ludicolo/footprint.png b/graphics/pokemon/ludicolo/footprint.png index e5aa759abcd6b46c24beb819df1c19ee8f9986d3..a85dc2742fcd377d5d63c4eb495cf253be3ef61c 100644 GIT binary patch delta 90 zcmd0=n;;>^!OXzGprOkj45S!~gWR1M)}51iIZ;v6TFukNF+^f&a)N@m0TZK@d}PZ+ tL0^_LZlVqocCcL7l5nHxCEqCq2AMtv!}I5tR08!gc)I$ztaD0e0suGg8pQwr delta 92 zcmb=+pCA#=$jrdNplX||1fWX2*=FigoK0#)dv** uH#)v!ZobRUvWZ=Jfd$J)dj`d4Yzzgn_#a5EyDN8gf{sD P)iQXx`njxgN@xNALA)Lf literal 0 HcmV?d00001 diff --git a/graphics/pokemon/maschiff/footprint.png b/graphics/pokemon/maschiff/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..64cbfc512a144d1a90838bb90595c437efe998d6 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?f0W;us<^H928{Yyyi@h@NtnfHF&f%7KP+%YjCT7&BbP0l+XkK`l%h9 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/maushold/footprint.png b/graphics/pokemon/maushold/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..f35d7021d9810d7de2c56a62a57c82cf7a787c6a GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5Bu$;us<^H927cUqVVs%j5vN3A~D(A_okZ+g)2&G?*A<{xInGq*a^* Ps%7wW^>bP0l+XkKjRYV` literal 0 HcmV?d00001 diff --git a/graphics/pokemon/maushold/four/footprint.png b/graphics/pokemon/maushold/four/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..020c31fdb4de16f3315c7529612d2b88669decfa GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B));us<^H927cUqVVs%j5vN3A~D(A_okZciRf|L^l{QFv$5Z7}wf9 Rya!ax;OXk;vd$@?2>{dKAqoHh literal 0 HcmV?d00001 diff --git a/graphics/pokemon/mawile/footprint.png b/graphics/pokemon/mawile/footprint.png index 2aa7148e790c3c91b4a07021c034850d4d6777c1..3cd7a16a4c8bc879285349acf681e9fdff68d03b 100644 GIT binary patch delta 112 zcmZ3$*vL3RB9nuefq_9omp>RtF%}28J29*~C-V}>VGHmHasB`Qe^OG?t7k_Ofg+lo zE{-7*Q(m+iN Mp00i_>zopr0M@)8XaE2J delta 144 zcmZoVM%xNb!1@J*w6hZkrl{i3-AeX z{r~?zkQsXDavhN3EbxddW?vdJ;C?PFs5 m#~*OyUqjb@$pu;g hECD4Bt|z{UFevad*j}@0wE${n@O1TaS?83{1OOW9CbIwl literal 0 HcmV?d00001 diff --git a/graphics/pokemon/miraidon/footprint.png b/graphics/pokemon/miraidon/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/munkidori/footprint.png b/graphics/pokemon/munkidori/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..52b6602fcd0a9a8e7e16e6e444ddc6bbc8950b62 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CG_;us<^H90|n&%mfjz-Yc;&qPs!1sw)XR~Nis>|DT^@PU)tKtRZ$ e*h))YpMgPDl)52KqEcK`>2QUHU)^dt!mpaKR@S3j3^P69Z(U2r>mdK II;Vst0MVi!fB*mh literal 0 HcmV?d00001 diff --git a/graphics/pokemon/ogerpon/footprint.png b/graphics/pokemon/ogerpon/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc4bcbc9b3aebed9ca9b75cf5286cbc75abffd3 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B!&;us<^H90|n-@wSI$xvv%ppycpK~Qu9bP0l+XkK)8Zgc literal 0 HcmV?d00001 diff --git a/graphics/pokemon/oinkologne/footprint.png b/graphics/pokemon/oinkologne/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..d52b365f1d859d696ddb7d0ed484ac51879f022a GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B}<;us<^H90|n&%nuW&iNA@$2@A>I2u(Bc+6s8wwhnDeBlQ}ABBT1 Z49a^LELe3T-U2l-c)I$ztaD0e0s!tLBzOP- literal 0 HcmV?d00001 diff --git a/graphics/pokemon/okidogi/footprint.png b/graphics/pokemon/okidogi/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..73f8f47a40bc9271694dead809a4da4d81a0c7ee GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5C1=;us<^H90{+%)n^TM+J^^?OX;*EDIWH7}-kf1ethV)LddFVdQ&MBb@01nk4ssI20 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/orthworm/footprint.png b/graphics/pokemon/orthworm/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/overqwil/footprint.png b/graphics/pokemon/overqwil/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/palafin/footprint.png b/graphics/pokemon/palafin/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pawmi/footprint.png b/graphics/pokemon/pawmi/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..41a6a95d831403e0ea8fedff1fef6d5576e385ef GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?e(Q;us<^H928{R6>f1!hsVVYEEqo%XF`>GVuB`h_79BAEb)G)78&q Iol`;+0NE5C_5c6? literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pawmo/footprint.png b/graphics/pokemon/pawmo/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..ba420dc472f7a2cafdba11a0650620cbd60fa815 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?f0W;us<^H90{++F;RVNy(4g21biI1DqKyM|CkU2ybLi3CcVw3RKA8 M>FVdQ&MBb@045b52LJ#7 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pawmot/footprint.png b/graphics/pokemon/pawmot/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..62e330603c458654ed9a97f619c4bdbe5b7fdfff GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?emdKI;Vst09isH6#xJL literal 0 HcmV?d00001 diff --git a/graphics/pokemon/pecharunt/footprint.png b/graphics/pokemon/pecharunt/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/poltchageist/footprint.png b/graphics/pokemon/poltchageist/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/quaquaval/footprint.png b/graphics/pokemon/quaquaval/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa649f999210b6aecd80788aa3d9e8fdc905f78 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B-*;us<^H96q`lf*;=mj=NO2Z?j(Ey+c!20W_b3tp$Yml%QZ2cJ+6a*Qp UBCfkG25MmNboFyt=akR{01R#*M*si- literal 0 HcmV?d00001 diff --git a/graphics/pokemon/quaxwell/footprint.png b/graphics/pokemon/quaxwell/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..b4c98450a687a699669e5314ea0267260466c850 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B!&;us<^H90|n+dwI?gF#uK(Ljz-Lm{q#ajt(01GCk969xv=zYOkw TEiK;w)iZdy`njxgN@xNAu=F2b literal 0 HcmV?d00001 diff --git a/graphics/pokemon/question_mark/footprint.png b/graphics/pokemon/question_mark/footprint.png index 8da752a46b30d4f1163cdadd9b84f2d418bd9e75..9a019bb167415b95f7b383b107dc8c5312e5b786 100644 GIT binary patch delta 88 zcmb=gnIIv?!OXzGprOkj45S!~gWR1M)}51iIZ;v6QpMB7F+^f&a)N@m0TZK^e3Kv( qPX-fD1PjMUL)HxzEh)M?7#a93Fi14spF07lo59o7&t;ucLK6U%02YD( delta 108 zcmb=apCFOW$jrdNplX||1fqF^Wx`?lCINxVByq8Z1)U|PzMzQ%x2 Q7^s}V)78&qol`;+0IK63761SM literal 0 HcmV?d00001 diff --git a/graphics/pokemon/rellor/footprint.png b/graphics/pokemon/rellor/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..851236799344a1936b1100b7200d7b09bbfbf059 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?e_U;us<^H928{VnRxa$_aPDq!g7Ut=AYBxYsaW$<+Mb6Mw<&;$VFjVBub literal 0 HcmV?d00001 diff --git a/graphics/pokemon/scovillain/footprint.png b/graphics/pokemon/scovillain/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0f6e16af8734775c30ee06fefd337e2f4f197d GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B));us<^H90{++Q4Yh=Zh{ESS2I_T_q$hx~x!aNaW6BV322Ku$OP0 RU<*{u;OXk;vd$@?2>`k!AEN*O literal 0 HcmV?d00001 diff --git a/graphics/pokemon/scream_tail/footprint.png b/graphics/pokemon/scream_tail/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..dbef95b02e4e95adbc9fd643bb47396a6f6c24ae GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5Bu$;us<^H90{++F((!WMHd=V}lqIPX(*Qg`YE+Di|0gTe~DWM4fXxtx; literal 0 HcmV?d00001 diff --git a/graphics/pokemon/shroodle/footprint.png b/graphics/pokemon/shroodle/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..9cdf12b7d960ab97dcc0dfa0413aade007e4e4e1 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?ezO;us<^H928{VnRxa%k#w@21%j^mNQ@W(PC!cFJ_SWc=pQ`pgIOm LS3j3^P64@jgp?GQ=ZiZG lj23k!a3o|LG?}8rz`*yJLH^)g1%9AL22WQ%mvv4FO#reC7)SsB delta 85 zcmXTVm>?0r$jrdNplX||1f_k_RKwuu>gTe~ HDWM4fp6oI)W1v0;Pgg&ebxsLQ05zl}S^xk5 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/slither_wing/footprint.png b/graphics/pokemon/slither_wing/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..874f7e0ce9bf7f666e9e2761a6e2cb8b9dea43c6 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5C1=;us<^H90{+-oVIcQDLBq#6=bm>J&SW$+B#zfZ(UUEDS2=7+e$0 St6YH^7(8A5T-G@yGywo5D literal 0 HcmV?d00001 diff --git a/graphics/pokemon/sneasler/footprint.png b/graphics/pokemon/sneasler/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..de724e5ffd7fe08cc752845e7a0e4017f0dc5c57 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B@-;us<^H90|n%ixee&v_0P1)qrwA`3n*RO;z@p(GK-F{@F)=_8La evyr?c1B1~dhKvKR!p;MAGI+ZBxvXzopr0G@#$kN^Mx literal 0 HcmV?d00001 diff --git a/graphics/pokemon/sprigatito/footprint.png b/graphics/pokemon/sprigatito/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..abc95f45ccbb89adfe85fdaa5871a6fe053d9b34 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5CA@;us<^H90{++`!0aQK4jDi-SxGqlUQRA&$^SorWyEHZGrNi3>kP am>3l1F<9L?TmA*8jlt8^&t;ucLK6Vm4+z9${Ub<|3Hj@O*LRfn`jWIe4NC hVj7bS68A4)U{DTWa1@mLRSeY3;OXk;vd$@?2>?4jCu9Hs literal 0 HcmV?d00001 diff --git a/graphics/pokemon/tadbulb/footprint.png b/graphics/pokemon/tadbulb/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/tandemaus/footprint.png b/graphics/pokemon/tandemaus/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..172901f83de6a80dc425e208f5d2c42660367490 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?ezO;us<^H928{ctT1_%j5vN3A~D(A_okbe=#tK2{34LXgr?}RL9`y L>gTe~DWM4f4j>-a literal 0 HcmV?d00001 diff --git a/graphics/pokemon/tarountula/footprint.png b/graphics/pokemon/tarountula/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fbd6c15c66cf9d04a13ea89d1090276e9e13b4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?etM;us<^H928{dP0iJ^TnMB90?f<4H+2N3mABh+>_k_RKwuu>gTe~ HDWM4fpVmqBPHgYwhs$Ju}? O89ZJ6T-G@yGywo%2_UWj literal 0 HcmV?d00001 diff --git a/graphics/pokemon/terapagos/stellar/footprint.png b/graphics/pokemon/terapagos/stellar/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/terapagos/terastal/footprint.png b/graphics/pokemon/terapagos/terastal/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/ting_lu/footprint.png b/graphics/pokemon/ting_lu/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..4990ad586f814fa876ca3266aefb78afdb418795 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B!&;us<^H90|n%fQH}$uN%5Errp|%|vh(M?wU*sN%Ws2nGg&2Ml2% TuRYHL)iZdy`njxgN@xNAwx1tu literal 0 HcmV?d00001 diff --git a/graphics/pokemon/tinkatink/footprint.png b/graphics/pokemon/tinkatink/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..9b369e78dcb91ab5c65ef71286fa98d6ca65402b GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?f0W;us<^H928{Yyt~YiCq^*hqDL6Y(&{tpbY5xmDH0TnWM My85}Sb4q9e0Q7GiZvX%Q literal 0 HcmV?d00001 diff --git a/graphics/pokemon/tinkaton/footprint.png b/graphics/pokemon/tinkaton/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..08b25e2c6b19e56c28b8f54e7ccca701baed9bd4 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B=+;us<^H90{+*r18gN?!5Mi4HZU#6?^Rffg(VTOMp++kV)CnL)FF V!ME;4Up7z&gQu&X%Q~loCICgaB31wZ literal 0 HcmV?d00001 diff --git a/graphics/pokemon/tinkatuff/footprint.png b/graphics/pokemon/tinkatuff/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..48f91a2703dc2d8755be1b48a9affab66de5579b GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5B));us<^H928{R00cAiQOiS8O=IOiI2n`E;l7=EZaJTkwGkgL38&f R^Tj~b44$rjF6*2UngHK|A>9A~ literal 0 HcmV?d00001 diff --git a/graphics/pokemon/toedscool/footprint.png b/graphics/pokemon/toedscool/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..62c7136a642c655ae5a6c00f5261899d056e6c33 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC?e(Q;us<^H928{TtbS=^TnM3&J2ged>FkL82C*Yr0t$sF9ND!@O1Ta JS?83{1OUc59lZbm literal 0 HcmV?d00001 diff --git a/graphics/pokemon/toedscruel/footprint.png b/graphics/pokemon/toedscruel/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..49599c855577e03d575e398bee5a6b0b87fdcfb6 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsD5Bu$;us<^H90{++Q4Yh=Rj8p$%`&01P&O81T!3#6=7r$f5D*nCt}4K Ppjrk`S3j3^P6`Y1hXcFz#au2wF_I6&m^)ivzgdAwM-QB iZP~!kCOKo<16BrgcZMM2WVJG&b_P#ZKbLh*2~7a~r6mLa literal 0 HcmV?d00001 diff --git a/graphics/pokemon/varoom/footprint.png b/graphics/pokemon/varoom/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/veluza/footprint.png b/graphics/pokemon/veluza/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e48b0e830be051e801b9403841fc4d84e5705 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j uCnY7ldUiAsD8lRM;us<^H90|o^#o9{00X1($&Xn;2?kGBKbLh*2~7YlDj356 literal 0 HcmV?d00001 diff --git a/graphics/pokemon/walking_wake/footprint.png b/graphics/pokemon/walking_wake/footprint.png new file mode 100644 index 0000000000000000000000000000000000000000..b359e266ea8c56d67d83dcba61b44d975b40152e GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~wg8_H*Z=?j zCnY7ldUiAsC}QC0;us<^H90|n$-w9kM~za?3Z)(e!4`%Y%xo5}8#EJL!Vh(Lb2883 fSj8Uja|a`X4j)6f%A<5&pk4+~S3j3^P6 Date: Sun, 26 May 2024 16:23:04 -0400 Subject: [PATCH 29/34] Belch AI Scoring Fix (#4616) * Belch scoring fix and test * Add assumptions for pocket * Update test to AI_SINGLE_BATTLE_TEST * Alex's fixes * Missed reverting a line * Mucked up spacing mb * Mucked up the spacing fix mb MB --- include/battle_util.h | 1 + src/battle_ai_util.c | 2 +- src/battle_script_commands.c | 2 + src/battle_util.c | 2 +- test/battle/move_effect/belch.c | 52 ++++++++++++++++++++++++++ test/battle/move_effect/stuff_cheeks.c | 26 ------------- 6 files changed, 57 insertions(+), 28 deletions(-) create mode 100644 test/battle/move_effect/belch.c diff --git a/include/battle_util.h b/include/battle_util.h index d6ed8b3427..a5349a7c2a 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -202,6 +202,7 @@ u8 GetBattleMoveCategory(u32 moveId); bool32 CanFling(u32 battler); bool32 IsTelekinesisBannedSpecies(u16 species); bool32 IsHealBlockPreventingMove(u32 battler, u32 move); +bool32 IsBelchPreventingMove(u32 battler, u32 move); bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId); bool32 IsPartnerMonFromSameTrainer(u32 battler); u8 GetCategoryBasedOnStats(u32 battler); diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index b99339d16e..84bd85e3bb 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -426,7 +426,7 @@ bool32 IsDamageMoveUnusable(u32 move, u32 battlerAtk, u32 battlerDef) return TRUE; break; case EFFECT_BELCH: - if (ItemId_GetPocket(GetUsedHeldItem(battlerAtk)) != POCKET_BERRIES) + if (IsBelchPreventingMove(battlerAtk, move)) return TRUE; break; case EFFECT_LAST_RESORT: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index af1bcfe1aa..01035e5c12 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2189,6 +2189,7 @@ static void Cmd_multihitresultmessage(void) if (gSpecialStatuses[gBattlerTarget].berryReduced && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { + gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[gBattlerTarget]]; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; @@ -2649,6 +2650,7 @@ static void Cmd_resultmessage(void) if (gSpecialStatuses[gBattlerTarget].berryReduced && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { + gBattleStruct->ateBerry[gBattlerTarget & BIT_SIDE] |= gBitTable[gBattlerPartyIndexes[gBattlerTarget]]; gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_PrintBerryReduceString; diff --git a/src/battle_util.c b/src/battle_util.c index 8cda4c4ecc..1fe6facf12 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1262,7 +1262,7 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move) return gMovesInfo[move].healingMove; } -static bool32 IsBelchPreventingMove(u32 battler, u32 move) +bool32 IsBelchPreventingMove(u32 battler, u32 move) { if (gMovesInfo[move].effect != EFFECT_BELCH) return FALSE; diff --git a/test/battle/move_effect/belch.c b/test/battle/move_effect/belch.c new file mode 100644 index 0000000000..34e026abe5 --- /dev/null +++ b/test/battle/move_effect/belch.c @@ -0,0 +1,52 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gMovesInfo[MOVE_BELCH].effect == EFFECT_BELCH); + ASSUME(gMovesInfo[MOVE_MUD_SHOT].type == TYPE_GROUND); + ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].holdEffect == HOLD_EFFECT_RESIST_BERRY); + ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].holdEffectParam == TYPE_GROUND); + ASSUME(gItemsInfo[ITEM_SHUCA_BERRY].pocket == POCKET_BERRIES); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].pocket == POCKET_BERRIES); +} + +AI_SINGLE_BATTLE_TEST("AI: Belch has nonzero score after eating a berry") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_BAYLEEF) { Level(18); Moves(MOVE_MUD_SHOT, MOVE_TACKLE); } + OPPONENT(SPECIES_PIKACHU) { Level(15); Item(ITEM_SHUCA_BERRY); Moves(MOVE_BELCH, MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_MUD_SHOT); EXPECT_MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_BELCH);} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELCH, opponent); + } +} + +SINGLE_BATTLE_TEST("Belch cannot be used if the user has not eaten a berry") +{ + u16 item = 0; + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_ORAN_BERRY; } + GIVEN { + PLAYER(SPECIES_SKWOVET) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (item == ITEM_NONE) + TURN { MOVE(player, MOVE_BELCH, allowed: FALSE); MOVE(player, MOVE_CELEBRATE); } + else { + TURN { MOVE(player, MOVE_STUFF_CHEEKS); } + TURN { MOVE(player, MOVE_BELCH); } + } + } SCENE { + if (item == ITEM_NONE) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } + else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STUFF_CHEEKS, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELCH, player); + } + } +} diff --git a/test/battle/move_effect/stuff_cheeks.c b/test/battle/move_effect/stuff_cheeks.c index a7a4ab1d34..3bb3f22925 100644 --- a/test/battle/move_effect/stuff_cheeks.c +++ b/test/battle/move_effect/stuff_cheeks.c @@ -103,29 +103,3 @@ SINGLE_BATTLE_TEST("Stuff Cheeks fails if the user's berry is removed before the MESSAGE("But it failed!"); } } - -SINGLE_BATTLE_TEST("Belch cannot be used if the user has not eaten a berry") -{ - u16 item = 0; - PARAMETRIZE { item = ITEM_NONE; } - PARAMETRIZE { item = ITEM_ORAN_BERRY; } - GIVEN { - PLAYER(SPECIES_SKWOVET) { Item(item); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - if (item == ITEM_NONE) - TURN { MOVE(player, MOVE_BELCH, allowed: FALSE); MOVE(player, MOVE_CELEBRATE); } - else { - TURN { MOVE(player, MOVE_STUFF_CHEEKS); } - TURN { MOVE(player, MOVE_BELCH); } - } - } SCENE { - if (item == ITEM_NONE) { - ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); - } - else { - ANIMATION(ANIM_TYPE_MOVE, MOVE_STUFF_CHEEKS, player); - ANIMATION(ANIM_TYPE_MOVE, MOVE_BELCH, player); - } - } -} From 94af656f17bac3598738b13487af107446658dd6 Mon Sep 17 00:00:00 2001 From: Rachel Date: Sun, 26 May 2024 18:50:12 -0700 Subject: [PATCH 30/34] Explicitly define Gengar's 3rd ability slot (Hidden Ability) (#4633) --- src/data/pokemon/species_info/gen_1_families.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 2f5d4f6ad1..a2f63f443d 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -9228,9 +9228,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_UPDATED_ABILITIES >= GEN_7 -#define GENGAR_ABILITIES {ABILITY_CURSED_BODY, ABILITY_NONE} +#define GENGAR_ABILITIES {ABILITY_CURSED_BODY, ABILITY_NONE, ABILITY_NONE} #else -#define GENGAR_ABILITIES {ABILITY_LEVITATE, ABILITY_NONE} +#define GENGAR_ABILITIES {ABILITY_LEVITATE, ABILITY_NONE, ABILITY_NONE} #endif [SPECIES_GENGAR] = From acd62b006560b096e39b09cf4ffc3e4557c7e310 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 27 May 2024 00:38:05 -0400 Subject: [PATCH 31/34] Reverted bad implementation of Sparkling Aria+Covert Cloak/Shield Dust (#4634) --- data/battle_scripts_1.s | 6 +++++ include/battle_scripts.h | 1 + src/battle_script_commands.c | 36 ++++++++++---------------- test/battle/ability/shield_dust.c | 2 ++ test/battle/item_effect/covert_cloak.c | 2 ++ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 8b2160cefc..a13aacea0c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7357,6 +7357,12 @@ BattleScript_TargetBurnHeal:: updatestatusicon BS_TARGET return +BattleScript_TargetPoisonHealed:: + printstring STRINGID_PASTELVEILENTERS + waitmessage B_WAIT_TIME_LONG + updatestatusicon BS_TARGET + return + BattleScript_MoveEffectSleep:: statusanimation BS_EFFECT_BATTLER printfromtable gFellAsleepStringIds diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 8674ee252f..d7b58ba11a 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -139,6 +139,7 @@ extern const u8 BattleScript_CurseTurnDmg[]; extern const u8 BattleScript_TargetPRLZHeal[]; extern const u8 BattleScript_TargetWokeUp[]; extern const u8 BattleScript_TargetBurnHeal[]; +extern const u8 BattleScript_TargetPoisonHealed[]; extern const u8 BattleScript_MoveEffectSleep[]; extern const u8 BattleScript_YawnMakesAsleep[]; extern const u8 BattleScript_MoveEffectPoison[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 01035e5c12..b2d9e8a152 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5406,7 +5406,6 @@ static void Cmd_moveend(void) u16 *choicedMoveAtk = NULL; u32 endMode, endState; u32 originallyUsedMove; - u8 currBattler, liveBattlerCount; if (gChosenMove == MOVE_UNAVAILABLE) originallyUsedMove = MOVE_NONE; @@ -5717,28 +5716,19 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr = BattleScript_TargetWokeUp; break; case STATUS1_BURN: - // Checks to see if Sparkling Aria should cure a Shield Dust pokemon - if (gBattleMons[gBattlerTarget].ability == ABILITY_SHIELD_DUST || gBattleMons[gBattlerTarget].item == ITEM_COVERT_CLOAK) - { - liveBattlerCount = 0; - for (currBattler = 0; currBattler < gBattlersCount; currBattler++) - { - if (gBattleMons[currBattler].hp != 0) - { - liveBattlerCount++; - } - } - if (liveBattlerCount > 2) - { - gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; - } - break; - } - else - { - gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; - break; - } + gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; + break; + case STATUS1_FREEZE: + gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; + break; + case STATUS1_FROSTBITE: + gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; + break; + case STATUS1_POISON: + case STATUS1_TOXIC_POISON: + case STATUS1_PSN_ANY: + gBattlescriptCurrInstr = BattleScript_TargetPoisonHealed; + break; } } break; // MOVE_EFFECT_REMOVE_STATUS diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index 11563151ad..ea6fbfb285 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -124,6 +124,7 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o DOUBLE_BATTLE_TEST("Shield Dust does or does not block Sparkling Aria depending on number of targets hit") { u32 moveToUse; + KNOWN_FAILING; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_TACKLE; } GIVEN { @@ -149,6 +150,7 @@ DOUBLE_BATTLE_TEST("Shield Dust does or does not block Sparkling Aria depending SINGLE_BATTLE_TEST("Shield Dust blocks Sparkling Aria in singles") { + KNOWN_FAILING; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_VIVILLON) { Ability(ABILITY_SHIELD_DUST); Status1(STATUS1_BURN); } diff --git a/test/battle/item_effect/covert_cloak.c b/test/battle/item_effect/covert_cloak.c index 76dec1c31c..fc9a59bbd0 100644 --- a/test/battle/item_effect/covert_cloak.c +++ b/test/battle/item_effect/covert_cloak.c @@ -122,6 +122,7 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending on number of targets hit") { u32 moveToUse; + KNOWN_FAILING; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_TACKLE; } GIVEN { @@ -147,6 +148,7 @@ DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending SINGLE_BATTLE_TEST("Covert Cloak blocks Sparkling Aria in singles") { + KNOWN_FAILING; GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); Status1(STATUS1_BURN); } From 767a1c79374c33d79c033a16186e50fc4976d814 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 27 May 2024 09:06:34 -0400 Subject: [PATCH 32/34] Version 1.8.4 (#4639) * Version 1.8.4 * Missing labels --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 4 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 4 +- CHANGELOG.md | 1 + README.md | 2 +- docs/changelogs/1.8.x/1.8.4.md | 174 ++++++++++++++++++ include/constants/expansion.h | 6 +- 7 files changed, 185 insertions(+), 9 deletions(-) create mode 100644 docs/changelogs/1.8.x/1.8.4.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index cdffd6838c..32a1ce2626 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.8.3 (Latest release) + - 1.8.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.8.3 - 1.8.2 - 1.8.1 - 1.8.0 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index bf31df9931..3e21436c1a 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -23,10 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.8.3 (Latest release) + - 1.8.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) - - 1.8.2 + - 1.8.3 - 1.8.1 - 1.8.0 - 1.7.4 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 6920d34a83..fcbf4b8884 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -23,10 +23,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using as a base? options: - - 1.8.3 (Latest release) + - 1.8.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) - - 1.8.2 + - 1.8.3 - 1.8.1 - 1.8.0 - 1.7.4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 8aeeac5dec..f513818cbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Pokeemerald-Expansion Changelogs ## 1.8.x +- ### [Version 1.8.4](docs/changelogs/1.8.x/1.8.4.md) - Bugfix Release 🧹 - ### [Version 1.8.3](docs/changelogs/1.8.x/1.8.3.md) - Bugfix Release 🧹 - ### [Version 1.8.2](docs/changelogs/1.8.x/1.8.2.md) - Bugfix Release 🧹 - ### [Version 1.8.1](docs/changelogs/1.8.x/1.8.1.md) - HOTFIX Release 🔥 diff --git a/README.md b/README.md index 855ddc7b7f..c567cd72d0 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,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.8.3, use `git pull RHH expansion/1.8.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.8.4, use `git pull RHH expansion/1.8.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/changelogs/1.8.x/1.8.4.md b/docs/changelogs/1.8.x/1.8.4.md new file mode 100644 index 0000000000..01e92a6c8a --- /dev/null +++ b/docs/changelogs/1.8.x/1.8.4.md @@ -0,0 +1,174 @@ +# Version 1.8.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.8.4`. +``` + +## 🌋 *IMPORTANT CHANGES* 🌋 +### ***[Reverted Guillotine feature branch](https://github.com/rh-hideout/pokeemerald-expansion/pull/4525)*** by @AsparagusEduardo: +* This was a runtime decapitalization branch introduced silently in version 1.8.0. We didn't properly announce as it was hastily merged and we were hoping that future versions of it would have fixed issues that we encountered after the merge. However, issues kept piling on and we felt the need to revert it as it was also silently breaking other features as well. +* ***We will work on an alternate decapitalization option in the future***. + +## 💥 *Softlock/Crash fixes* 💥 +* Fixed softlock caused by Destiny Bond triggering after Explosion by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4516 +* Fixed softlock caused by Future Sight trying to hit a fainted target by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4543 +* Fixed softlock caused by Galvanized Explosion being absorbed by Volt Absorb by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4601 +* Fixed softlock caused by Flinging a Razor Fang when the target had already moved by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4625 + +## 🧬 General 🧬 +### Fixed +* Fixed instances of Level Caps causing absurd amounts of Exp. by @Nopinou in https://github.com/rh-hideout/pokeemerald-expansion/pull/4505 +* Fixed `GetBoxMonData` evolution tracker reading garbage data if compiled with `agbcc` by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4510 +* Fixed potential Berry Tree mutation corruptions when compiling with `agbcc` by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4535 +* Added missing EOF newlines to `species_info` files by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4584 +* Fixed `EVO_MODE_BATTLE_SPECIAL` evolutions (only Sirfetch'd currently) triggering twice under certain situations by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4553 + * As a side effect, these evolutions no longer happen before other ones, instead being triggered in party order alongside `EVO_MODE_NORMAL`. + +## ✨ Feature Branches ✨ +### ***TheXaman's Debug Menu***: +#### Fixed +* Fixed abilities past ID 255 not being properly being given to Pokémon using the debug menu's Give Pokémon option by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4576 +### ***SBird/Karathan's Dynamic Multichoices***: +#### Changed +* Dynamic Multichoice no longer plays sound on init by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4480 +### ***TheXaman's HGSS Pokédex Plus***: +#### Fixed +* Multiple evolution page fixes by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4514 + * Fixed duplicate icons when 2 or more evolution methods share the same target species (eg. Magnezone evolution via Thunder Stone or Electromagnetic field). + * Fixed arrow not loading when there are multiple evolution methods to the same target species that hadn't been caught. + * Fixed wonky D-Pad inconsistency when scrolling down. + * Fixed regression from #3562 (1.7.0) that caused non-evolving Pokémon to not show their "X has no evolution" text. + * **Change from the original branch:** The message no longer shows for Pokémon that are part of an evolutionary family, even if they don't evolve themselves (eg. Venusaur). +* Added failsafe for Egg Groups without text defined by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4628 +### ***ghoulslash's Saveblock Cleansing***: +#### Changed +* Adjusted description of `FREE_MATCH_CALL` config to clarify that the VS Seeker also utilizes that data by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4590 + +## 🐉 Pokémon 🐉 +### Added +* Added missing Gen 9 and PLA footprints + update some footprints by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4621 + * Credits to Caruban for creating the sprites: eeveeexpo.com/resources/1101 https://eeveeexpo.com/resources/1101/ +### Changed +* Update various sprites to ones from PokeCommunity by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4554 +* Updated footprints to Gen 4/5 designs, being more accurate to their designs @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4621 + * Golem, Ludicolo, Shroomish and Mawile. + * Also updated Origin Giratina to have an empty footprint. +* Explicitly define Gengar's 3rd ability slot (Hidden Ability) by @lhearachel in https://github.com/rh-hideout/pokeemerald-expansion/pull/4633 +### Fixed +* Fixed animation errors by adding missing 2nd frames: + * Keldeo Resolute and Meloetta Pirouette by @TheJamesLJ in https://github.com/rh-hideout/pokeemerald-expansion/pull/4541 + * White-Striped Basculin and Neutral Xerneas @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4552 + * Summer, Autumn and Winter Sawsbuck by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4592 +* Fixed Unown B-Z and Punctuation Marks entry animations by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4546 +* Fixed Iron Hands and Iron Bundle incorrect backsprite palettes @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4552 +* Fixed transparent pixel in Mega Mewtwo Y's backsprite eye by @TheJamesLJ in https://github.com/rh-hideout/pokeemerald-expansion/pull/4541 +* Fixed floating Munkidori backsprite @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4552 +* Fixed Salandit's sprite and palettes by @BlueAnthem37510 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4614 +* Fixed regression from #4230 (1.8.0) that caused Mr. Mime's typing to ignore `P_UPDATED_TYPES` by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4547 +* Fixed silent Oricorio Pom-Pom cry by @cafei-uh in https://github.com/rh-hideout/pokeemerald-expansion/pull/4551 +* Fixed regression from #4360 (1.8.2) that caused Shaymin to changing form with the incorrect status + receiving damage upon form change by @TheJamesLJ in https://github.com/rh-hideout/pokeemerald-expansion/pull/4559 + +## ⚔️ Battle General ⚔️ ## +### Fixed +* Fixed Imposter and Transform causing the user to look shiny until screen is refreshed if they're not in the first party slot by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4486 +* Fixed regression in #4307 (1.8.2) that caused special battle types to not finish correctly by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/4536 +* Fixed multiple Speed ignoring effects by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4613 + * Fixed Quick Draw always outspeeding Quick Claw and Custap Berry. + * Fixed Myceleum Might always outspeeding Stall. + +## 🤹 Moves 🤹 +### Changed +* Ported Explosion/Mind Blown/Steel Beam implementation from CFRU (with tweaks) by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4516 +### Fixed +* Fixes Thief and Covet used by an opponent not stealing items by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4506 +* Fixed Substitute, Fillet Away, Shed Tail and Belly Drum missing their `HITMARKER_PASSIVE_DAMAGE`, which weretriggering effects where they shouldn't by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4533 + * Cleanup by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4629 +* Fixed Copycat issues by @PhallenTree in https://github.com/rh-hideout/pokeemerald-expansion/pull/4549 + * Copycat can no longer call Z-Moves. + * 2-turn moves no longer play their animation twice when called by Copycat. +* Fixed Substitute issues by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4558 + * The following secondary effects no longer occur if the target is behind a Substitute. + * Knock Off + * Salt Cure + * Smack Down/Thousand Arrows + * Wake-Up Slap/Smelling Salts/Sparkling Aria (including doubling in damage) +* Fixed move animations by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4560 + * Animations using `AnimTask_ShakeMonInPlace`: Last Resort,, Aqua Tail, Earth Power, Giga Impact, Zen Headbutt, Rock Climb, Stone Edge and Attack Order + * Animations using `AnimTask_HorizontalShake`: Sunsteel Strike and Chloroblast +* Fixed Future Sight/Doom Desire triggering Focus Sash but not consuming the item moves by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4625 + +## 🎭 Abilities 🎭 +### Fixed +* Fixed Gulp Missile not triggering before fainting by @BlueAnthem37510 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4502 +* Fixed Parental Bond converting Multi-Hit moves into in two-hit moves by @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4570 +* Fixed Magic Guard not preventing recoil damage by @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4578 +* Fixed Inner Focus, Scrappy, Oblivious and Own Temp granting immunity to all stat drops if the attacker has Intimidate by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4606 +* Fixed Moxie-like abilities not triggering when fainting the target with G-Max/Max Moves by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4625 + +## 🧶 Items 🧶 +### Added +* Added missing Stellar Tera Shard sprite by @kittenchilly in https://github.com/rh-hideout/pokeemerald-expansion/pull/4595 +### Fixed +* Fixed overflowing item descriptions for Dubious Disc and for Ice Beam and Blizzard TMs when `B_USE_FROSTBITE` is set to `TRUE` by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4540 +* Fixed plural of "Exp. Candy XL" by @Bassoonian in https://github.com/rh-hideout/pokeemerald-expansion/pull/4574 +* Fixed Elixir only being usable if the first move was missing PP by @hedara90 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4594 +* Fixed Full Restore not curing statuses when used on party member that's not in battle by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4603 +* Fixed Sceptilite using Tyranitarite's palette by @BlueAnthem37510 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4614 +* Fixed Dire Hit being used on incorrect targets by @cawtds in https://github.com/rh-hideout/pokeemerald-expansion/pull/4626 + +## 🤖 Battle AI 🤖 +### Changed +* AI is now aware that Dynamaxed targets are immune to Heat Crash's effect by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4521 +* AI now ignores resistances that don't actually apply when checking for bad moves by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4524 + * For example: Super Fang, Counter and Endeavor. +* Stat stage related AI improvements by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4548 + * Contrary is now properly checked. + * Some evasion and accuracy checks that were incorrectly handled are now fixed. +* Updated AI scores for Status moves that Dynamax Pokémon are immune to by @WillKolada in https://github.com/rh-hideout/pokeemerald-expansion/pull/4523 + * Roar, One-Hit KO moves, Disable, Encore, Torment, Destiny Bond, Skill Swap, Entrainment, Instruct and Skill Swappokeemerald-expansion/pull/4518 +### Fixed +* Various AI switching logic fixes by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4571 + * Weather-based healing was treated as damage + * Damage and healing from multiple sources overwrote each other + * Utility Umbrella and Magic Guard were ignored. + * Max G-Steelsurge was ignored. + * Sitrus Berry's Gen 4+ effect was ignored. + * Removed item ID hardcoding for confuse berries. +* Various AI switching logic fixes Part 2 by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4572 + * AI now calculates damage from the badly poisoned status. + * AI now removes weather damage from current AI instead of adding it. + * Cleanup for #4571 +* AI respects partner when using spread moves in double battles by @AlexOn1ine in https://github.com/rh-hideout/ +* Fixed AI not properly reading that Belch could be used after eating a berry by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4616 + +## 🧹 Other Cleanup 🧹 +### Fixed +* Fixed `BS_SetGlaiveRush` formatting by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4610 + +## 🧪 Test Runner 🧪 +### Added +* Added tests to verify Parental Bond doesn't affect `EFFECT_MULTI_HIT` moves by @iriv24 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4573 +* Added missing Move Effect TODO tests - Volume A by @AsparagusEduardo in https://github.com/rh-hideout/pokeemerald-expansion/pull/4569 + * Handles all `EFFECTS_x` that start with A, other effects will follow. Once all TODO tests are added, tests can begin to be written to assure that all current functionalities are fully functional. +### Fixed +* Fixed incorrect Quick Claw test name by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4613 + +## 📦 Pret merges 📦 +* Pre-1.8.4 pret merge (2024/05/26) (v2) by @SBird1337 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4637 + * Fix poison projectile array being incorrectly combined into three separate arrays by @NTx86 in https://github.com/pret/pokeemerald/pull/1989 + * Fix hoenn pokedex palette being split in two by @NTx86 in https://github.com/pret/pokeemerald/pull/1990 + * Fix Pokeblock script missing a releaseall by @Jaizu in https://github.com/pret/pokeemerald/pull/1996 + * Fix Pokeblock script missing a releaseall by @Jaizu in https://github.com/pret/pokeemerald/pull/1996 + * Make AdjustFriendship more readable by @Jaizu in https://github.com/pret/pokeemerald/pull/1995 + * Move POKE_ICON_BASE_PAL_TAG to a header by @Sneed69 in https://github.com/pret/pokeemerald/pull/1998 + +## New Contributors +* @BlueAnthem37510 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4502 +* @TheJamesLJ made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4541 +* @iriv24 made their first contribution in https://github.com/rh-hideout/pokeemerald-expansion/pull/4570 + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.8.3...expansion/1.8.4 + + \ No newline at end of file diff --git a/include/constants/expansion.h b/include/constants/expansion.h index e1e228fd9b..1ce40b441a 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 -// 1.8.3 +// 1.8.4 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 8 -#define EXPANSION_VERSION_PATCH 3 +#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 680c5581d4a2572cc336bb9e7107d2793d5baf56 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 27 May 2024 09:14:35 -0400 Subject: [PATCH 33/34] Fixed changelog inaccuracy --- docs/changelogs/1.8.x/1.8.4.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelogs/1.8.x/1.8.4.md b/docs/changelogs/1.8.x/1.8.4.md index 01e92a6c8a..09daf973c7 100644 --- a/docs/changelogs/1.8.x/1.8.4.md +++ b/docs/changelogs/1.8.x/1.8.4.md @@ -93,7 +93,7 @@ * Knock Off * Salt Cure * Smack Down/Thousand Arrows - * Wake-Up Slap/Smelling Salts/Sparkling Aria (including doubling in damage) + * Wake-Up Slap/Smelling Salts, including doubling in damage, unless they have the `ignoresSubstitute` like Sparkling Aria. * Fixed move animations by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4560 * Animations using `AnimTask_ShakeMonInPlace`: Last Resort,, Aqua Tail, Earth Power, Giga Impact, Zen Headbutt, Rock Climb, Stone Edge and Attack Order * Animations using `AnimTask_HorizontalShake`: Sunsteel Strike and Chloroblast From 069161b71649e486290072b052cb536f1805c19e Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 27 May 2024 09:31:06 -0400 Subject: [PATCH 34/34] Untag release --- 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 1ce40b441a..43afdbe212 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